diff options
author | Jay Berkenbilt <ejb@ql.org> | 2013-01-20 21:26:45 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2013-01-20 21:35:39 +0100 |
commit | f81152311e5737e5e0de9dd9462311f306c6921b (patch) | |
tree | e015c0efd7022cc259e898255db872fa52b73ca1 /qpdf | |
parent | 1d88955fa68fb7fb0fd2d705bc80655edb7a5972 (diff) | |
download | qpdf-f81152311e5737e5e0de9dd9462311f306c6921b.tar.zst |
Add QPDFObjectHandle::parseContentStream method
This method allows parsing of the PDF objects in a content stream or
array of content streams.
Diffstat (limited to 'qpdf')
-rw-r--r-- | qpdf/qpdf.testcov | 4 | ||||
-rw-r--r-- | qpdf/qtest/qpdf.test | 12 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/eof-in-inline-image.out | 25 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/eof-in-inline-image.pdf | bin | 0 -> 870 bytes | |||
-rw-r--r-- | qpdf/qtest/qpdf/tokenize-content-streams.out | 95 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/tokenize-content-streams.pdf | bin | 0 -> 1539 bytes | |||
-rw-r--r-- | qpdf/test_driver.cc | 52 |
7 files changed, 186 insertions, 2 deletions
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index a0578f28..b09e966c 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -236,7 +236,7 @@ QPDFWriter copy use_aes 1 QPDFObjectHandle indirect without context 0 QPDFObjectHandle trailing data in parse 0 qpdf pages encryption password 0 -QPDF_Tokenizer EOF reading token 0 +QPDF_Tokenizer EOF reading token 1 QPDF_Tokenizer EOF reading appendable token 0 QPDFWriter extra header text no newline 0 QPDFWriter extra header text add newline 0 @@ -259,3 +259,5 @@ QPDFWriter remove Crypt 0 qpdf-c called qpdf_get_pdf_extension_level 0 qpdf-c called qpdf_set_r5_encryption_parameters 0 qpdf-c called qpdf_set_r6_encryption_parameters 0 +QPDFObjectHandle EOF in inline image 0 +QPDFObjectHandle inline image token 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index bf62ceea..8d2b5cfc 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -199,7 +199,7 @@ $td->runtest("remove page we don't have", show_ntests(); # ---------- $td->notify("--- Miscellaneous Tests ---"); -$n_tests += 57; +$n_tests += 59; $td->runtest("qpdf version", {$td->COMMAND => "qpdf --version"}, @@ -468,6 +468,16 @@ $td->runtest("check file with leading junk", {$td->COMMAND => "qpdf --check leading-junk.pdf"}, {$td->FILE => "leading-junk.out", $td->EXIT_STATUS => 0}, $td->NORMALIZE_NEWLINES); +$td->runtest("EOF inside inline image", + {$td->COMMAND => "test_driver 37 eof-in-inline-image.pdf"}, + {$td->FILE => "eof-in-inline-image.out", + $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); +$td->runtest("tokenize content streams", + {$td->COMMAND => "test_driver 37 tokenize-content-streams.pdf"}, + {$td->FILE => "tokenize-content-streams.out", + $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); show_ntests(); # ---------- diff --git a/qpdf/qtest/qpdf/eof-in-inline-image.out b/qpdf/qtest/qpdf/eof-in-inline-image.out new file mode 100644 index 00000000..8ac365c4 --- /dev/null +++ b/qpdf/qtest/qpdf/eof-in-inline-image.out @@ -0,0 +1,25 @@ +BT +/F1 +24 +Tf +72 +720 +Td +(Potato) +Tj +ET +BI +/CS +/G +/W +1 +/H +1 +/BPC +8 +/F +/Fl +/DP +<< /Columns 1 /Predictor 15 >> +ID +content stream object 4 0 (stream data, file position 139): EOF found while reading inline image diff --git a/qpdf/qtest/qpdf/eof-in-inline-image.pdf b/qpdf/qtest/qpdf/eof-in-inline-image.pdf Binary files differnew file mode 100644 index 00000000..e970b77d --- /dev/null +++ b/qpdf/qtest/qpdf/eof-in-inline-image.pdf diff --git a/qpdf/qtest/qpdf/tokenize-content-streams.out b/qpdf/qtest/qpdf/tokenize-content-streams.out new file mode 100644 index 00000000..9bc933dc --- /dev/null +++ b/qpdf/qtest/qpdf/tokenize-content-streams.out @@ -0,0 +1,95 @@ +BT +/F1 +24 +Tf +72 +720 +Td +(Potato) +Tj +ET +-EOF- +0.1 +0 +0 +0.1 +0 +0 +cm +q +0 +1.1999 +-1.1999 +0 +121.19 +150.009 +cm +BI +/CS +/G +/W +1 +/H +1 +/BPC +8 +/F +/Fl +/DP +<< /Columns 1 /Predictor 15 >> +ID +inline image: 789c63fc0f0001030101 +EI +Q +q +0 +35.997 +-128.389 +0 +431.964 +7269.02 +cm +BI +/CS +/G +/W +30 +/H +107 +/BPC +8 +/F +/Fl +/DP +<< /Columns 30 /Predictor 15 >> +ID +inline image: 789cedd1a11100300800b1b2ffd06503148283bc8dfcf8af2a306ee352eff2e06318638c31c63b3801627b620a +EI +Q +q +0 +38.3968 +-93.5922 +0 +431.964 +7567.79 +cm +BI +/CS +/G +/W +32 +/H +78 +/BPC +8 +/F +/Fl +/DP +<< /Columns 32 /Predictor 15 >> +ID +inline image: 789c63fccf801f308e2a185530aa60882a20203faa605401890a0643aa1e5530aa6054010d140000bdd03c13 +EI +Q +-EOF- +test 37 done diff --git a/qpdf/qtest/qpdf/tokenize-content-streams.pdf b/qpdf/qtest/qpdf/tokenize-content-streams.pdf Binary files differnew file mode 100644 index 00000000..ea97a6e2 --- /dev/null +++ b/qpdf/qtest/qpdf/tokenize-content-streams.pdf diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index 48017908..cd6aa991 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -58,6 +58,45 @@ class Provider: public QPDFObjectHandle::StreamDataProvider bool bad_length; }; +class ParserCallbacks: public QPDFObjectHandle::ParserCallbacks +{ + public: + virtual ~ParserCallbacks() + { + } + + virtual void handleObject(QPDFObjectHandle); + virtual void handleEOF(); +}; + +void +ParserCallbacks::handleObject(QPDFObjectHandle obj) +{ + if (obj.isInlineImage()) + { + std::string val = obj.getInlineImageValue(); + std::cout << "inline image: "; + char buf[3]; + buf[2] = '\0'; + for (size_t i = 0; i < val.length(); ++i) + { + sprintf(buf, "%02x", (unsigned char)(val[i])); + std::cout << buf; + } + std::cout << std::endl; + } + else + { + std::cout << obj.unparse() << std::endl; + } +} + +void +ParserCallbacks::handleEOF() +{ + std::cout << "-EOF-" << std::endl; +} + static std::string getPageContents(QPDFObjectHandle page) { PointerHolder<Buffer> b1 = @@ -1245,6 +1284,19 @@ void runtest(int n, char const* filename1, char const* arg2) } } } + else if (n == 37) + { + // Parse content streams of all pages + std::vector<QPDFObjectHandle> pages = pdf.getAllPages(); + for (std::vector<QPDFObjectHandle>::iterator iter = pages.begin(); + iter != pages.end(); ++iter) + { + QPDFObjectHandle page = *iter; + QPDFObjectHandle contents = page.getKey("/Contents"); + ParserCallbacks cb; + QPDFObjectHandle::parseContentStream(contents, &cb); + } + } else { throw std::runtime_error(std::string("invalid test ") + |