poppler/Lexer.cc | 3 ++- poppler/Object.cc | 15 +++++++++++++-- poppler/Object.h | 16 +++++++++++++--- poppler/PDFDoc.cc | 22 ++++++++++++++++------ poppler/PSOutputDev.cc | 5 +++-- poppler/SecurityHandler.cc | 3 ++- poppler/StructElement.cc | 5 +++-- 7 files changed, 52 insertions(+), 17 deletions(-)
New commits: commit 628299bc02ef825609e1ade539f967bbf052be0c Author: Jakub Alba <[email protected]> Date: Sun Jul 24 22:46:23 2016 +0200 treat file identifier as a hex string, not a basic string diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 5f05388..9c09283 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -703,8 +703,8 @@ GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) { Object obj2; if (permanent_id) { - if (obj.arrayGet(0, &obj2)->isString()) { - if (!get_id (obj2.getString(), permanent_id)) { + if (obj.arrayGet(0, &obj2)->isHexString()) { + if (!get_id (obj2.getHexString(), permanent_id)) { obj2.free(); return gFalse; } @@ -717,8 +717,8 @@ GBool PDFDoc::getID(GooString *permanent_id, GooString *update_id) { } if (update_id) { - if (obj.arrayGet(1, &obj2)->isString()) { - if (!get_id (obj2.getString(), update_id)) { + if (obj.arrayGet(1, &obj2)->isHexString()) { + if (!get_id (obj2.getHexString(), update_id)) { obj2.free(); return gFalse; } @@ -1467,7 +1467,7 @@ Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxR //calculate md5 digest Guchar digest[16]; md5((Guchar*)message.getCString(), message.getLength(), digest); - obj1.initString(new GooString((const char*)digest, 16)); + obj1.initHexString(new GooString((const char*)digest, 16)); //create ID array Object obj2,obj3,obj5; @@ -1492,7 +1492,7 @@ Dict *PDFDoc::createTrailerDict(int uxrefSize, GBool incrUpdate, Goffset startxR } else { //new file => same values for the two identifiers obj2.arrayAdd(&obj1); - obj1.initString(new GooString((const char*)digest, 16)); + obj1.initHexString(new GooString((const char*)digest, 16)); obj2.arrayAdd(&obj1); trailerDict->set("ID", &obj2); } diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 9124c49..403bf02 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -31,6 +31,7 @@ // Copyright (C) 2014 Till Kamppeter <[email protected]> // Copyright (C) 2015 Marek Kasik <[email protected]> // Copyright (C) 2016 Caolán McNamara <[email protected]> +// Copyright (C) 2016 Jakub Alba <[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 @@ -7100,8 +7101,8 @@ void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) { obj1.free(); dict->lookup("ID", &obj1); - if (obj1.isString()) { - writePSFmt("%ALDImageID: {0:t}\n", obj1.getString()); + if (obj1.isHexString()) { + writePSFmt("%ALDImageID: {0:t}\n", obj1.getHexString()); } obj1.free(); diff --git a/poppler/SecurityHandler.cc b/poppler/SecurityHandler.cc index 9e0546e..2e165b6 100644 --- a/poppler/SecurityHandler.cc +++ b/poppler/SecurityHandler.cc @@ -17,6 +17,7 @@ // Copyright (C) 2013 Adrian Johnson <[email protected]> // Copyright (C) 2014 Fabio D'Urso <[email protected]> // Copyright (C) 2016 Alok Anand <[email protected]> +// Copyright (C) 2016 Jakub Alba <[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 @@ -275,7 +276,7 @@ StandardSecurityHandler::StandardSecurityHandler(PDFDoc *docA, encRevision >= 2 && encRevision <= 3) { if (fileIDObj.isArray()) { if (fileIDObj.arrayGet(0, &fileIDObj1)->isString()) { - fileID = fileIDObj1.getString()->copy(); + fileID = fileIDObj1.getHexString()->copy(); } else { fileID = new GooString(); } diff --git a/poppler/StructElement.cc b/poppler/StructElement.cc index c668820..a890465 100644 --- a/poppler/StructElement.cc +++ b/poppler/StructElement.cc @@ -8,6 +8,7 @@ // Copyright 2014 Luigi Scarso <[email protected]> // Copyright 2014 Albert Astals Cid <[email protected]> // Copyright 2015 Dmytro Morgun <[email protected]> +// Copyright 2016 Jakub Alba <[email protected]> // //======================================================================== @@ -1122,8 +1123,8 @@ void StructElement::parse(Dict *element) obj.free(); // Object ID (optional), to be looked at the IDTree in the tree root. - if (element->lookup("ID", &obj)->isString()) { - s->id = obj.takeString(); + if (element->lookup("ID", &obj)->isHexString()) { + s->id = obj.takeHexString(); } obj.free(); commit debd1361f4a4cb7811677ab7a8f241b8b6fca5f9 Author: Jakub Alba <[email protected]> Date: Sun Jul 24 22:30:30 2016 +0200 introduced hex string as a new Object type and used it for file identifier File identifiers are usually written as hex strings (and this is how the PDF reference presents them in an example). Until now, poppler was reading hex strings properly, but was forgeting about the fact that a given string is a hex string, so e.g. file identifier was first read as a hex string and then printed as an ordinary string and thanks to that what was printed was actually junk. This commit fixes that. diff --git a/poppler/Lexer.cc b/poppler/Lexer.cc index 952967a..a908edf 100644 --- a/poppler/Lexer.cc +++ b/poppler/Lexer.cc @@ -18,6 +18,7 @@ // Copyright (C) 2010 Carlos Garcia Campos <[email protected]> // Copyright (C) 2012, 2013 Adrian Johnson <[email protected]> // Copyright (C) 2013 Thomas Freitag <[email protected]> +// Copyright (C) 2016 Jakub Alba <[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 @@ -526,7 +527,7 @@ Object *Lexer::getObj(Object *obj, int objNum) { s->append(tokBuf, n); if (m == 1) s->append((char)(c2 << 4)); - obj->initString(s); + obj->initHexString(s); } break; diff --git a/poppler/Object.cc b/poppler/Object.cc index d06bb39..0966e0d 100644 --- a/poppler/Object.cc +++ b/poppler/Object.cc @@ -15,6 +15,7 @@ // // Copyright (C) 2008, 2010, 2012 Albert Astals Cid <[email protected]> // Copyright (C) 2013 Adrian Johnson <[email protected]> +// Copyright (C) 2016 Jakub Alba <[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 @@ -54,12 +55,13 @@ static const char *objTypeNames[numObjTypes] = { "error", "eof", "none", - "integer64" + "integer64", + "hexstring" }; #ifdef DEBUG_MEM int Object::numAlloc[numObjTypes] = - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; #endif Object *Object::initArray(XRef *xref) { @@ -91,6 +93,7 @@ Object *Object::copy(Object *obj) { *obj = *this; switch (type) { case objString: + case objHexString: obj->string = string->copy(); break; case objName: @@ -125,6 +128,7 @@ Object *Object::fetch(XRef *xref, Object *obj, int recursion) { void Object::free() { switch (type) { case objString: + case objHexString: delete string; break; case objName: @@ -180,6 +184,13 @@ void Object::print(FILE *f) { fwrite(string->getCString(), 1, string->getLength(), f); fprintf(f, ")"); break; + case objHexString: + fprintf(f, "<"); + for (i = 0; i < string->getLength(); i++) { + fprintf(f, "%02x", string->getChar(i) & 0xff); + } + fprintf(f, ">"); + break; case objName: fprintf(f, "/%s", name); break; diff --git a/poppler/Object.h b/poppler/Object.h index e3f8f37..21b9030 100644 --- a/poppler/Object.h +++ b/poppler/Object.h @@ -105,10 +105,12 @@ enum ObjType { objNone, // uninitialized object // poppler-only objects - objInt64 // integer with at least 64-bits + objInt64, // integer with at least 64-bits + + objHexString // hex string }; -#define numObjTypes 15 // total number of object types +#define numObjTypes 16 // total number of object types //------------------------------------------------------------------------ // Object @@ -138,6 +140,8 @@ public: { initObj(objReal); real = realA; return this; } Object *initString(GooString *stringA) { initObj(objString); string = stringA; return this; } + Object *initHexString(GooString *hexA) + { initObj(objHexString); string = hexA; return this; } Object *initName(const char *nameA) { initObj(objName); name = copyString(nameA); return this; } Object *initNull() @@ -178,6 +182,7 @@ public: GBool isReal() { return type == objReal; } GBool isNum() { return type == objInt || type == objReal || type == objInt64; } GBool isString() { return type == objString; } + GBool isHexString() { return type == objHexString; } GBool isName() { return type == objName; } GBool isNull() { return type == objNull; } GBool isArray() { return type == objArray; } @@ -213,6 +218,11 @@ public: // because the object it's not expected to have a NULL string. GooString *takeString() { OBJECT_TYPE_CHECK(objString); GooString *s = string; string = NULL; return s; } + GooString *getHexString() { OBJECT_TYPE_CHECK(objHexString); return string; } + // After takeHexString() the only method that should be called for the object is free() + // because the object it's not expected to have a NULL hex string. + GooString *takeHexString() { + OBJECT_TYPE_CHECK(objHexString); GooString *s = string; string = NULL; return s; } char *getName() { OBJECT_TYPE_CHECK(objName); return name; } Array *getArray() { OBJECT_TYPE_CHECK(objArray); return array; } Dict *getDict() { OBJECT_TYPE_CHECK(objDict); return dict; } @@ -271,7 +281,7 @@ private: int intg; // integer long long int64g; // 64-bit integer double real; // real - GooString *string; // string + GooString *string; // (hex) string char *name; // name Array *array; // array Dict *dict; // dictionary diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index f28bdec..5f05388 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -1272,6 +1272,16 @@ void PDFDoc::writeObject (Object* obj, OutStream* outStr, XRef *xRef, Guint numO case objString: writeString(obj->getString(), outStr, fileKey, encAlgorithm, keyLength, objNum, objGen); break; + case objHexString: + { + GooString *s = obj->getHexString(); + outStr->printf("<"); + for (int i = 0; i < s->getLength(); i++) { + outStr->printf("%02x", s->getChar(i) & 0xff); + } + outStr->printf(">"); + break; + } case objName: { GooString name(obj->getName());
_______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
