X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=6af41024cb1fae099ab5facb6ea714980e097fc5;hb=d78d39d495201b40537d2c38d42ab34c60467865;hp=e32a293179504d7cfd6646518c277b9cd9232df4;hpb=fb28b953a31d3b3fc0d38e6b5d884ab6f8244918;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index e32a293..6af4102 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -23,6 +23,7 @@ #include #include //xpdf header files +#include "gfile.h" #include "GString.h" #include "gmem.h" #include "Object.h" @@ -44,6 +45,7 @@ #include "swfoutput.h" extern "C" { #include "../lib/log.h" +#include "ttf2pt1.h" } static PDFDoc*doc = 0; @@ -189,12 +191,14 @@ public: int clipping[64]; int clippos; - int setT1Font(char*name,FontEncoding*enc); - char* substitutefont(GfxFont*gfxFont); + int searchT1Font(char*name); + char* substituteFont(GfxFont*gfxFont, char*oldname); + char* writeEmbeddedFontToFile(GfxFont*font); int t1id; int jpeginfo; // did we write "File contains jpegs" yet? int pbminfo; // did we write "File contains jpegs" yet? int linkinfo; // did we write "File contains links" yet? + int ttfinfo; // did we write "File contains TrueType Fonts" yet? GfxState *laststate; }; @@ -330,7 +334,6 @@ void showFontError(GfxFont*font, int nr) logf(" The following font caused problems (substituting):"); else if(nr == 2) logf(" This document contains Type 3 Fonts: (some text may be incorrectly displayed)"); - dumpFontInfo("", font); } @@ -393,6 +396,7 @@ void dumpFontInfo(char*loglevel, GfxFont*font) SWFOutputDev::SWFOutputDev() { jpeginfo = 0; + ttfinfo = 0; linkinfo = 0; pbminfo = 0; clippos = 0; @@ -405,7 +409,7 @@ T1_OUTLINE* gfxPath_to_T1_OUTLINE(GfxState*state, GfxPath*path) { int num = path->getNumSubpaths(); int s,t; - bezierpathsegment*start,*last; + bezierpathsegment*start,*last=0; bezierpathsegment*outline = start = new bezierpathsegment(); int cpos = 0; double lastx=0,lasty=0; @@ -544,7 +548,7 @@ void SWFOutputDev::beginString(GfxState *state, GString *s) state->getFontTransMat(&m11, &m12, &m21, &m22); m11 *= state->getHorizScaling(); m21 *= state->getHorizScaling(); - swfoutput_setfontmatrix(&output, m11, -m12, m21, -m22); + swfoutput_setfontmatrix(&output, m11, -m21, m12, -m22); } int charcounter = 0; @@ -562,7 +566,7 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, doub state->transform(x, y, &x1, &y1); if(enc->getCharName(c)) - swfoutput_drawchar(&output, x1, y1, enc->getCharName(c)); + swfoutput_drawchar(&output, x1, y1, enc->getCharName(c), c); else logf(" couldn't get name for character %02x from Encoding", c); } @@ -627,6 +631,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) char*s = "-?-"; char*type = "-?-"; char*url = 0; + char*named = 0; int page = -1; switch(action->getKind()) { @@ -662,6 +667,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) GString*name = l->getName(); if(name) { s = name->lowerCase()->getCString(); + named = name->getCString(); if(strstr(s, "next") || strstr(s, "forward")) { page = currentpage + 1; @@ -728,6 +734,10 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { swfoutput_linktourl(&output, url, points); } + else if(named) + { + swfoutput_namedlink(&output, named, points); + } logf(" \"%s\" link to \"%s\" (%d)\n", type, s, page); } } @@ -754,7 +764,7 @@ void SWFOutputDev::restoreState(GfxState *state) { char type3Warning=0; -int SWFOutputDev::setT1Font(char*name, FontEncoding*encoding) +int SWFOutputDev::searchT1Font(char*name) { int i; @@ -779,11 +789,7 @@ int SWFOutputDev::setT1Font(char*name, FontEncoding*encoding) pdf2t1map[i].id = mapid; } } - if(id<0) - return 0; - - this->t1id = id; - return 1; + return id; } void SWFOutputDev::updateLineWidth(GfxState *state) @@ -812,10 +818,9 @@ void SWFOutputDev::updateStrokeColor(GfxState *state) (char)(rgb.b*255), (char)(opaq*255)); } -char*writeEmbeddedFontToFile(GfxFont*font) +char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) { char*tmpFileName = NULL; - char*fileName = NULL; FILE *f; int c; char *fontBuf; @@ -854,12 +859,26 @@ char*writeEmbeddedFontToFile(GfxFont*font) strObj.free(); } fclose(f); - fileName = tmpFileName; - if(!fileName) { - logf(" Embedded font writer didn't create a file"); - return 0; + + if(font->getType() == fontTrueType) + { + if(!ttfinfo) { + logf(" File contains TrueType fonts"); + ttfinfo = 1; + } + char name2[80]; + char*tmp; + tmp = strdup(mktmpname((char*)name2)); + sprintf(name2, "%s", tmp); + char*a[] = {"./ttf2pt1","-pttf","-b", tmpFileName, name2}; + logf(" Invoking ttf2pt1..."); + ttf2pt1_main(5,a); + unlink(tmpFileName); + sprintf(name2,"%s.pfb",tmp); + tmpFileName = strdup(name2); } - return fileName; + + return tmpFileName; } char* gfxFontName(GfxFont* gfxFont) @@ -877,7 +896,11 @@ char* gfxFontName(GfxFont* gfxFont) } } -char* SWFOutputDev::substitutefont(GfxFont*gfxFont) +char* substitutetarget[256]; +char* substitutesource[256]; +int substitutepos = 0; + +char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) { //substitute font char* fontname = 0; @@ -950,28 +973,72 @@ char* SWFOutputDev::substitutefont(GfxFont*gfxFont) } } } - if(fontname) - setT1Font(fontname, gfxFont->getEncoding()); + if(fontname) { + this->t1id = searchT1Font(fontname); + } + if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) { + logf(" Too many fonts in file."); + exit(1); + } + if(oldname) { + substitutesource[substitutepos] = oldname; + substitutetarget[substitutepos] = fontname; + logf(" substituting %s -> %s", oldname, fontname); + substitutepos ++; + } return fontname; } +void unlinkfont(char* filename) +{ + int l; + if(!filename) + return; + l=strlen(filename); + unlink(filename); + if(!strncmp(&filename[l-4],".afm",4)) { + memcpy(&filename[l-4],".pfb",4); + unlink(filename); + memcpy(&filename[l-4],".pfa",4); + unlink(filename); + memcpy(&filename[l-4],".afm",4); + return; + } else + if(!strncmp(&filename[l-4],".pfa",4)) { + memcpy(&filename[l-4],".afm",4); + unlink(filename); + memcpy(&filename[l-4],".pfa",4); + return; + } else + if(!strncmp(&filename[l-4],".pfb",4)) { + memcpy(&filename[l-4],".afm",4); + unlink(filename); + memcpy(&filename[l-4],".pfb",4); + return; + } +} + void SWFOutputDev::updateFont(GfxState *state) { - char * fontname = 0; GfxFont*gfxFont = state->getFont(); char * fileName = 0; if (!gfxFont) { return; } - - if(gfxFont->getName()) { - fontname = gfxFont->getName()->getCString(); + char * fontname = gfxFontName(gfxFont); + + int t; + for(t=0;tis16Bit() && (gfxFont->getType() == fontType1 || - gfxFont->getType() == fontType1C)) { + gfxFont->getType() == fontType1C || + gfxFont->getType() == fontTrueType)) { fileName = writeEmbeddedFontToFile(gfxFont); - if(!fileName) + if(!fileName) { + logf(" Couldn't write font to file"); + showFontError(gfxFont,0); return ; + } this->t1id = T1_AddFont(fileName); + if(this->t1id<0) { + logf(" Couldn't load font from file"); + showFontError(gfxFont,0); + unlinkfont(fileName); + return ; + } } else { showFontError(gfxFont,0); - fontname = substitutefont(gfxFont); + fontname = substituteFont(gfxFont, fontname); } } else { - if(!fontname || !setT1Font(state->getFont()->getName()->getCString(), gfxFont->getEncoding())) - fontname = substitutefont(gfxFont); + if(fontname) { + int newt1id = searchT1Font(fontname); + if(newt1id<0) { + fontname = substituteFont(gfxFont, fontname); + } else + this->t1id = newt1id; + } + else + fontname = substituteFont(gfxFont, fontname); } - swfoutput_setfont(&output,gfxFontName(gfxFont),this->t1id, fileName); + if(t1id<0) { + showFontError(gfxFont,0); + return; + } + + /* we may have done some substitutions here, so check + again if this font is cached. */ + if(swfoutput_queryfont(&output, fontname)) + { + swfoutput_setfont(&output, fontname, -1, 0); + return; + } + + logf(" Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, fileName, fontname); + swfoutput_setfont(&output, fontname, this->t1id, fileName); if(fileName) - unlink(fileName); + unlinkfont(fileName); } int pic_xids[1024]; @@ -1047,7 +1145,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, if (str->getKind() == strDCT && (colorMap->getNumPixelComps() == 3 || !mask) ) { - sprintf(fileName, "/tmp/tmp%08x.jpg",lrand48()); + sprintf(fileName, "%s.jpg",mktmpname(0)); logf(" Found jpeg. Temporary storage is %s", fileName); if(!jpeginfo) { @@ -1104,7 +1202,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, if(mask) { imgStr = new ImageStream(str, width, 1, 1); imgStr->reset(); - return; + //return; int yes=0,i,j; unsigned char buf[8]; int xid = 0; @@ -1436,7 +1534,7 @@ void pdfswf_performconversion() for(t=0;tdisplayPage((OutputDev*)output, currentpage, /*zoom*/100, /*rotate*/0, /*doLinks*/(int)1); + doc->displayPage((OutputDev*)output, currentpage, /*dpi*/72, /*rotate*/0, /*doLinks*/(int)1); } }