X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=00499a91984e1abcf1b8d2b6232241fbc014be2e;hb=0703a05cbcae0bec44d6f6cb6f2ec7910559f7bf;hp=23cb0c361d0d19a36b6172757f716fe77ccb5e53;hpb=cbed1e057fe9ac1422573371f20f9416b218effe;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 23cb0c3..00499a9 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -23,6 +23,12 @@ #include #include #include "../config.h" +#ifdef HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif #ifdef HAVE_FONTCONFIG_H #include #endif @@ -104,8 +110,8 @@ struct mapping { {"ZapfDingbats", "d050000l"}}; class SWFOutputDev: public OutputDev { - struct swfoutput output; int outputstarted; + struct swfoutput output; public: // Constructor. @@ -117,7 +123,9 @@ public: 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 @@ -341,6 +349,13 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2) 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) { @@ -685,7 +700,7 @@ void SWFOutputDev::stroke(GfxState *state) 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(" stroke\n"); dump_outline(outline); } @@ -721,7 +736,7 @@ void SWFOutputDev::fill(GfxState *state) 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(" fill\n"); dump_outline(outline); } @@ -738,7 +753,7 @@ void SWFOutputDev::eoFill(GfxState *state) 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(" eofill\n"); dump_outline(outline); } @@ -756,7 +771,7 @@ void SWFOutputDev::clip(GfxState *state) m.m13 = 0; m.m23 = 0; SWF_OUTLINE*outline = gfxPath_to_SWF_OUTLINE(state, path); - if(screenloglevel >= LOGLEVEL_TRACE) { + if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" clip\n"); dump_outline(outline); } @@ -773,7 +788,7 @@ void SWFOutputDev::eoClip(GfxState *state) 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(" eoclip\n"); dump_outline(outline); } @@ -782,9 +797,9 @@ void SWFOutputDev::eoClip(GfxState *state) 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() @@ -1894,10 +1909,13 @@ static void printInfoDate(Dict *infoDict, char *key, char *fmt) { void pdfswf_setparameter(char*name, char*value) { + msg(" 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); } @@ -1914,6 +1932,54 @@ void pdfswf_addfont(char*filename) } } +void pdfswf_addfontdir(char*dirname) +{ +#ifdef HAVE_DIRENT_H + msg(" Adding %s to font directories", dirname); + DIR*dir = opendir(dirname); + if(!dir) { + msg(" 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(" Adding %s to fonts", fontname); + pdfswf_addfont(fontname); + } + } + closedir(dir); +#else + msg(" No dirent.h- unable to add font dir %s"); +#endif +} + + typedef struct _pdf_doc_internal { int protect; @@ -1959,7 +2025,7 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) // 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"); @@ -1987,8 +2053,8 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) 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; @@ -2078,10 +2144,12 @@ void swf_output_setparameter(swf_output_t*swf_output, char*name, char*value) 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) @@ -2092,10 +2160,10 @@ 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"); @@ -2106,6 +2174,7 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*output) #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)