goo/GooString.cc | 36 ++++++++++++++++++++++++++++++++++++ goo/GooString.h | 7 +++++++ poppler/PDFDoc.cc | 7 ++++++- poppler/PSOutputDev.cc | 49 +++++++++---------------------------------------- poppler/PSOutputDev.h | 3 +-- 5 files changed, 59 insertions(+), 43 deletions(-)
New commits: commit 50e1e77dc2aab75d4d8489ff634aaa26648051f4 Author: Albert Astals Cid <[email protected]> Date: Sun Dec 28 01:29:41 2008 +0100 Move PSOutputDev::filterPSName to GooString::sanitizedName so i can use it from PDFDoc::writeObject diff --git a/goo/GooString.cc b/goo/GooString.cc index 036a432..74645aa 100644 --- a/goo/GooString.cc +++ b/goo/GooString.cc @@ -18,6 +18,7 @@ // Copyright (C) 2006 Kristian Høgsberg <[email protected]> // Copyright (C) 2006 Krzysztof Kowalczyk <[email protected]> // Copyright (C) 2007 Jeff Muizelaar <[email protected]> +// Copyright (C) 2008 Albert Astals Cid <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -742,3 +743,38 @@ GBool GooString::hasUnicodeMarker(void) { return (s[0] & 0xff) == 0xfe && (s[1] & 0xff) == 0xff; } + +GooString *GooString::sanitizedName(GBool psmode) const +{ + GooString *name; + char buf[8]; + int i; + char c; + + name = new GooString(); + + if (psmode) + { + // ghostscript chokes on names that begin with out-of-limits + // numbers, e.g., 1e4foo is handled correctly (as a name), but + // 1e999foo generates a limitcheck error + c = name->getChar(0); + if (c >= '0' && c <= '9') { + name->append('f'); + } + } + + for (i = 0; i < name->getLength(); ++i) { + c = name->getChar(i); + if ((psmode && (c <= (char)0x20 || c >= (char)0x7f)) || + c == '(' || c == ')' || c == '<' || c == '>' || + c == '[' || c == ']' || c == '{' || c == '}' || + c == '/' || c == '%') { + sprintf(buf, "#%02x", c & 0xff); + name->append(buf); + } else { + name->append(c); + } + } + return name; +} diff --git a/goo/GooString.h b/goo/GooString.h index 7f0671f..bd7b1ff 100644 --- a/goo/GooString.h +++ b/goo/GooString.h @@ -17,6 +17,7 @@ // // Copyright (C) 2006 Kristian Høgsberg <[email protected]> // Copyright (C) 2006 Krzysztof Kowalczyk <[email protected]> +// Copyright (C) 2008 Albert Astals Cid <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -137,6 +138,12 @@ public: GBool hasUnicodeMarker(void); + // Sanitizes the string so that it does + // not contain any ( ) < > [ ] { } / % + // The postscript mode also has some more strict checks + // The caller owns the return value + GooString *sanitizedName(GBool psmode) const; + private: // you can tweak this number for a different speed/memory usage tradeoffs. // In libc malloc() rounding is 16 so it's best to choose a value that diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 791f851..c2d03fe 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -727,8 +727,13 @@ Guint PDFDoc::writeObject (Object* obj, Ref* ref, OutStream* outStr) writeString(obj->getString(), outStr); break; case objName: - outStr->printf("/%s ", obj->getName()); + { + GooString name(obj->getName()); + GooString *nameToPrint = name.sanitizedName(gFalse /* non ps mode */); + outStr->printf("/%s ", nameToPrint->getCString()); + delete nameToPrint; break; + } case objNull: outStr->printf( "null"); break; diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index a111894..19d34da 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -1647,7 +1647,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { } else if (globalParams->getPSEmbedType1() && font->getType() == fontType1 && font->getEmbeddedFontID(&fontFileID)) { - psName = filterPSName(font->getEmbeddedFontName()); + psName = font->getEmbeddedFontName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedType1Font(&fontFileID, psName); // check for embedded Type 1C font @@ -1656,7 +1656,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { font->getEmbeddedFontID(&fontFileID)) { // use the PDF font name because the embedded font name might // not include the subset prefix - psName = filterPSName(font->getOrigName()); + psName = font->getOrigName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedType1CFont(font, &fontFileID, psName); // check for embedded OpenType - Type 1C font @@ -1665,7 +1665,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { font->getEmbeddedFontID(&fontFileID)) { // use the PDF font name because the embedded font name might // not include the subset prefix - psName = filterPSName(font->getOrigName()); + psName = font->getOrigName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedOpenTypeT1CFont(font, &fontFileID, psName); // check for external Type 1 font file @@ -1681,7 +1681,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { (font->getType() == fontTrueType || font->getType() == fontTrueTypeOT) && font->getEmbeddedFontID(&fontFileID)) { - psName = filterPSName(font->getEmbeddedFontName()); + psName = font->getEmbeddedFontName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedTrueTypeFont(font, &fontFileID, psName); // check for external TrueType font file @@ -1694,7 +1694,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { } else if (globalParams->getPSEmbedCIDPostScript() && font->getType() == fontCIDType0C && font->getEmbeddedFontID(&fontFileID)) { - psName = filterPSName(font->getEmbeddedFontName()); + psName = font->getEmbeddedFontName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedCIDType0Font(font, &fontFileID, psName); // check for embedded CID TrueType font @@ -1702,14 +1702,14 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) { (font->getType() == fontCIDType2 || font->getType() == fontCIDType2OT) && font->getEmbeddedFontID(&fontFileID)) { - psName = filterPSName(font->getEmbeddedFontName()); + psName = font->getEmbeddedFontName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedCIDTrueTypeFont(font, &fontFileID, psName, gTrue); // check for embedded OpenType - CID CFF font } else if (globalParams->getPSEmbedCIDPostScript() && font->getType() == fontCIDType0COT && font->getEmbeddedFontID(&fontFileID)) { - psName = filterPSName(font->getEmbeddedFontName()); + psName = font->getEmbeddedFontName()->sanitizedName(gTrue /* ps mode */); setupEmbeddedOpenTypeCFFFont(font, &fontFileID, psName); // check for Type 3 font @@ -2207,7 +2207,7 @@ GooString *PSOutputDev::setupExternalTrueTypeFont(GfxFont *font) { } } - psName = filterPSName(font->getName()); + psName = font->getName()->sanitizedName(gTrue /* ps mode */); // add entry to fontFileNames list if (i == fontFileNameLen) { if (fontFileNameLen >= fontFileNameSize) { @@ -2280,7 +2280,7 @@ GooString *PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font, GooString *f } } - psName = filterPSName(font->getName()); + psName = font->getName()->sanitizedName(gTrue /* ps mode */); // add entry to fontFileNames list if (i == fontFileNameLen) { if (fontFileNameLen >= fontFileNameSize) { @@ -6324,37 +6324,6 @@ void PSOutputDev::writePSName(char *s) { } } -GooString *PSOutputDev::filterPSName(GooString *name) { - GooString *name2; - char buf[8]; - int i; - char c; - - name2 = new GooString(); - - // ghostscript chokes on names that begin with out-of-limits - // numbers, e.g., 1e4foo is handled correctly (as a name), but - // 1e999foo generates a limitcheck error - c = name->getChar(0); - if (c >= '0' && c <= '9') { - name2->append('f'); - } - - for (i = 0; i < name->getLength(); ++i) { - c = name->getChar(i); - if (c <= (char)0x20 || c >= (char)0x7f || - c == '(' || c == ')' || c == '<' || c == '>' || - c == '[' || c == ']' || c == '{' || c == '}' || - c == '/' || c == '%') { - sprintf(buf, "#%02x", c & 0xff); - name2->append(buf); - } else { - name2->append(c); - } - } - return name2; -} - // Convert GooString to GooString, with appropriate escaping // of things that can't appear in a label // This is heavily based on the writePSTextLine() method diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h index ddc2041..e490110 100644 --- a/poppler/PSOutputDev.h +++ b/poppler/PSOutputDev.h @@ -15,7 +15,7 @@ // // Copyright (C) 2005 Martin Kretzschmar <[email protected]> // Copyright (C) 2005 Kristian Høgsberg <[email protected]> -// Copyright (C) 2006, 2007 Albert Astals Cid <[email protected]> +// Copyright (C) 2006-2008 Albert Astals Cid <[email protected]> // Copyright (C) 2007 Brad Hards <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -326,7 +326,6 @@ private: void writePSFmt(const char *fmt, ...); void writePSString(GooString *s); void writePSName(char *s); - GooString *filterPSName(GooString *name); GooString *filterPSLabel(GooString *label, GBool *needParens=0); void writePSTextLine(GooString *s);
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
