summaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2013-01-20 21:26:45 +0100
committerJay Berkenbilt <ejb@ql.org>2013-01-20 21:35:39 +0100
commitf81152311e5737e5e0de9dd9462311f306c6921b (patch)
treee015c0efd7022cc259e898255db872fa52b73ca1 /qpdf
parent1d88955fa68fb7fb0fd2d705bc80655edb7a5972 (diff)
downloadqpdf-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.testcov4
-rw-r--r--qpdf/qtest/qpdf.test12
-rw-r--r--qpdf/qtest/qpdf/eof-in-inline-image.out25
-rw-r--r--qpdf/qtest/qpdf/eof-in-inline-image.pdfbin0 -> 870 bytes
-rw-r--r--qpdf/qtest/qpdf/tokenize-content-streams.out95
-rw-r--r--qpdf/qtest/qpdf/tokenize-content-streams.pdfbin0 -> 1539 bytes
-rw-r--r--qpdf/test_driver.cc52
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
new file mode 100644
index 00000000..e970b77d
--- /dev/null
+++ b/qpdf/qtest/qpdf/eof-in-inline-image.pdf
Binary files differ
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
new file mode 100644
index 00000000..ea97a6e2
--- /dev/null
+++ b/qpdf/qtest/qpdf/tokenize-content-streams.pdf
Binary files differ
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 ") +