poppler/PSOutputDev.cc | 52 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-)
New commits: commit 9bc8f3240698d5a8ae4c0129e768840664d28c22 Merge: a2742c8 e2fe851 Author: Albert Astals Cid <[email protected]> Date: Tue Oct 1 19:19:32 2013 +0200 Merge remote-tracking branch 'origin/poppler-0.24' commit e2fe85137ecb59eb0d177682c552febc64cda643 Author: Adrian Johnson <[email protected]> Date: Tue Oct 1 19:15:08 2013 +0200 Fix PFB font embedding Bug #69717 diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 4fe5d7b..623251f 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -25,7 +25,7 @@ // Copyright (C) 2009 Carlos Garcia Campos <[email protected]> // Copyright (C) 2009, 2011, 2012 William Bader <[email protected]> // Copyright (C) 2009 Kovid Goyal <[email protected]> -// Copyright (C) 2009-2011 Adrian Johnson <[email protected]> +// Copyright (C) 2009-2011, 2013 Adrian Johnson <[email protected]> // Copyright (C) 2012 Fabio D'Urso <[email protected]> // Copyright (C) 2012 Lu Wang <[email protected]> // @@ -1842,9 +1842,9 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { //~ add cases for external 16-bit fonts switch (fontLoc->fontType) { case fontType1: - if (font->getName()) { + if (font->getEmbeddedFontName()) { // this assumes that the PS font name matches the PDF font name - psName = font->getName()->copy(); + psName = font->getEmbeddedFontName()->copy(); } else { //~ this won't work -- the PS font name won't match psName = makePSFontName(font, font->getID()); @@ -2140,9 +2140,8 @@ void PSOutputDev::setupEmbeddedType1Font(Ref *id, GooString *psName) { strObj.free(); } -//~ This doesn't handle .pfb files or binary eexec data (which only -//~ happens in pfb files?). void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) { + static const char hexChar[17] = "0123456789abcdef"; FILE *fontFile; int c; @@ -2162,8 +2161,49 @@ void PSOutputDev::setupExternalType1Font(GooString *fileName, GooString *psName) error(errIO, -1, "Couldn't open external font file"); return; } - while ((c = fgetc(fontFile)) != EOF) { + + c = fgetc(fontFile); + if (c == 0x80) { + // PFB file + ungetc(c, fontFile); + while (!feof(fontFile)) { + fgetc(fontFile); // skip start of segment byte (0x80) + int segType = fgetc(fontFile); + long segLen = fgetc(fontFile) | + (fgetc(fontFile) << 8) | + (fgetc(fontFile) << 16) | + (fgetc(fontFile) << 24); + if (feof(fontFile)) + break; + + if (segType == 1) { + // ASCII segment + for (long i = 0; i < segLen; i++) { + c = fgetc(fontFile); + if (c == EOF) + break; + writePSChar(c); + } + } else if (segType == 2) { + // binary segment + for (long i = 0; i < segLen; i++) { + c = fgetc(fontFile); + if (c == EOF) + break; + writePSChar(hexChar[(c >> 4) & 0x0f]); + writePSChar(hexChar[c & 0x0f]); + if (i % 36 == 35) + writePSChar('\n'); + } + } else { + // end of file + break; + } + } + } else if (c != EOF) { writePSChar(c); + while ((c = fgetc(fontFile)) != EOF) + writePSChar(c); } fclose(fontFile); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
