X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=5ae25d42f5d6f54f8a972720ddde9db7a6405125;hb=bf1bc6845e0a56e0ad1aea85ebea58cb0ce8b5fb;hp=f6274bbc629167a9fa163ec4de7f8e72ec78f031;hpb=b8573ee9e8a629c9a19f614ca3c4d64c93901eab;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index f6274bb..5ae25d4 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -55,7 +55,13 @@ static char* swffilename = 0; static int numpages; static int currentpage; -static char*fonts[2048]; +typedef struct _fontfile +{ + char*filename; + int used; +} fontfile_t; + +static fontfile_t fonts[2048]; static int fontnum = 0; // swf <-> pdf pages @@ -226,7 +232,7 @@ public: GfxState *laststate; }; -char*getFontName(GfxFont*font) +static char*getFontID(GfxFont*font) { GString*gstr = font->getName(); char* fontname = gstr==0?0:gstr->getCString(); @@ -236,6 +242,12 @@ char*getFontName(GfxFont*font) sprintf(buf, "UFONT%d", r->num); return strdup(buf); } + return fontname; +} + +static char*getFontName(GfxFont*font) +{ + char*fontname = getFontID(font); char* plus = strchr(fontname, '+'); if(plus && plus < &fontname[strlen(fontname)-1]) fontname = plus+1; @@ -321,8 +333,8 @@ char* gfxstate2str(GfxState *state) if(state->getLineJoin()!=0) bufpos+=sprintf(bufpos,"ML%d ", state->getMiterLimit()); - if(state->getFont() && getFontName(state->getFont())) - bufpos+=sprintf(bufpos,"F\"%s\" ",getFontName(state->getFont())); + if(state->getFont() && getFontID(state->getFont())) + bufpos+=sprintf(bufpos,"F\"%s\" ",getFontID(state->getFont())); bufpos+=sprintf(bufpos,"FS%.1f ", state->getFontSize()); bufpos+=sprintf(bufpos,"MAT[%.1f/%.1f/%.1f/%.1f/%.1f/%.1f] ", state->getTextMat()[0],state->getTextMat()[1],state->getTextMat()[2], state->getTextMat()[3],state->getTextMat()[4],state->getTextMat()[5]); @@ -380,41 +392,41 @@ void showFontError(GfxFont*font, int nr) void dumpFontInfo(char*loglevel, GfxFont*font) { - char* name = getFontName(font); + char* name = getFontID(font); Ref* r=font->getID(); - msg("%s=========== %s (ID:%d,%d) ==========\n", loglevel, name, r->num,r->gen); + msg("%s=========== %s (ID:%d,%d) ==========\n", loglevel, getFontName(font), r->num,r->gen); GString*gstr = font->getTag(); - msg("%sTag: %s\n", loglevel, name); + msg("%s| Tag: %s\n", loglevel, name); - if(font->isCIDFont()) msg("%sis CID font\n", loglevel); + if(font->isCIDFont()) msg("%s| is CID font\n", loglevel); GfxFontType type=font->getType(); switch(type) { case fontUnknownType: - msg("%sType: unknown\n",loglevel); + msg("%s| Type: unknown\n",loglevel); break; case fontType1: - msg("%sType: 1\n",loglevel); + msg("%s| Type: 1\n",loglevel); break; case fontType1C: - msg("%sType: 1C\n",loglevel); + msg("%s| Type: 1C\n",loglevel); break; case fontType3: - msg("%sType: 3\n",loglevel); + msg("%s| Type: 3\n",loglevel); break; case fontTrueType: - msg("%sType: TrueType\n",loglevel); + msg("%s| Type: TrueType\n",loglevel); break; case fontCIDType0: - msg("%sType: CIDType0\n",loglevel); + msg("%s| Type: CIDType0\n",loglevel); break; case fontCIDType0C: - msg("%sType: CIDType0C\n",loglevel); + msg("%s| Type: CIDType0C\n",loglevel); break; case fontCIDType2: - msg("%sType: CIDType2\n",loglevel); + msg("%s| Type: CIDType2\n",loglevel); break; } @@ -423,18 +435,18 @@ void dumpFontInfo(char*loglevel, GfxFont*font) if(font->getEmbeddedFontName()) name = font->getEmbeddedFontName()->getCString(); if(embedded) - msg("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); + msg("%s| Embedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); gstr = font->getExtFontFile(); if(gstr) - msg("%sExternal Font file: %s\n", loglevel, FIXNULL(gstr->getCString())); + msg("%s| External Font file: %s\n", loglevel, FIXNULL(gstr->getCString())); // Get font descriptor flags. - if(font->isFixedWidth()) msg("%sis fixed width\n", loglevel); - if(font->isSerif()) msg("%sis serif\n", loglevel); - if(font->isSymbolic()) msg("%sis symbolic\n", loglevel); - if(font->isItalic()) msg("%sis italic\n", loglevel); - if(font->isBold()) msg("%sis bold\n", loglevel); + if(font->isFixedWidth()) msg("%s| is fixed width\n", loglevel); + if(font->isSerif()) msg("%s| is serif\n", loglevel); + if(font->isSymbolic()) msg("%s| is symbolic\n", loglevel); + if(font->isItalic()) msg("%s| is italic\n", loglevel); + if(font->isBold()) msg("%s| is bold\n", loglevel); } //void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) {printf("void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) \n");} @@ -617,12 +629,11 @@ SWFOutputDev::~SWFOutputDev() }; GBool SWFOutputDev::upsideDown() { - msg(" upsidedown?"); + msg(" upsidedown? yes"); return gTrue; }; GBool SWFOutputDev::useDrawChar() { - msg(" usedrawchar?"); return gTrue; } @@ -660,8 +671,6 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, if(_u) u = *_u; - msg(" drawChar(%f,%f,%f,%f,c='%c' (%d),u=%d <%d>) CID=%d\n",x,y,dx,dy,c,c,u, uLen, font->isCIDFont()); - /* find out the character name */ char*name=0; if(font->isCIDFont() && u) { @@ -681,13 +690,13 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, if(enc && enc[c]) name = enc[c]; } + + msg(" drawChar(%f,%f,c='%c' (%d),u=%d <%d>) CID=%d name=\"%s\"\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name)); int ret = swfoutput_drawchar(&output, x1, y1, name, c, u); } -void SWFOutputDev::endString(GfxState *state) -{ - msg(" endstring\n"); +void SWFOutputDev::endString(GfxState *state) { } @@ -710,18 +719,25 @@ void SWFOutputDev::endType3Char(GfxState *state) void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2) { double x1,y1,x2,y2; + int rot = doc->getPageRotate(1); laststate = state; msg(" startPage %d (%f,%f,%f,%f)\n", pageNum, crop_x1, crop_y1, crop_x2, crop_y2); + if(rot!=0) + msg(" page is rotated %d degrees\n", rot); + msg(" processing page %d", pageNum); /* state->transform(state->getX1(),state->getY1(),&x1,&y1); state->transform(state->getX2(),state->getY2(),&x2,&y2); Use CropBox, not MediaBox, as page size */ - x1 = crop_x1; + + /*x1 = crop_x1; y1 = crop_y1; x2 = crop_x2; - y2 = crop_y2; + y2 = crop_y2;*/ + state->transform(crop_x1,crop_y1,&x1,&y1); + state->transform(crop_x2,crop_y2,&x2,&y2); if(x2 SearchT1Font(%s)", name); + msg(" SearchFont(%s)", name); /* see if it is a pdf standard font */ for(i=0;i Using %s for %s", fonts[i].filename, name); + } + return fonts[i].filename; } } return 0; @@ -992,6 +1016,13 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) msg(" Couldn't create temporary Type 1 font file"); return 0; } + + /*if(font->isCIDFont()) { + GfxCIDFont* cidFont = (GfxCIDFont *)font; + GString c = cidFont->getCollection(); + msg(" Collection: %s", c.getCString()); + }*/ + if (font->getType() == fontType1C || font->getType() == fontCIDType0C) { if (!(fontBuf = font->readEmbFontFile(xref, &fontLen))) { @@ -1001,6 +1032,8 @@ char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) } Type1CFontFile *cvt = new Type1CFontFile(fontBuf, fontLen); cvt->convertToType1(f); + //cvt->convertToCIDType0("test", f); + //cvt->convertToType0("test", f); delete cvt; gfree(fontBuf); } else if(font->getType() == fontTrueType) { @@ -1118,26 +1151,26 @@ void SWFOutputDev::updateFont(GfxState *state) if (!gfxFont) { return; } - char * fontname = getFontName(gfxFont); + char * fontid = getFontID(gfxFont); int t; /* first, look if we substituted this font before- this way, we don't initialize the T1 Fonts too often */ for(t=0;t updateFont(%s) [cached]", fontname); + msg(" updateFont(%s) [cached]", fontid); return; } @@ -1156,8 +1189,8 @@ void SWFOutputDev::updateFont(GfxState *state) int del = 0; if(embedded && (gfxFont->getType() == fontType1 || - gfxFont->getType() == fontCIDType0C || gfxFont->getType() == fontType1C || + //gfxFont->getType() == fontCIDType0C || gfxFont->getType() == fontTrueType || gfxFont->getType() == fontCIDType2 )) @@ -1166,21 +1199,27 @@ void SWFOutputDev::updateFont(GfxState *state) if(!fileName) showFontError(gfxFont,0); else del = 1; } else { + char * fontname = getFontName(gfxFont); fileName = searchFont(fontname); if(!fileName) showFontError(gfxFont,0); } - if(!fileName) - fileName = substituteFont(gfxFont, fontname); + if(!fileName) { + char * fontname = getFontName(gfxFont); + msg(" Font %s could not be loaded.", fontname); + msg(" Try putting a TTF version of that font (named \"%s.ttf\") into /swftools/fonts", fontname); + fileName = substituteFont(gfxFont, fontid); + } if(!fileName) { - msg(" Couldn't set font %s\n", fontname); + msg(" Couldn't set font %s\n", fontid); return; } - msg(" updateFont(%s) -> %s", fontname, fileName); + msg(" updateFont(%s) -> %s", fontid, fileName); + dumpFontInfo("", gfxFont); - swfoutput_setfont(&output, fontname, fileName); - + swfoutput_setfont(&output, fontid, fileName); + if(fileName && del) unlinkfont(fileName); } @@ -1609,15 +1648,9 @@ void pdfswf_init(char*filename, char*userPassword) } } info.free(); - + numpages = doc->getNumPages(); if (doc->isEncrypted()) { - /*ERROR: This pdf is encrypted, and disallows copying. - Due to the DMCA, paragraph 1201, (2) A-C, circumventing - a technological measure that efficively controls access to - a protected work is violating American law. - See www.eff.org for more information about DMCA issues. - */ if(!doc->okToCopy()) { printf("PDF disallows copying. Bailing out.\n"); exit(1); //bail out @@ -1672,7 +1705,10 @@ void pdfswf_setparameter(char*name, char*value) void pdfswf_addfont(char*filename) { - fonts[fontnum++] = filename; + fontfile_t f; + memset(&f, 0, sizeof(fontfile_t)); + f.filename = filename; + fonts[fontnum++] = f; } void pdfswf_drawonlyshapes()