Commit 913eb5ac35011b3d28c653b6f89d936c8f99c844
1 parent
f8115231
Add getTypeCode() and getTypeName()
Add virtual methods to QPDFObject, wrappers to QPDFObjectHandle, and implementations to all the QPDF_Object types.
Showing
33 changed files
with
383 additions
and
130 deletions
ChangeLog
| 1 | +2013-01-22 Jay Berkenbilt <ejb@ql.org> | |
| 2 | + | |
| 3 | + * Add QPDFObjectHandle::getTypeCode(). This method returns a | |
| 4 | + unique integer (enumerated type) value corresponding to the object | |
| 5 | + type of the QPDFObjectHandle. It can be used as an alternative to | |
| 6 | + the QPDFObjectHandle::is* methods for type testing, particularly | |
| 7 | + where there is a desire to use a switch statement or optimize for | |
| 8 | + performance when testing object types. | |
| 9 | + | |
| 10 | + * Add QPDFObjectHandle::getTypeName(). This method returns a | |
| 11 | + string literal describing the object type. It is useful for | |
| 12 | + testing and debugging. | |
| 13 | + | |
| 1 | 14 | 2013-01-20 Jay Berkenbilt <ejb@ql.org> |
| 2 | 15 | |
| 3 | - * Added QPDFObjectHandle::parseContentStream, which parses the | |
| 16 | + * Add QPDFObjectHandle::parseContentStream, which parses the | |
| 4 | 17 | objects in a content stream and calls handlers in a callback |
| 5 | 18 | class. The example pdf-parse-content illustrates it use. |
| 6 | 19 | |
| 7 | - * Added QPDF_Keyword and QPDF_InlineImage types along with | |
| 20 | + * Add QPDF_Keyword and QPDF_InlineImage types along with | |
| 8 | 21 | appropriate wrapper methods in QPDFObjectHandle. These new object |
| 9 | 22 | types are to facilitate content stream parsing. |
| 10 | 23 | ... | ... |
examples/pdf-parse-content.cc
| ... | ... | @@ -30,10 +30,10 @@ class ParserCallbacks: public QPDFObjectHandle::ParserCallbacks |
| 30 | 30 | void |
| 31 | 31 | ParserCallbacks::handleObject(QPDFObjectHandle obj) |
| 32 | 32 | { |
| 33 | + std::cout << obj.getTypeName() << ": "; | |
| 33 | 34 | if (obj.isInlineImage()) |
| 34 | 35 | { |
| 35 | 36 | std::string val = obj.getInlineImageValue(); |
| 36 | - std::cout << "inline image: "; | |
| 37 | 37 | char buf[3]; |
| 38 | 38 | buf[2] = '\0'; |
| 39 | 39 | for (size_t i = 0; i < val.length(); ++i) | ... | ... |
examples/qtest/parse-content/content.out
include/qpdf/QPDFObject.hh
| ... | ... | @@ -18,9 +18,42 @@ class QPDFObjectHandle; |
| 18 | 18 | class QPDFObject |
| 19 | 19 | { |
| 20 | 20 | public: |
| 21 | + | |
| 22 | + // Objects derived from QPDFObject are accessible through | |
| 23 | + // QPDFObjectHandle. Each object returns a unique type code that | |
| 24 | + // has one of the values in the list below. As new object types | |
| 25 | + // are added to qpdf, additional items may be added to the list, | |
| 26 | + // so code that switches on these values should take that into | |
| 27 | + // consideration. | |
| 28 | + enum object_type_e { | |
| 29 | + // Object types internal to qpdf | |
| 30 | + ot_uninitialized, | |
| 31 | + ot_reserved, | |
| 32 | + // Object types that can occur in the main document | |
| 33 | + ot_boolean, | |
| 34 | + ot_null, | |
| 35 | + ot_integer, | |
| 36 | + ot_real, | |
| 37 | + ot_name, | |
| 38 | + ot_string, | |
| 39 | + ot_array, | |
| 40 | + ot_dictionary, | |
| 41 | + ot_stream, | |
| 42 | + // Additional object types that can occur in content streams | |
| 43 | + ot_keyword, | |
| 44 | + ot_inlineimage, | |
| 45 | + }; | |
| 46 | + | |
| 21 | 47 | virtual ~QPDFObject() {} |
| 22 | 48 | virtual std::string unparse() = 0; |
| 23 | 49 | |
| 50 | + // Return a unique type code for the object | |
| 51 | + virtual object_type_e getTypeCode() const = 0; | |
| 52 | + | |
| 53 | + // Return a string literal that describes the type, useful for | |
| 54 | + // debugging and testing | |
| 55 | + virtual char const* getTypeName() const = 0; | |
| 56 | + | |
| 24 | 57 | // Accessor to give specific access to non-public methods |
| 25 | 58 | class ObjAccessor |
| 26 | 59 | { | ... | ... |
include/qpdf/QPDFObjectHandle.hh
| ... | ... | @@ -91,6 +91,14 @@ class QPDFObjectHandle |
| 91 | 91 | QPDF_DLL |
| 92 | 92 | bool isInitialized() const; |
| 93 | 93 | |
| 94 | + // Return type code and type name of underlying object. These are | |
| 95 | + // useful for doing rapid type tests (like switch statements) or | |
| 96 | + // for testing and debugging. | |
| 97 | + QPDF_DLL | |
| 98 | + QPDFObject::object_type_e getTypeCode() const; | |
| 99 | + QPDF_DLL | |
| 100 | + char const* getTypeName() const; | |
| 101 | + | |
| 94 | 102 | // Exactly one of these will return true for any object. Keyword |
| 95 | 103 | // and InlineImage are only allowed in content streams. |
| 96 | 104 | QPDF_DLL | ... | ... |
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -76,6 +76,32 @@ QPDFObjectHandle::isInitialized() const |
| 76 | 76 | return this->initialized; |
| 77 | 77 | } |
| 78 | 78 | |
| 79 | +QPDFObject::object_type_e | |
| 80 | +QPDFObjectHandle::getTypeCode() const | |
| 81 | +{ | |
| 82 | + if (obj.getPointer()) | |
| 83 | + { | |
| 84 | + return obj->getTypeCode(); | |
| 85 | + } | |
| 86 | + else | |
| 87 | + { | |
| 88 | + return QPDFObject::ot_uninitialized; | |
| 89 | + } | |
| 90 | +} | |
| 91 | + | |
| 92 | +char const* | |
| 93 | +QPDFObjectHandle::getTypeName() const | |
| 94 | +{ | |
| 95 | + if (obj.getPointer()) | |
| 96 | + { | |
| 97 | + return obj->getTypeName(); | |
| 98 | + } | |
| 99 | + else | |
| 100 | + { | |
| 101 | + return "uninitialized"; | |
| 102 | + } | |
| 103 | +} | |
| 104 | + | |
| 79 | 105 | template <class T> |
| 80 | 106 | class QPDFObjectTypeAccessor |
| 81 | 107 | { | ... | ... |
libqpdf/QPDF_Array.cc
| ... | ... | @@ -34,6 +34,18 @@ QPDF_Array::unparse() |
| 34 | 34 | return result; |
| 35 | 35 | } |
| 36 | 36 | |
| 37 | +QPDFObject::object_type_e | |
| 38 | +QPDF_Array::getTypeCode() const | |
| 39 | +{ | |
| 40 | + return QPDFObject::ot_array; | |
| 41 | +} | |
| 42 | + | |
| 43 | +char const* | |
| 44 | +QPDF_Array::getTypeName() const | |
| 45 | +{ | |
| 46 | + return "array"; | |
| 47 | +} | |
| 48 | + | |
| 37 | 49 | int |
| 38 | 50 | QPDF_Array::getNItems() const |
| 39 | 51 | { | ... | ... |
libqpdf/QPDF_Bool.cc
| ... | ... | @@ -15,6 +15,18 @@ QPDF_Bool::unparse() |
| 15 | 15 | return (val ? "true" : "false"); |
| 16 | 16 | } |
| 17 | 17 | |
| 18 | +QPDFObject::object_type_e | |
| 19 | +QPDF_Bool::getTypeCode() const | |
| 20 | +{ | |
| 21 | + return QPDFObject::ot_boolean; | |
| 22 | +} | |
| 23 | + | |
| 24 | +char const* | |
| 25 | +QPDF_Bool::getTypeName() const | |
| 26 | +{ | |
| 27 | + return "boolean"; | |
| 28 | +} | |
| 29 | + | |
| 18 | 30 | bool |
| 19 | 31 | QPDF_Bool::getVal() const |
| 20 | 32 | { | ... | ... |
libqpdf/QPDF_Dictionary.cc
| ... | ... | @@ -39,6 +39,18 @@ QPDF_Dictionary::unparse() |
| 39 | 39 | return result; |
| 40 | 40 | } |
| 41 | 41 | |
| 42 | +QPDFObject::object_type_e | |
| 43 | +QPDF_Dictionary::getTypeCode() const | |
| 44 | +{ | |
| 45 | + return QPDFObject::ot_dictionary; | |
| 46 | +} | |
| 47 | + | |
| 48 | +char const* | |
| 49 | +QPDF_Dictionary::getTypeName() const | |
| 50 | +{ | |
| 51 | + return "dictionary"; | |
| 52 | +} | |
| 53 | + | |
| 42 | 54 | bool |
| 43 | 55 | QPDF_Dictionary::hasKey(std::string const& key) |
| 44 | 56 | { | ... | ... |
libqpdf/QPDF_InlineImage.cc
| ... | ... | @@ -17,6 +17,18 @@ QPDF_InlineImage::unparse() |
| 17 | 17 | return this->val; |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | +QPDFObject::object_type_e | |
| 21 | +QPDF_InlineImage::getTypeCode() const | |
| 22 | +{ | |
| 23 | + return QPDFObject::ot_inlineimage; | |
| 24 | +} | |
| 25 | + | |
| 26 | +char const* | |
| 27 | +QPDF_InlineImage::getTypeName() const | |
| 28 | +{ | |
| 29 | + return "inline-image"; | |
| 30 | +} | |
| 31 | + | |
| 20 | 32 | std::string |
| 21 | 33 | QPDF_InlineImage::getVal() const |
| 22 | 34 | { | ... | ... |
libqpdf/QPDF_Integer.cc
| ... | ... | @@ -17,6 +17,18 @@ QPDF_Integer::unparse() |
| 17 | 17 | return QUtil::int_to_string(this->val); |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | +QPDFObject::object_type_e | |
| 21 | +QPDF_Integer::getTypeCode() const | |
| 22 | +{ | |
| 23 | + return QPDFObject::ot_integer; | |
| 24 | +} | |
| 25 | + | |
| 26 | +char const* | |
| 27 | +QPDF_Integer::getTypeName() const | |
| 28 | +{ | |
| 29 | + return "integer"; | |
| 30 | +} | |
| 31 | + | |
| 20 | 32 | long long |
| 21 | 33 | QPDF_Integer::getVal() const |
| 22 | 34 | { | ... | ... |
libqpdf/QPDF_Keyword.cc
| ... | ... | @@ -17,6 +17,18 @@ QPDF_Keyword::unparse() |
| 17 | 17 | return this->val; |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | +QPDFObject::object_type_e | |
| 21 | +QPDF_Keyword::getTypeCode() const | |
| 22 | +{ | |
| 23 | + return QPDFObject::ot_keyword; | |
| 24 | +} | |
| 25 | + | |
| 26 | +char const* | |
| 27 | +QPDF_Keyword::getTypeName() const | |
| 28 | +{ | |
| 29 | + return "keyword"; | |
| 30 | +} | |
| 31 | + | |
| 20 | 32 | std::string |
| 21 | 33 | QPDF_Keyword::getVal() const |
| 22 | 34 | { | ... | ... |
libqpdf/QPDF_Name.cc
| ... | ... | @@ -41,6 +41,18 @@ QPDF_Name::unparse() |
| 41 | 41 | return normalizeName(this->name); |
| 42 | 42 | } |
| 43 | 43 | |
| 44 | +QPDFObject::object_type_e | |
| 45 | +QPDF_Name::getTypeCode() const | |
| 46 | +{ | |
| 47 | + return QPDFObject::ot_name; | |
| 48 | +} | |
| 49 | + | |
| 50 | +char const* | |
| 51 | +QPDF_Name::getTypeName() const | |
| 52 | +{ | |
| 53 | + return "name"; | |
| 54 | +} | |
| 55 | + | |
| 44 | 56 | std::string |
| 45 | 57 | QPDF_Name::getName() const |
| 46 | 58 | { | ... | ... |
libqpdf/QPDF_Null.cc
libqpdf/QPDF_Real.cc
| ... | ... | @@ -22,6 +22,18 @@ QPDF_Real::unparse() |
| 22 | 22 | return this->val; |
| 23 | 23 | } |
| 24 | 24 | |
| 25 | +QPDFObject::object_type_e | |
| 26 | +QPDF_Real::getTypeCode() const | |
| 27 | +{ | |
| 28 | + return QPDFObject::ot_real; | |
| 29 | +} | |
| 30 | + | |
| 31 | +char const* | |
| 32 | +QPDF_Real::getTypeName() const | |
| 33 | +{ | |
| 34 | + return "real"; | |
| 35 | +} | |
| 36 | + | |
| 25 | 37 | std::string |
| 26 | 38 | QPDF_Real::getVal() |
| 27 | 39 | { | ... | ... |
libqpdf/QPDF_Reserved.cc
| ... | ... | @@ -11,3 +11,15 @@ QPDF_Reserved::unparse() |
| 11 | 11 | throw std::logic_error("attempt to unparse QPDF_Reserved"); |
| 12 | 12 | return ""; |
| 13 | 13 | } |
| 14 | + | |
| 15 | +QPDFObject::object_type_e | |
| 16 | +QPDF_Reserved::getTypeCode() const | |
| 17 | +{ | |
| 18 | + return QPDFObject::ot_reserved; | |
| 19 | +} | |
| 20 | + | |
| 21 | +char const* | |
| 22 | +QPDF_Reserved::getTypeName() const | |
| 23 | +{ | |
| 24 | + return "reserved"; | |
| 25 | +} | ... | ... |
libqpdf/QPDF_Stream.cc
| ... | ... | @@ -63,6 +63,18 @@ QPDF_Stream::unparse() |
| 63 | 63 | QUtil::int_to_string(this->generation) + " R"; |
| 64 | 64 | } |
| 65 | 65 | |
| 66 | +QPDFObject::object_type_e | |
| 67 | +QPDF_Stream::getTypeCode() const | |
| 68 | +{ | |
| 69 | + return QPDFObject::ot_stream; | |
| 70 | +} | |
| 71 | + | |
| 72 | +char const* | |
| 73 | +QPDF_Stream::getTypeName() const | |
| 74 | +{ | |
| 75 | + return "stream"; | |
| 76 | +} | |
| 77 | + | |
| 66 | 78 | QPDFObjectHandle |
| 67 | 79 | QPDF_Stream::getDict() const |
| 68 | 80 | { | ... | ... |
libqpdf/QPDF_String.cc
| ... | ... | @@ -33,6 +33,18 @@ QPDF_String::unparse() |
| 33 | 33 | return unparse(false); |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | +QPDFObject::object_type_e | |
| 37 | +QPDF_String::getTypeCode() const | |
| 38 | +{ | |
| 39 | + return QPDFObject::ot_string; | |
| 40 | +} | |
| 41 | + | |
| 42 | +char const* | |
| 43 | +QPDF_String::getTypeName() const | |
| 44 | +{ | |
| 45 | + return "string"; | |
| 46 | +} | |
| 47 | + | |
| 36 | 48 | std::string |
| 37 | 49 | QPDF_String::unparse(bool force_binary) |
| 38 | 50 | { | ... | ... |
libqpdf/qpdf/QPDF_Array.hh
| ... | ... | @@ -12,6 +12,8 @@ class QPDF_Array: public QPDFObject |
| 12 | 12 | QPDF_Array(std::vector<QPDFObjectHandle> const& items); |
| 13 | 13 | virtual ~QPDF_Array(); |
| 14 | 14 | virtual std::string unparse(); |
| 15 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 16 | + virtual char const* getTypeName() const; | |
| 15 | 17 | |
| 16 | 18 | int getNItems() const; |
| 17 | 19 | QPDFObjectHandle getItem(int n) const; | ... | ... |
libqpdf/qpdf/QPDF_Bool.hh
| ... | ... | @@ -9,6 +9,8 @@ class QPDF_Bool: public QPDFObject |
| 9 | 9 | QPDF_Bool(bool val); |
| 10 | 10 | virtual ~QPDF_Bool(); |
| 11 | 11 | virtual std::string unparse(); |
| 12 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 13 | + virtual char const* getTypeName() const; | |
| 12 | 14 | bool getVal() const; |
| 13 | 15 | |
| 14 | 16 | private: | ... | ... |
libqpdf/qpdf/QPDF_Dictionary.hh
| ... | ... | @@ -14,6 +14,8 @@ class QPDF_Dictionary: public QPDFObject |
| 14 | 14 | QPDF_Dictionary(std::map<std::string, QPDFObjectHandle> const& items); |
| 15 | 15 | virtual ~QPDF_Dictionary(); |
| 16 | 16 | virtual std::string unparse(); |
| 17 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 18 | + virtual char const* getTypeName() const; | |
| 17 | 19 | |
| 18 | 20 | // hasKey() and getKeys() treat keys with null values as if they |
| 19 | 21 | // aren't there. getKey() returns null for the value of a | ... | ... |
libqpdf/qpdf/QPDF_InlineImage.hh
| ... | ... | @@ -9,6 +9,8 @@ class QPDF_InlineImage: public QPDFObject |
| 9 | 9 | QPDF_InlineImage(std::string const& val); |
| 10 | 10 | virtual ~QPDF_InlineImage(); |
| 11 | 11 | virtual std::string unparse(); |
| 12 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 13 | + virtual char const* getTypeName() const; | |
| 12 | 14 | std::string getVal() const; |
| 13 | 15 | |
| 14 | 16 | private: | ... | ... |
libqpdf/qpdf/QPDF_Integer.hh
| ... | ... | @@ -9,6 +9,8 @@ class QPDF_Integer: public QPDFObject |
| 9 | 9 | QPDF_Integer(long long val); |
| 10 | 10 | virtual ~QPDF_Integer(); |
| 11 | 11 | virtual std::string unparse(); |
| 12 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 13 | + virtual char const* getTypeName() const; | |
| 12 | 14 | long long getVal() const; |
| 13 | 15 | |
| 14 | 16 | private: | ... | ... |
libqpdf/qpdf/QPDF_Keyword.hh
| ... | ... | @@ -9,6 +9,8 @@ class QPDF_Keyword: public QPDFObject |
| 9 | 9 | QPDF_Keyword(std::string const& val); |
| 10 | 10 | virtual ~QPDF_Keyword(); |
| 11 | 11 | virtual std::string unparse(); |
| 12 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 13 | + virtual char const* getTypeName() const; | |
| 12 | 14 | std::string getVal() const; |
| 13 | 15 | |
| 14 | 16 | private: | ... | ... |
libqpdf/qpdf/QPDF_Name.hh
| ... | ... | @@ -9,6 +9,8 @@ class QPDF_Name: public QPDFObject |
| 9 | 9 | QPDF_Name(std::string const& name); |
| 10 | 10 | virtual ~QPDF_Name(); |
| 11 | 11 | virtual std::string unparse(); |
| 12 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 13 | + virtual char const* getTypeName() const; | |
| 12 | 14 | std::string getName() const; |
| 13 | 15 | |
| 14 | 16 | // Put # into strings with characters unsuitable for name token | ... | ... |
libqpdf/qpdf/QPDF_Null.hh
libqpdf/qpdf/QPDF_Real.hh
| ... | ... | @@ -10,6 +10,8 @@ class QPDF_Real: public QPDFObject |
| 10 | 10 | QPDF_Real(double value, int decimal_places = 0); |
| 11 | 11 | virtual ~QPDF_Real(); |
| 12 | 12 | virtual std::string unparse(); |
| 13 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 14 | + virtual char const* getTypeName() const; | |
| 13 | 15 | std::string getVal(); |
| 14 | 16 | |
| 15 | 17 | private: | ... | ... |
libqpdf/qpdf/QPDF_Reserved.hh
| ... | ... | @@ -8,6 +8,8 @@ class QPDF_Reserved: public QPDFObject |
| 8 | 8 | public: |
| 9 | 9 | virtual ~QPDF_Reserved(); |
| 10 | 10 | virtual std::string unparse(); |
| 11 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 12 | + virtual char const* getTypeName() const; | |
| 11 | 13 | }; |
| 12 | 14 | |
| 13 | 15 | #endif // __QPDF_RESERVED_HH__ | ... | ... |
libqpdf/qpdf/QPDF_Stream.hh
| ... | ... | @@ -17,6 +17,8 @@ class QPDF_Stream: public QPDFObject |
| 17 | 17 | qpdf_offset_t offset, size_t length); |
| 18 | 18 | virtual ~QPDF_Stream(); |
| 19 | 19 | virtual std::string unparse(); |
| 20 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 21 | + virtual char const* getTypeName() const; | |
| 20 | 22 | QPDFObjectHandle getDict() const; |
| 21 | 23 | |
| 22 | 24 | // See comments in QPDFObjectHandle.hh for these methods. | ... | ... |
libqpdf/qpdf/QPDF_String.hh
| ... | ... | @@ -11,6 +11,8 @@ class QPDF_String: public QPDFObject |
| 11 | 11 | QPDF_String(std::string const& val); |
| 12 | 12 | virtual ~QPDF_String(); |
| 13 | 13 | virtual std::string unparse(); |
| 14 | + virtual QPDFObject::object_type_e getTypeCode() const; | |
| 15 | + virtual char const* getTypeName() const; | |
| 14 | 16 | std::string unparse(bool force_binary); |
| 15 | 17 | std::string getVal() const; |
| 16 | 18 | std::string getUTF8Val() const; | ... | ... |
qpdf/qtest/qpdf/eof-in-inline-image.out
| 1 | -BT | |
| 2 | -/F1 | |
| 3 | -24 | |
| 4 | -Tf | |
| 5 | -72 | |
| 6 | -720 | |
| 7 | -Td | |
| 8 | -(Potato) | |
| 9 | -Tj | |
| 10 | -ET | |
| 11 | -BI | |
| 12 | -/CS | |
| 13 | -/G | |
| 14 | -/W | |
| 15 | -1 | |
| 16 | -/H | |
| 17 | -1 | |
| 18 | -/BPC | |
| 19 | -8 | |
| 20 | -/F | |
| 21 | -/Fl | |
| 22 | -/DP | |
| 23 | -<< /Columns 1 /Predictor 15 >> | |
| 24 | -ID | |
| 1 | +keyword: BT | |
| 2 | +name: /F1 | |
| 3 | +integer: 24 | |
| 4 | +keyword: Tf | |
| 5 | +integer: 72 | |
| 6 | +integer: 720 | |
| 7 | +keyword: Td | |
| 8 | +string: (Potato) | |
| 9 | +keyword: Tj | |
| 10 | +keyword: ET | |
| 11 | +keyword: BI | |
| 12 | +name: /CS | |
| 13 | +name: /G | |
| 14 | +name: /W | |
| 15 | +integer: 1 | |
| 16 | +name: /H | |
| 17 | +integer: 1 | |
| 18 | +name: /BPC | |
| 19 | +integer: 8 | |
| 20 | +name: /F | |
| 21 | +name: /Fl | |
| 22 | +name: /DP | |
| 23 | +dictionary: << /Columns 1 /Predictor 15 >> | |
| 24 | +keyword: ID | |
| 25 | 25 | content stream object 4 0 (stream data, file position 139): EOF found while reading inline image | ... | ... |
qpdf/qtest/qpdf/tokenize-content-streams.out
| 1 | -BT | |
| 2 | -/F1 | |
| 3 | -24 | |
| 4 | -Tf | |
| 5 | -72 | |
| 6 | -720 | |
| 7 | -Td | |
| 8 | -(Potato) | |
| 9 | -Tj | |
| 10 | -ET | |
| 1 | +keyword: BT | |
| 2 | +name: /F1 | |
| 3 | +integer: 24 | |
| 4 | +keyword: Tf | |
| 5 | +integer: 72 | |
| 6 | +integer: 720 | |
| 7 | +keyword: Td | |
| 8 | +string: (Potato) | |
| 9 | +keyword: Tj | |
| 10 | +keyword: ET | |
| 11 | 11 | -EOF- |
| 12 | -0.1 | |
| 13 | -0 | |
| 14 | -0 | |
| 15 | -0.1 | |
| 16 | -0 | |
| 17 | -0 | |
| 18 | -cm | |
| 19 | -q | |
| 20 | -0 | |
| 21 | -1.1999 | |
| 22 | --1.1999 | |
| 23 | -0 | |
| 24 | -121.19 | |
| 25 | -150.009 | |
| 26 | -cm | |
| 27 | -BI | |
| 28 | -/CS | |
| 29 | -/G | |
| 30 | -/W | |
| 31 | -1 | |
| 32 | -/H | |
| 33 | -1 | |
| 34 | -/BPC | |
| 35 | -8 | |
| 36 | -/F | |
| 37 | -/Fl | |
| 38 | -/DP | |
| 39 | -<< /Columns 1 /Predictor 15 >> | |
| 40 | -ID | |
| 41 | -inline image: 789c63fc0f0001030101 | |
| 42 | -EI | |
| 43 | -Q | |
| 44 | -q | |
| 45 | -0 | |
| 46 | -35.997 | |
| 47 | --128.389 | |
| 48 | -0 | |
| 49 | -431.964 | |
| 50 | -7269.02 | |
| 51 | -cm | |
| 52 | -BI | |
| 53 | -/CS | |
| 54 | -/G | |
| 55 | -/W | |
| 56 | -30 | |
| 57 | -/H | |
| 58 | -107 | |
| 59 | -/BPC | |
| 60 | -8 | |
| 61 | -/F | |
| 62 | -/Fl | |
| 63 | -/DP | |
| 64 | -<< /Columns 30 /Predictor 15 >> | |
| 65 | -ID | |
| 66 | -inline image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a | |
| 67 | -EI | |
| 68 | -Q | |
| 69 | -q | |
| 70 | -0 | |
| 71 | -38.3968 | |
| 72 | --93.5922 | |
| 73 | -0 | |
| 74 | -431.964 | |
| 75 | -7567.79 | |
| 76 | -cm | |
| 77 | -BI | |
| 78 | -/CS | |
| 79 | -/G | |
| 80 | -/W | |
| 81 | -32 | |
| 82 | -/H | |
| 83 | -78 | |
| 84 | -/BPC | |
| 85 | -8 | |
| 86 | -/F | |
| 87 | -/Fl | |
| 88 | -/DP | |
| 89 | -<< /Columns 32 /Predictor 15 >> | |
| 90 | -ID | |
| 91 | -inline image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13 | |
| 92 | -EI | |
| 93 | -Q | |
| 12 | +real: 0.1 | |
| 13 | +integer: 0 | |
| 14 | +integer: 0 | |
| 15 | +real: 0.1 | |
| 16 | +integer: 0 | |
| 17 | +integer: 0 | |
| 18 | +keyword: cm | |
| 19 | +keyword: q | |
| 20 | +integer: 0 | |
| 21 | +real: 1.1999 | |
| 22 | +real: -1.1999 | |
| 23 | +integer: 0 | |
| 24 | +real: 121.19 | |
| 25 | +real: 150.009 | |
| 26 | +keyword: cm | |
| 27 | +keyword: BI | |
| 28 | +name: /CS | |
| 29 | +name: /G | |
| 30 | +name: /W | |
| 31 | +integer: 1 | |
| 32 | +name: /H | |
| 33 | +integer: 1 | |
| 34 | +name: /BPC | |
| 35 | +integer: 8 | |
| 36 | +name: /F | |
| 37 | +name: /Fl | |
| 38 | +name: /DP | |
| 39 | +dictionary: << /Columns 1 /Predictor 15 >> | |
| 40 | +keyword: ID | |
| 41 | +inline-image: 789c63fc0f0001030101 | |
| 42 | +keyword: EI | |
| 43 | +keyword: Q | |
| 44 | +keyword: q | |
| 45 | +integer: 0 | |
| 46 | +real: 35.997 | |
| 47 | +real: -128.389 | |
| 48 | +integer: 0 | |
| 49 | +real: 431.964 | |
| 50 | +real: 7269.02 | |
| 51 | +keyword: cm | |
| 52 | +keyword: BI | |
| 53 | +name: /CS | |
| 54 | +name: /G | |
| 55 | +name: /W | |
| 56 | +integer: 30 | |
| 57 | +name: /H | |
| 58 | +integer: 107 | |
| 59 | +name: /BPC | |
| 60 | +integer: 8 | |
| 61 | +name: /F | |
| 62 | +name: /Fl | |
| 63 | +name: /DP | |
| 64 | +dictionary: << /Columns 30 /Predictor 15 >> | |
| 65 | +keyword: ID | |
| 66 | +inline-image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a | |
| 67 | +keyword: EI | |
| 68 | +keyword: Q | |
| 69 | +keyword: q | |
| 70 | +integer: 0 | |
| 71 | +real: 38.3968 | |
| 72 | +real: -93.5922 | |
| 73 | +integer: 0 | |
| 74 | +real: 431.964 | |
| 75 | +real: 7567.79 | |
| 76 | +keyword: cm | |
| 77 | +keyword: BI | |
| 78 | +name: /CS | |
| 79 | +name: /G | |
| 80 | +name: /W | |
| 81 | +integer: 32 | |
| 82 | +name: /H | |
| 83 | +integer: 78 | |
| 84 | +name: /BPC | |
| 85 | +integer: 8 | |
| 86 | +name: /F | |
| 87 | +name: /Fl | |
| 88 | +name: /DP | |
| 89 | +dictionary: << /Columns 32 /Predictor 15 >> | |
| 90 | +keyword: ID | |
| 91 | +inline-image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13 | |
| 92 | +keyword: EI | |
| 93 | +keyword: Q | |
| 94 | 94 | -EOF- |
| 95 | 95 | test 37 done | ... | ... |
qpdf/test_driver.cc
| ... | ... | @@ -72,10 +72,11 @@ class ParserCallbacks: public QPDFObjectHandle::ParserCallbacks |
| 72 | 72 | void |
| 73 | 73 | ParserCallbacks::handleObject(QPDFObjectHandle obj) |
| 74 | 74 | { |
| 75 | + std::cout << obj.getTypeName() << ": "; | |
| 75 | 76 | if (obj.isInlineImage()) |
| 76 | 77 | { |
| 78 | + assert(obj.getTypeCode() == QPDFObject::ot_inlineimage); | |
| 77 | 79 | std::string val = obj.getInlineImageValue(); |
| 78 | - std::cout << "inline image: "; | |
| 79 | 80 | char buf[3]; |
| 80 | 81 | buf[2] = '\0'; |
| 81 | 82 | for (size_t i = 0; i < val.length(); ++i) |
| ... | ... | @@ -142,6 +143,10 @@ void runtest(int n, char const* filename1, char const* arg2) |
| 142 | 143 | assert(password.length() == 32); |
| 143 | 144 | QPDF::trim_user_password(password); |
| 144 | 145 | assert(password == "1234567890123456789012(45678"); |
| 146 | + | |
| 147 | + QPDFObjectHandle uninitialized; | |
| 148 | + assert(uninitialized.getTypeCode() == QPDFObject::ot_uninitialized); | |
| 149 | + assert(strcmp(uninitialized.getTypeName(), "uninitialized") == 0); | |
| 145 | 150 | } |
| 146 | 151 | |
| 147 | 152 | QPDF pdf; | ... | ... |