aboutsummaryrefslogtreecommitdiffstats
path: root/examples/pdf-double-page-size.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-08-06 02:37:39 +0200
committerJay Berkenbilt <ejb@ql.org>2010-08-06 02:37:39 +0200
commit6d0e60bf3fe84745586e869bc17364b4d99cf267 (patch)
treed4601947ab59008bf1e98ad7eedd535fb974d1e0 /examples/pdf-double-page-size.cc
parent81b73bb9e9e1c93c6ad6d8e7cd32ab230450c02b (diff)
downloadqpdf-6d0e60bf3fe84745586e869bc17364b4d99cf267.tar.zst
rename
git-svn-id: svn+q:///qpdf/trunk@998 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'examples/pdf-double-page-size.cc')
-rw-r--r--examples/pdf-double-page-size.cc113
1 files changed, 113 insertions, 0 deletions
diff --git a/examples/pdf-double-page-size.cc b/examples/pdf-double-page-size.cc
new file mode 100644
index 00000000..e933b5ac
--- /dev/null
+++ b/examples/pdf-double-page-size.cc
@@ -0,0 +1,113 @@
+#include <iostream>
+#include <string.h>
+#include <stdlib.h>
+#include <qpdf/QPDF.hh>
+#include <qpdf/QUtil.hh>
+#include <qpdf/Buffer.hh>
+#include <qpdf/QPDFWriter.hh>
+
+static char const* whoami = 0;
+
+void usage()
+{
+ std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf [in-password]"
+ << std::endl
+ << "Double size of all pages in infile.pdf;"
+ << " write output to outfile.pdf" << std::endl;
+ exit(2);
+}
+
+static void doubleBoxSize(QPDFObjectHandle& page, char const* box_name)
+{
+ QPDFObjectHandle box = page.getKey(box_name);
+ if (box.isNull())
+ {
+ return;
+ }
+ if (! (box.isArray() && (box.getArrayNItems() == 4)))
+ {
+ throw std::runtime_error(std::string("box ") + box_name +
+ " is not an array of four elements");
+ }
+ std::vector<QPDFObjectHandle> doubled;
+ for (unsigned int i = 0; i < 4; ++i)
+ {
+ doubled.push_back(
+ QPDFObjectHandle::newReal(
+ QUtil::double_to_string(
+ box.getArrayItem(i).getNumericValue() * 2.0, 2)));
+ }
+ page.replaceKey(box_name, QPDFObjectHandle::newArray(doubled));
+}
+
+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) || (argc == 4)))
+ {
+ usage();
+ }
+
+ char const* infilename = argv[1];
+ char const* outfilename = argv[2];
+ char const* password = (argc == 4) ? argv[3] : "";
+
+ // Text to prepend to each page's contents
+ char const* content = "2 0 0 2 0 0 cm\n";
+
+ // Copy text into a buffer without the null terminator
+ PointerHolder<Buffer> b = new Buffer(strlen(content));
+ unsigned char* bp = b.getPointer()->getBuffer();
+ memcpy(bp, (unsigned char*)content, strlen(content));
+
+ try
+ {
+ QPDF qpdf;
+ qpdf.processFile(infilename, password);
+
+ std::vector<QPDFObjectHandle> pages = qpdf.getAllPages();
+ for (std::vector<QPDFObjectHandle>::iterator iter = pages.begin();
+ iter != pages.end(); ++iter)
+ {
+ QPDFObjectHandle& page = *iter;
+
+ // Prepend the buffer to the page's contents
+ page.addPageContents(QPDFObjectHandle::newStream(&qpdf, b), true);
+
+ // Double the size of each of the content boxes
+ doubleBoxSize(page, "/MediaBox");
+ doubleBoxSize(page, "/CropBox");
+ doubleBoxSize(page, "/BleedBox");
+ doubleBoxSize(page, "/TrimBox");
+ doubleBoxSize(page, "/ArtBox");
+ }
+
+ // Write out a new file
+ QPDFWriter w(qpdf, outfilename);
+ if (QUtil::get_env("IN_TESTSUITE"))
+ {
+ // For the test suite, uncompress streams and use static
+ // IDs.
+ w.setStaticID(true);
+ w.setStreamDataMode(qpdf_s_uncompress);
+ }
+ w.write();
+ std::cout << whoami << ": new file written to " << outfilename
+ << std::endl;
+ }
+ catch (std::exception &e)
+ {
+ std::cerr << whoami << " processing file " << infilename << ": "
+ << e.what() << std::endl;
+ exit(2);
+ }
+
+ return 0;
+}