From f81152311e5737e5e0de9dd9462311f306c6921b Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 20 Jan 2013 15:26:45 -0500 Subject: Add QPDFObjectHandle::parseContentStream method This method allows parsing of the PDF objects in a content stream or array of content streams. --- examples/pdf-parse-content.cc | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 examples/pdf-parse-content.cc (limited to 'examples/pdf-parse-content.cc') 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 +#include +#include + +#include +#include + +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 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; +} -- cgit v1.2.3-54-g00ecf