aboutsummaryrefslogtreecommitdiffstats
path: root/examples/pdf-parse-content.cc
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 /examples/pdf-parse-content.cc
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 'examples/pdf-parse-content.cc')
-rw-r--r--examples/pdf-parse-content.cc97
1 files changed, 97 insertions, 0 deletions
diff --git a/examples/pdf-parse-content.cc b/examples/pdf-parse-content.cc
new file mode 100644
index 00000000..1c3cae16
--- /dev/null
+++ b/examples/pdf-parse-content.cc
@@ -0,0 +1,97 @@
+#include <iostream>
+#include <string.h>
+#include <stdlib.h>
+
+#include <qpdf/QPDF.hh>
+#include <qpdf/QUtil.hh>
+
+static char const* whoami = 0;
+
+void usage()
+{
+ std::cerr << "Usage: " << whoami << " filename page-number" << std::endl
+ << "Prints a dump of the objects in the content streams"
+ << " of the given page." << std::endl
+ << "Pages are numbered from 1." << std::endl;
+ exit(2);
+}
+
+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;
+}
+
+int main(int argc, char* argv[])
+{
+ whoami = QUtil::getWhoami(argv[0]);
+
+ // For libtool's sake....
+ if (strncmp(whoami, "lt-", 3) == 0)
+ {
+ whoami += 3;
+ }
+
+ if (argc != 3)
+ {
+ usage();
+ }
+ char const* filename = argv[1];
+ int pageno = atoi(argv[2]);
+
+ try
+ {
+ QPDF pdf;
+ pdf.processFile(filename);
+ std::vector<QPDFObjectHandle> pages = pdf.getAllPages();
+ if ((pageno < 1) || (pageno > (int)pages.size()))
+ {
+ usage();
+ }
+
+ QPDFObjectHandle page = pages[pageno-1];
+ QPDFObjectHandle contents = page.getKey("/Contents");
+ ParserCallbacks cb;
+ QPDFObjectHandle::parseContentStream(contents, &cb);
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << whoami << ": " << e.what() << std::endl;
+ exit(2);
+ }
+
+ return 0;
+}