X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=0357f50dbbd23d05453c230db32bd164a2474caf;hb=5fc373d518344e738a735a2d0c08fdf8273623e1;hp=1ac8940200e549845809ecfa3161f3c71fa19ad3;hpb=50777f45c269109a60df757555cf42d7fa236c27;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 1ac8940..0357f50 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -34,13 +34,13 @@ #include "Catalog.h" #include "Page.h" #include "PDFDoc.h" -#include "Params.h" #include "Error.h" #include "config.h" #include "OutputDev.h" #include "GfxState.h" #include "GfxFont.h" #include "FontFile.h" +#include "GlobalParams.h" //swftools header files #include "swfoutput.h" extern "C" { @@ -131,9 +131,13 @@ public: // Does this device use drawChar() or drawString()? virtual GBool useDrawChar(); + + virtual GBool interpretType3Chars() {return gFalse;} //----- initialization and control + void startDoc(XRef *xref); + // Start a page. virtual void startPage(int pageNum, GfxState *state) ; @@ -172,9 +176,9 @@ public: virtual void beginString(GfxState *state, GString *s) ; virtual void endString(GfxState *state) ; virtual void drawChar(GfxState *state, double x, double y, - double dx, double dy, Guchar c) ; - virtual void drawChar16(GfxState *state, double x, double y, - double dx, double dy, int c) ; + double dx, double dy, + double originX, double originY, + CharCode code, Unicode *u, int uLen); //----- image drawing virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, @@ -182,7 +186,7 @@ public: GBool inlineImg); virtual void drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, - GBool inlineImg); + int *maskColors, GBool inlineImg); private: void drawGeneralImage(GfxState *state, Object *ref, Stream *str, @@ -191,9 +195,11 @@ public: int clipping[64]; int clippos; + XRef*xref; + int searchT1Font(char*name); char* substituteFont(GfxFont*gfxFont, char*oldname); - char* writeEmbeddedFontToFile(GfxFont*font); + char* writeEmbeddedFontToFile(XRef*ref, GfxFont*font); int t1id; int jpeginfo; // did we write "File contains jpegs" yet? int pbminfo; // did we write "File contains jpegs" yet? @@ -319,15 +325,15 @@ int lastdumppos = 0; */ void showFontError(GfxFont*font, int nr) { - Ref r=font->getID(); + Ref*r=font->getID(); int t; for(t=0;tnum) break; if(t < lastdumppos) return; if(lastdumpposnum; if(nr == 0) logf(" The following font caused problems:"); else if(nr == 1) @@ -340,24 +346,22 @@ void showFontError(GfxFont*font, int nr) void dumpFontInfo(char*loglevel, GfxFont*font) { GString *gstr; - char*name; + char*name = 0; gstr = font->getName(); - Ref r=font->getID(); - logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num,r.gen); + Ref* r=font->getID(); + logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r->num,r->gen); gstr = font->getTag(); if(gstr) - logf("%sTag: %s\n", loglevel, gstr->getCString()); - if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); + logf("%sTag: %s\n", loglevel, FIXNULL(gstr->getCString())); + + if(font->isCIDFont()) logf("%sis CID font\n", loglevel); GfxFontType type=font->getType(); switch(type) { case fontUnknownType: logf("%sType: unknown\n",loglevel); break; - case fontType0: - logf("%sType: 0\n",loglevel); - break; case fontType1: logf("%sType: 1\n",loglevel); break; @@ -370,17 +374,27 @@ void dumpFontInfo(char*loglevel, GfxFont*font) case fontTrueType: logf("%sType: TrueType\n",loglevel); break; + case fontCIDType0: + logf("%sType: CIDType0\n",loglevel); + break; + case fontCIDType0C: + logf("%sType: CIDType0C\n",loglevel); + break; + case fontCIDType2: + logf("%sType: CIDType2\n",loglevel); + break; } Ref embRef; GBool embedded = font->getEmbeddedFontID(&embRef); - name = font->getEmbeddedFontName(); + if(font->getEmbeddedFontName()) + name = font->getEmbeddedFontName()->getCString(); if(embedded) - logf("%sEmbedded name: %s id: %d\n",loglevel, name, embRef.num); + logf("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); gstr = font->getExtFontFile(); if(gstr) - logf("%sExternal Font file: %s\n", loglevel, gstr->getCString()); + logf("%sExternal Font file: %s\n", loglevel, FIXNULL(gstr->getCString())); // Get font descriptor flags. if(font->isFixedWidth()) logf("%sis fixed width\n", loglevel); @@ -402,6 +416,7 @@ SWFOutputDev::SWFOutputDev() clippos = 0; clipping[clippos] = 0; outputstarted = 0; + xref = 0; // printf("SWFOutputDev::SWFOutputDev() \n"); }; @@ -552,32 +567,37 @@ void SWFOutputDev::beginString(GfxState *state, GString *s) } int charcounter = 0; -void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, Guchar c) +void SWFOutputDev::drawChar(GfxState *state, double x, double y, + double dx, double dy, + double originX, double originY, + CharCode c, Unicode *u, int uLen) { logf(" drawChar(%f,%f,%f,%f,'%c')\n",x,y,dx,dy,c); // check for invisible text -- this is used by Acrobat Capture if ((state->getRender() & 3) != 3) { - FontEncoding*enc=state->getFont()->getEncoding(); + GfxFont*font = state->getFont(); + Gfx8BitFont*font8; + if(font->isCIDFont()) { + logf(" CID Font"); + return; + } + font8 = (Gfx8BitFont*)font; + + char**enc=font8->getEncoding(); double x1,y1; x1 = x; y1 = y; state->transform(x, y, &x1, &y1); - if(enc->getCharName(c)) - swfoutput_drawchar(&output, x1, y1, enc->getCharName(c), c); + if(enc[c]) + swfoutput_drawchar(&output, x1, y1, enc[c], c); else logf(" couldn't get name for character %02x from Encoding", c); } } -void SWFOutputDev::drawChar16(GfxState *state, double x, double y, double dx, double dy, int c) -{ - printf(" drawChar16(%f,%f,%f,%f,%08x)\n",x,y,dx,dy,c); - exit(1); -} - void SWFOutputDev::endString(GfxState *state) { logf(" endstring\n"); @@ -602,6 +622,7 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state) void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { + logf(" drawlink\n"); double x1, y1, x2, y2, w; GfxRGB rgb; swfcoord points[5]; @@ -631,6 +652,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) char*s = "-?-"; char*type = "-?-"; char*url = 0; + char*named = 0; int page = -1; switch(action->getKind()) { @@ -666,6 +688,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; @@ -732,7 +755,11 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { swfoutput_linktourl(&output, url, points); } - logf(" \"%s\" link to \"%s\" (%d)\n", type, s, page); + else if(named) + { + swfoutput_namedlink(&output, named, points); + } + logf(" \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page); } } @@ -761,8 +788,6 @@ char type3Warning=0; int SWFOutputDev::searchT1Font(char*name) { int i; - - int id=-1; int mapid=-1; char*filename=0; for(i=0;i Loading extra font %s from %s\n", FIXNULL(fontname), + FIXNULL(T1_GetFontFileName(i))); + } + if(fontname && !strcmp(name, fontname)) { + logf(" Extra font %s is being used.\n", fontname); + return i; + } + fontname = T1_GetFontFileName(i); + if(strrchr(fontname,'/')) + fontname = strrchr(fontname,'/')+1; + + if(strstr(fontname, name)) { + logf(" Extra font %s is being used.\n", fontname); + return i; + } } } - return id; + return -1; } void SWFOutputDev::updateLineWidth(GfxState *state) @@ -812,38 +861,45 @@ void SWFOutputDev::updateStrokeColor(GfxState *state) (char)(rgb.b*255), (char)(opaq*255)); } -char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) +char*SWFOutputDev::writeEmbeddedFontToFile(XRef*ref, GfxFont*font) { char*tmpFileName = NULL; FILE *f; int c; char *fontBuf; int fontLen; - Type1CFontConverter *cvt; + Type1CFontFile *cvt; Ref embRef; Object refObj, strObj; tmpFileName = "/tmp/tmpfont"; - font->getEmbeddedFontID(&embRef); + int ret; + + ret = font->getEmbeddedFontID(&embRef); + if(!ret) { + /* not embedded- the caller should now search the font + directories for this font */ + return 0; + } f = fopen(tmpFileName, "wb"); if (!f) { logf(" Couldn't create temporary Type 1 font file"); - return 0; + return 0; } if (font->getType() == fontType1C) { - if (!(fontBuf = font->readEmbFontFile(&fontLen))) { + if (!(fontBuf = font->readEmbFontFile(xref, &fontLen))) { fclose(f); logf(" Couldn't read embedded font file"); return 0; } - cvt = new Type1CFontConverter(fontBuf, fontLen, f); - cvt->convert(); + cvt = new Type1CFontFile(fontBuf, fontLen); + cvt->convertToType1(f); delete cvt; gfree(fontBuf); } else { font->getEmbeddedFontID(&embRef); refObj.initRef(embRef.num, embRef.gen); - refObj.fetch(&strObj); + refObj.fetch(ref, &strObj); refObj.free(); strObj.streamReset(); while ((c = strObj.streamGetChar()) != EOF) { @@ -872,7 +928,7 @@ char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) tmpFileName = strdup(name2); } - return tmpFileName; + return tmpFileName; } char* gfxFontName(GfxFont* gfxFont) @@ -884,8 +940,8 @@ char* gfxFontName(GfxFont* gfxFont) } else { char buf[32]; - Ref r=gfxFont->getID(); - sprintf(buf, "UFONT%d", r.num); + Ref*r=gfxFont->getID(); + sprintf(buf, "UFONT%d", r->num); return strdup(buf); } } @@ -896,7 +952,25 @@ int substitutepos = 0; char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) { - //substitute font +/* ------------------------------ V1 */ + + char*fontname = "Times-Roman"; + 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", FIXNULL(oldname), FIXNULL(fontname)); + substitutepos ++; + } + return fontname; + +/* ------------------------------ V2 */ + +/* //substitute font char* fontname = 0; double m11, m12, m21, m22; int index; @@ -910,7 +984,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) // printf("%d %s\n", t, gfxFont->getCharName(t)); showFontError(gfxFont, 1); - if (!gfxFont->is16Bit()) { + if(1) { //if (!gfxFont->isCIDFont()) { FIXME: xpdf 1.01 does not have is16Bit() if(gfxFont->isSymbolic()) { if(fontname && (strstr(fontname,"ing"))) //Dingbats, Wingdings etc. index = 16; @@ -977,10 +1051,10 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) if(oldname) { substitutesource[substitutepos] = oldname; substitutetarget[substitutepos] = fontname; - logf(" substituting %s -> %s", oldname, fontname); + logf(" substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname)); substitutepos ++; } - return fontname; + return fontname;*/ } void unlinkfont(char* filename) @@ -1012,6 +1086,12 @@ void unlinkfont(char* filename) } } +void SWFOutputDev::startDoc(XRef *xref) +{ + this->xref = xref; +} + + void SWFOutputDev::updateFont(GfxState *state) { GfxFont*gfxFont = state->getFont(); @@ -1023,6 +1103,9 @@ void SWFOutputDev::updateFont(GfxState *state) char * fontname = gfxFontName(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", gfxFont); + + /* now either load the font, or find a substitution */ Ref embRef; GBool embedded = gfxFont->getEmbeddedFontID(&embRef); if(embedded) { - if (!gfxFont->is16Bit() && + if (!gfxFont->isCIDFont() && (gfxFont->getType() == fontType1 || gfxFont->getType() == fontType1C || gfxFont->getType() == fontTrueType)) { - fileName = writeEmbeddedFontToFile(gfxFont); + fileName = writeEmbeddedFontToFile(xref, gfxFont); if(!fileName) { logf(" Couldn't write font to file"); showFontError(gfxFont,0); @@ -1094,7 +1181,7 @@ void SWFOutputDev::updateFont(GfxState *state) return; } - logf(" Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, fileName, fontname); + logf(" Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, FIXNULL(fileName), FIXNULL(fontname)); swfoutput_setfont(&output, fontname, this->t1id, fileName); if(fileName) unlinkfont(fileName); @@ -1117,17 +1204,26 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, ImageStream *imgStr; Guchar pixBuf[4]; GfxRGB rgb; + int ncomps = 1; + int bits = 1; + + if(colorMap) { + ncomps = colorMap->getNumPixelComps(); + bits = colorMap->getBits(); + } + imgStr = new ImageStream(str, width, ncomps,bits); + imgStr->reset(); + if(!width || !height || (height<=1 && width<=1)) { logf(" Ignoring %d by %d image", width, height); - int i,j; - if (inlineImg) { - j = height * ((width + 7) / 8); - str->reset(); - for (i = 0; i < j; ++i) { - str->getChar(); - } + unsigned char buf[8]; + int x,y; + for (y = 0; y < height; ++y) + for (x = 0; x < width; ++x) { + imgStr->getPixel(buf); } + delete imgStr; return; } @@ -1136,206 +1232,161 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, state->transform(1, 0, &x3, &y3); state->transform(1, 1, &x4, &y4); - if (str->getKind() == strDCT && - (colorMap->getNumPixelComps() == 3 || !mask) ) - { - sprintf(fileName, "%s.jpg",mktmpname(0)); - logf(" Found jpeg. Temporary storage is %s", fileName); - if(!jpeginfo) - { - logf(" file contains jpeg pictures"); - jpeginfo = 1; - } - if (!(fi = fopen(fileName, "wb"))) { - logf(" Couldn't open temporary image file '%s'", fileName); - return; - } - str = ((DCTStream *)str)->getRawStream(); - str->reset(); - int xid = 0; - int yid = 0; - int count = 0; - while ((c = str->getChar()) != EOF) - { - fputc(c, fi); - xid += count*c; - yid += (~count)*c; - count++; - } - fclose(fi); - - int t,found = -1; - for(t=0;t file contains pbm pictures %s",mask?"(masked)":""); - if(mask) - logf(" drawing %d by %d masked picture\n", width, height); - pbminfo = 1; - } + if(!pbminfo && !(str->getKind()==strDCT)) { + logf(" file contains pbm pictures %s",mask?"(masked)":""); + if(mask) + logf(" drawing %d by %d masked picture\n", width, height); + pbminfo = 1; + } + if(!jpeginfo && (str->getKind()==strDCT)) { + logf(" file contains jpeg pictures"); + jpeginfo = 1; + } - if(mask) { - imgStr = new ImageStream(str, width, 1, 1); - imgStr->reset(); - //return; - int yes=0,i,j; - unsigned char buf[8]; - int xid = 0; - int yid = 0; - int x,y; - int width2 = (width+3)&(~3); - unsigned char*pic = new unsigned char[width2*height]; - RGBA pal[256]; - GfxRGB rgb; - state->getFillRGB(&rgb); - pal[0].r = (int)(rgb.r*255); pal[0].g = (int)(rgb.g*255); - pal[0].b = (int)(rgb.b*255); pal[0].a = 255; - pal[1].r = 0; pal[1].g = 0; pal[1].b = 0; pal[1].a = 0; - xid += pal[1].r*3 + pal[1].g*11 + pal[1].b*17; - yid += pal[1].r*7 + pal[1].g*5 + pal[1].b*23; - for (y = 0; y < height; ++y) - for (x = 0; x < width; ++x) - { - imgStr->getPixel(buf); - pic[width*y+x] = buf[0]; - xid+=x*buf[0]+1; - yid+=y*buf[0]+1; - } - int t,found = -1; - for(t=0;tgetNumPixelComps(), - colorMap->getBits()); - imgStr->reset(); + if(mask) { + int yes=0,i,j; + unsigned char buf[8]; + int xid = 0; + int yid = 0; + int x,y; + int width2 = (width+3)&(~3); + unsigned char*pic = new unsigned char[width2*height]; + RGBA pal[256]; + GfxRGB rgb; + state->getFillRGB(&rgb); + pal[0].r = (int)(rgb.r*255); pal[0].g = (int)(rgb.g*255); + pal[0].b = (int)(rgb.b*255); pal[0].a = 255; + pal[1].r = 0; pal[1].g = 0; pal[1].b = 0; pal[1].a = 0; + xid += pal[1].r*3 + pal[1].g*11 + pal[1].b*17; + yid += pal[1].r*7 + pal[1].g*5 + pal[1].b*23; + for (y = 0; y < height; ++y) + for (x = 0; x < width; ++x) + { + imgStr->getPixel(buf); + // if(invert) buf[0]=255-buf[0]? + pic[width*y+x] = buf[0]; + xid+=x*buf[0]+1; + yid+=y*buf[0]+1; + } + int t,found = -1; + for(t=0;tgetNumPixelComps()!=1) - { - RGBA*pic=new RGBA[width*height]; - int xid = 0; - int yid = 0; - for (y = 0; y < height; ++y) { - for (x = 0; x < width; ++x) { - int r,g,b,a; - imgStr->getPixel(pixBuf); - colorMap->getRGB(pixBuf, &rgb); - pic[width*y+x].r = r = (U8)(rgb.r * 255 + 0.5); - pic[width*y+x].g = g = (U8)(rgb.g * 255 + 0.5); - pic[width*y+x].b = b = (U8)(rgb.b * 255 + 0.5); - pic[width*y+x].a = a = 255;//(U8)(rgb.a * 255 + 0.5); - xid += x*r+x*b*3+x*g*7+x*a*11; - yid += y*r*3+y*b*17+y*g*19+y*a*11; - } - } - int t,found = -1; - for(t=0;tgetNumPixelComps()!=1 || str->getKind()==strDCT) + { + RGBA*pic=new RGBA[width*height]; + int xid = 0; + int yid = 0; + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + int r,g,b,a; + imgStr->getPixel(pixBuf); + colorMap->getRGB(pixBuf, &rgb); + pic[width*y+x].r = r = (U8)(rgb.r * 255 + 0.5); + pic[width*y+x].g = g = (U8)(rgb.g * 255 + 0.5); + pic[width*y+x].b = b = (U8)(rgb.b * 255 + 0.5); + pic[width*y+x].a = a = 255;//(U8)(rgb.a * 255 + 0.5); + xid += x*r+x*b*3+x*g*7+x*a*11; + yid += y*r*3+y*b*17+y*g*19+y*a*11; } - else - { - U8*pic = new U8[width2*height]; - RGBA pal[256]; - int t; - int xid=0,yid=0; - for(t=0;t<256;t++) - { - int r,g,b,a; - pixBuf[0] = t; - colorMap->getRGB(pixBuf, &rgb); - pal[t].r = r = (U8)(rgb.r * 255 + 0.5); - pal[t].g = g = (U8)(rgb.g * 255 + 0.5); - pal[t].b = b = (U8)(rgb.b * 255 + 0.5); - pal[t].a = a = 255;//(U8)(rgb.b * 255 + 0.5); - xid += t*r+t*b*3+t*g*7+t*a*11; - xid += (~t)*r+t*b*3+t*g*7+t*a*11; - } - for (y = 0; y < height; ++y) { - for (x = 0; x < width; ++x) { - imgStr->getPixel(pixBuf); - pic[width2*y+x] = pixBuf[0]; - xid += x*pixBuf[0]*7; - yid += y*pixBuf[0]*3; - } - } - int found = -1; - for(t=0;tgetKind()==strDCT) + pic_ids[picpos] = swfoutput_drawimagejpeg(&output, pic, width, height, + x1,y1,x2,y2,x3,y3,x4,y4); + else + pic_ids[picpos] = swfoutput_drawimagelossless(&output, pic, width, height, + x1,y1,x2,y2,x3,y3,x4,y4); + pic_xids[picpos] = xid; + pic_yids[picpos] = yid; + if(picpos<1024) + picpos++; + } else { + swfoutput_drawimageagain(&output, pic_ids[found], width, height, + x1,y1,x2,y2,x3,y3,x4,y4); + } + delete pic; + delete imgStr; + return; + } + else + { + U8*pic = new U8[width*height]; + RGBA pal[256]; + int t; + int xid=0,yid=0; + for(t=0;t<256;t++) + { + int r,g,b,a; + pixBuf[0] = t; + colorMap->getRGB(pixBuf, &rgb); + pal[t].r = r = (U8)(rgb.r * 255 + 0.5); + pal[t].g = g = (U8)(rgb.g * 255 + 0.5); + pal[t].b = b = (U8)(rgb.b * 255 + 0.5); + pal[t].a = a = 255;//(U8)(rgb.b * 255 + 0.5); + xid += t*r+t*b*3+t*g*7+t*a*11; + xid += (~t)*r+t*b*3+t*g*7+t*a*11; + } + for (y = 0; y < height; ++y) { + for (x = 0; x < width; ++x) { + imgStr->getPixel(pixBuf); + pic[width*y+x] = pixBuf[0]; + xid += x*pixBuf[0]*7; + yid += y*pixBuf[0]*3; } - delete imgStr; - } - + } + int found = -1; + for(t=0;t drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1); } void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, - int width, int height, - GfxImageColorMap *colorMap, GBool inlineImg) + int width, int height, GfxImageColorMap *colorMap, + int *maskColors, GBool inlineImg) { + logf(" drawImage %dx%d, %s %s, inline=%d", width, height, + colorMap?"colorMap":"no colorMap", + maskColors?"maskColors":"no maskColors", + inlineImg); + if(colorMap) + logf(" colorMap pixcomps:%d bits:%d mode:%d\n", colorMap->getNumPixelComps(), + colorMap->getBits(),colorMap->getColorSpace()->getMode()); drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0); } @@ -1402,14 +1461,11 @@ void pdfswf_init(char*filename, char*userPassword) GString *fileName = new GString(filename); GString *userPW; Object info; - // init error file - errorInit(); // read config file - initParams(xpdfConfigFile); + globalParams = new GlobalParams(""); // open PDF file - xref = NULL; if (userPassword && userPassword[0]) { userPW = new GString(userPassword); } else { @@ -1471,6 +1527,7 @@ void pdfswf_init(char*filename, char*userPassword) output = new SWFOutputDev(); + output->startDoc(doc->getXRef()); } void pdfswf_drawonlyshapes() @@ -1493,6 +1550,11 @@ void pdfswf_storeallcharacters() storeallcharacters = 1; } +void pdfswf_enablezlib() +{ + enablezlib = 1; +} + void pdfswf_jpegquality(int val) { if(val<0) val=0; @@ -1528,7 +1590,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); } } @@ -1543,7 +1605,7 @@ void pdfswf_close() logf(" pdfswf.cc: pdfswf_close()"); delete output; delete doc; - freeParams(); + //freeParams(); // check for memory leaks Object::memCheck(stderr); gMemReport(stderr);