#include <string.h>
#include <unistd.h>
#include "../config.h"
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
#ifdef HAVE_FONTCONFIG_H
#include <fontconfig.h>
#endif
{"ZapfDingbats", "d050000l"}};
class SWFOutputDev: public OutputDev {
- struct swfoutput output;
int outputstarted;
+ struct swfoutput output;
public:
// Constructor.
void setMove(int x,int y);
void setClip(int x1,int y1,int x2,int y2);
- void save(char*filename);
+ int save(char*filename);
+
+ void getDimensions(int*x1,int*y1,int*x2,int*y2);
//----- get info about output device
this->user_clipx2 = x2;
this->user_clipy2 = y2;
}
+void SWFOutputDev::getDimensions(int*x1,int*y1,int*x2,int*y2)
+{
+ if(x1) *x1 = output.swf.movieSize.xmin/20;
+ if(y1) *y1 = output.swf.movieSize.ymin/20;
+ if(x2) *x2 = output.swf.movieSize.xmax/20;
+ if(y2) *y2 = output.swf.movieSize.ymax/20;
+}
static char*getFontID(GfxFont*font)
{
m.m12 = 0; m.m13 = 0; m.m23 = 0;
SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
- if(screenloglevel >= LOGLEVEL_TRACE) {
+ if(getLogLevel() >= LOGLEVEL_TRACE) {
msg("<trace> stroke\n");
dump_outline(outline);
}
m.m12 = 0; m.m13 = 0; m.m23 = 0;
SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
- if(screenloglevel >= LOGLEVEL_TRACE) {
+ if(getLogLevel() >= LOGLEVEL_TRACE) {
msg("<trace> fill\n");
dump_outline(outline);
}
m.m12 = 0; m.m13 = 0; m.m23 = 0;
SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
- if(screenloglevel >= LOGLEVEL_TRACE) {
+ if(getLogLevel() >= LOGLEVEL_TRACE) {
msg("<trace> eofill\n");
dump_outline(outline);
}
m.m13 = 0; m.m23 = 0;
SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
- if(screenloglevel >= LOGLEVEL_TRACE) {
+ if(getLogLevel() >= LOGLEVEL_TRACE) {
msg("<trace> clip\n");
dump_outline(outline);
}
m.m12 = 0; m.m13 = 0; m.m23 = 0;
SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path);
- if(screenloglevel >= LOGLEVEL_TRACE) {
+ if(getLogLevel() >= LOGLEVEL_TRACE) {
msg("<trace> eoclip\n");
dump_outline(outline);
}
clipping[clippos] ++;
free_outline(outline);
}
-void SWFOutputDev::save(char*filename)
+int SWFOutputDev::save(char*filename)
{
- swfoutput_save(&output, filename);
+ return swfoutput_save(&output, filename);
}
SWFOutputDev::~SWFOutputDev()
void pdfswf_setparameter(char*name, char*value)
{
+ msg("<verbose> setting parameter %s to \"%s\"", name, value);
if(!strcmp(name, "caplinewidth")) {
caplinewidth = atof(value);
} else if(!strcmp(name, "zoom")) {
zoom = atoi(value);
+ } else if(!strcmp(name, "fontdir")) {
+ pdfswf_addfontdir(value);
} else {
swfoutput_setparameter(name, value);
}
}
}
+void pdfswf_addfontdir(char*dirname)
+{
+#ifdef HAVE_DIRENT_H
+ DIR*dir = opendir(dirname);
+ if(!dir) {
+ msg("<warning> Couldn't open directory %s\n", dirname);
+ return;
+ }
+ struct dirent*ent;
+ while(1) {
+ ent = readdir (dir);
+ if (!ent)
+ break;
+ int l;
+ char*name = ent->d_name;
+ char type = 0;
+ if(!name) continue;
+ l=strlen(name);
+ if(l<4)
+ continue;
+ if(!strncasecmp(&name[l-4], ".pfa", 4))
+ type=1;
+ if(!strncasecmp(&name[l-4], ".pfb", 4))
+ type=3;
+ if(!strncasecmp(&name[l-4], ".ttf", 4))
+ type=2;
+ if(type)
+ {
+ char*fontname = (char*)malloc(strlen(dirname)+strlen(name)+2);
+ strcpy(fontname, dirname);
+#ifdef WIN32
+ strcat(fontname, "\\");
+#else
+ strcat(fontname, "/");
+#endif
+ strcat(fontname, name);
+ msg("<debug> Adding %s to fonts", fontname);
+ pdfswf_addfont(fontname);
+ }
+ }
+ closedir(dir);
+#else
+ msg("<warning> No dirent.h- unable to add font dir %s");
+#endif
+}
+
+
typedef struct _pdf_doc_internal
{
int protect;
// print doc info
i->doc->getDocInfo(&info);
if (info.isDict() &&
- (screenloglevel>=LOGLEVEL_NOTICE)) {
+ (getScreenLogLevel()>=LOGLEVEL_NOTICE)) {
printInfoString(info.getDict(), "Title", "Title: %s\n");
printInfoString(info.getDict(), "Subject", "Subject: %s\n");
printInfoString(info.getDict(), "Keywords", "Keywords: %s\n");
i->protect = 0;
if (i->doc->isEncrypted()) {
if(!i->doc->okToCopy()) {
- printf("PDF disallows copying. Terminating.\n");
- exit(1); //bail out
+ printf("PDF disallows copying.\n");
+ return 0;
}
if(!i->doc->okToChange() || !i->doc->okToAddNotes())
i->protect = 1;
pdfswf_setparameter(name, value);
}
-void swf_output_save(swf_output_t*swf, char*filename)
+int swf_output_save(swf_output_t*swf, char*filename)
{
swf_output_internal_t*i= (swf_output_internal_t*)swf->internal;
- i->outputDev->save(filename);
+ int ret = i->outputDev->save(filename);
+ i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2);
+ return ret;
}
void swf_output_destroy(swf_output_t*output)
free(output);
}
-void pdf_page_render2(pdf_page_t*page, swf_output_t*output)
+void pdf_page_render2(pdf_page_t*page, swf_output_t*swf)
{
pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal;
- swf_output_internal_t*si = (swf_output_internal_t*)output->internal;
+ swf_output_internal_t*si = (swf_output_internal_t*)swf->internal;
if(pi->protect) {
swfoutput_setparameter("protect", "1");
#else
pi->doc->displayPage((OutputDev*)si->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, /*doLinks*/(int)1);
#endif
+ si->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2);
}
void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, int x1, int y1, int x2, int y2)