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
GfxState *laststate;
};
-char*getFontName(GfxFont*font)
+static char*getFontID(GfxFont*font)
{
GString*gstr = font->getName();
char* fontname = gstr==0?0:gstr->getCString();
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;
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]);
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;
}
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");}
};
GBool SWFOutputDev::upsideDown()
{
- msg("<debug> upsidedown?");
+ msg("<debug> upsidedown? yes");
return gTrue;
};
GBool SWFOutputDev::useDrawChar()
{
- msg("<debug> usedrawchar?");
return gTrue;
}
m11 *= state->getHorizScaling();
m21 *= state->getHorizScaling();
swfoutput_setfontmatrix(&output, m11, -m21, m12, -m22);
+
+ msg("<debug> fontmatrix %7.3f %7.3f\n", m11,-m21);
+ msg("<debug> fontmatrix %7.3f %7.3f\n", m12,-m22);
}
void SWFOutputDev::drawChar(GfxState *state, double x, double y,
if(_u)
u = *_u;
- msg("<debug> 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) {
if(enc && enc[c])
name = enc[c];
}
+
+ msg("<debug> 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));
+
+ x1 = (int)(x1+0.5);
+ y1 = (int)(y1+0.5);
int ret = swfoutput_drawchar(&output, x1, y1, name, c, u);
}
-void SWFOutputDev::endString(GfxState *state)
-{
- msg("<debug> endstring\n");
+void SWFOutputDev::endString(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("<verbose> startPage %d (%f,%f,%f,%f)\n", pageNum, crop_x1, crop_y1, crop_x2, crop_y2);
+ if(rot!=0)
+ msg("<verbose> page is rotated %d degrees\n", rot);
+
msg("<notice> 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<x1) {double x3=x1;x1=x2;x2=x3;}
if(y2<y1) {double y3=y1;y1=y2;y2=y3;}
{
int i;
char*filename=0;
+ int is_standard_font = 0;
- msg("<verbose> SearchT1Font(%s)", name);
+ msg("<verbose> SearchFont(%s)", name);
/* see if it is a pdf standard font */
for(i=0;i<sizeof(pdf2t1map)/sizeof(mapping);i++)
if(!strcmp(name, pdf2t1map[i].pdffont))
{
name = pdf2t1map[i].filename;
+ is_standard_font = 1;
break;
}
}
/* look in all font files */
for(i=0;i<fontnum;i++)
{
- if(!strstr(fonts[i], name))
+ if(strstr(fonts[i].filename, name))
{
- return fonts[i];
+ if(!fonts[i].used) {
+
+ fonts[i].used = 1;
+ if(!is_standard_font)
+ msg("<notice> Using %s for %s", fonts[i].filename, name);
+ }
+ return fonts[i].filename;
}
}
return 0;
msg("<error> Couldn't create temporary Type 1 font file");
return 0;
}
+
+ /*if(font->isCIDFont()) {
+ GfxCIDFont* cidFont = (GfxCIDFont *)font;
+ GString c = cidFont->getCollection();
+ msg("<notice> Collection: %s", c.getCString());
+ }*/
+
if (font->getType() == fontType1C ||
font->getType() == fontCIDType0C) {
if (!(fontBuf = font->readEmbFontFile(xref, &fontLen))) {
}
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) {
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<substitutepos;t++) {
- if(!strcmp(fontname, substitutesource[t])) {
- fontname = substitutetarget[t];
+ if(!strcmp(fontid, substitutesource[t])) {
+ fontid = substitutetarget[t];
break;
}
}
/* second, see if swfoutput already has this font
cached- if so, we are done */
- if(swfoutput_queryfont(&output, fontname))
+ if(swfoutput_queryfont(&output, fontid))
{
- swfoutput_setfont(&output, fontname, 0);
+ swfoutput_setfont(&output, fontid, 0);
- msg("<debug> updateFont(%s) [cached]", fontname);
+ msg("<debug> updateFont(%s) [cached]", fontid);
return;
}
// look for Type 3 font
- if (!type3Warning && gfxFont->getType() == fontType3) {
- type3Warning = gTrue;
- showFontError(gfxFont, 2);
+ if (gfxFont->getType() == fontType3) {
+ if(!type3Warning) {
+ type3Warning = gTrue;
+ showFontError(gfxFont, 2);
+ }
+ return;
}
/* now either load the font, or find a substitution */
int del = 0;
if(embedded &&
(gfxFont->getType() == fontType1 ||
- gfxFont->getType() == fontCIDType0C ||
gfxFont->getType() == fontType1C ||
+ //gfxFont->getType() == fontCIDType0C ||
gfxFont->getType() == fontTrueType ||
gfxFont->getType() == fontCIDType2
))
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("<warning> Font %s %scould not be loaded.", fontname, embedded?"":"(not embedded) ");
+ msg("<warning> Try putting a TTF version of that font (named \"%s.ttf\") into /swftools/fonts", fontname);
+ fileName = substituteFont(gfxFont, fontid);
+ }
if(!fileName) {
- msg("<error> Couldn't set font %s\n", fontname);
+ msg("<error> Couldn't set font %s\n", fontid);
return;
}
- msg("<verbose> updateFont(%s) -> %s", fontname, fileName);
+ msg("<verbose> updateFont(%s) -> %s", fontid, fileName);
+ dumpFontInfo("<verbose>", gfxFont);
- swfoutput_setfont(&output, fontname, fileName);
-
+ swfoutput_setfont(&output, fontid, fileName);
+
if(fileName && del)
unlinkfont(fileName);
}
}
}
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
void pdfswf_setparameter(char*name, char*value)
{
- if(!strcmp(name, "drawonlyshapes")) {
- drawonlyshapes = atoi(value);
- } else if(!strcmp(name, "ignoredraworder")) {
- ignoredraworder = atoi(value);
- } else if(!strcmp(name, "linksopennewwindow")) {
- opennewwindow = atoi(value);
- } else if(!strcmp(name, "storeallcharacters")) {
- storeallcharacters = atoi(value);
- } else if(!strcmp(name, "enablezlib")) {
- enablezlib = atoi(value);
- } else if(!strcmp(name, "insertstop")) {
- insertstoptag = atoi(value);
- } else if(!strcmp(name, "flashversion")) {
- flashversion = atoi(value);
- } else if(!strcmp(name, "jpegquality")) {
- int val = atoi(value);
- if(val<0) val=0;
- if(val>100) val=100;
- jpegquality = val;
- } else if(!strcmp(name, "outputfilename")) {
+ if(!strcmp(name, "outputfilename")) {
swffilename = value;
} else if(!strcmp(name, "caplinewidth")) {
caplinewidth = atof(value);
- } else if(!strcmp(name, "splinequality")) {
- int v = atoi(value);
- v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel
- if(v<1) v = 1;
- splinemaxerror = v;
- } else if(!strcmp(name, "fontquality")) {
- int v = atoi(value);
- v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel
- if(v<1) v = 1;
- fontsplinemaxerror = v;
} else {
- fprintf(stderr, "unknown parameter: %s (=%s)\n", name, value);
+ swfoutput_setparameter(name, 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()
-{
- drawonlyshapes = 1;
-}
-
-void pdfswf_ignoredraworder()
-{
- ignoredraworder = 1;
-}
-
-void pdfswf_linksopennewwindow()
-{
- opennewwindow = 1;
-}
-
-void pdfswf_storeallcharacters()
-{
- storeallcharacters = 1;
-}
-
-void pdfswf_enablezlib()
-{
- enablezlib = 1;
-}
-
-void pdfswf_jpegquality(int val)
-{
- if(val<0) val=0;
- if(val>100) val=100;
- jpegquality = val;
-}
-
-void pdfswf_setoutputfilename(char*_filename)
-{
- swffilename = _filename;
+/* TODO: get rid of this */
+void pdfswf_drawonlyshapes() { pdfswf_setparameter("drawonlyshapes", "1"); }
+void pdfswf_ignoredraworder() { pdfswf_setparameter("ignoredraworder", "1"); }
+void pdfswf_linksopennewwindow() { pdfswf_setparameter("opennewwindow", "1"); }
+void pdfswf_storeallcharacters() { pdfswf_setparameter("storeallcharacters", "1"); }
+void pdfswf_enablezlib() { pdfswf_setparameter("enablezlib", "1"); }
+void pdfswf_setoutputfilename(char*_filename) { swffilename = _filename; }
+void pdfswf_insertstop() { pdfswf_setparameter("insertstoptag", "1"); }
+void pdfswf_jpegquality(int val) {
+ char tmp[32];
+ sprintf(tmp, "%d", val);
+ pdfswf_setparameter("jpegquality", tmp);
}
-
-void pdfswf_insertstop()
-{
- insertstoptag = 1;
+void pdfswf_setversion(int n) {
+ char tmp[32];
+ sprintf(tmp, "%d", n);
+ pdfswf_setparameter("flashversion", tmp);
}
-void pdfswf_setversion(int n)
-{
- flashversion = n;
-}
void pdfswf_convertpage(int page)
doc->displayPage((OutputDev*)output, currentpage, /*dpi*/72, /*rotate*/0, /*doLinks*/(int)1);
}
}
-
int pdfswf_numpages()
{
return doc->getNumPages();