aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-08-05 23:51:19 +0200
committerJay Berkenbilt <ejb@ql.org>2010-08-05 23:51:19 +0200
commit9ba5b27ce4ae8e42c836efedf44d08146e8eefa8 (patch)
tree261c41ab464432bca6f8444f948012dab750cc40 /examples
parent2dbc1006fb4a176c6ca7418f6e6e27251a4b8142 (diff)
downloadqpdf-9ba5b27ce4ae8e42c836efedf44d08146e8eefa8.tar.zst
add double-page-size example
git-svn-id: svn+q:///qpdf/trunk@996 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'examples')
-rw-r--r--examples/build.mk2
-rw-r--r--examples/double-page-size.cc113
-rw-r--r--examples/qtest/double-page-size.test31
-rw-r--r--examples/qtest/double-page-size/in.pdf55
-rw-r--r--examples/qtest/double-page-size/out.pdf69
5 files changed, 269 insertions, 1 deletions
diff --git a/examples/build.mk b/examples/build.mk
index 5c2b24de..f2e0432d 100644
--- a/examples/build.mk
+++ b/examples/build.mk
@@ -1,4 +1,4 @@
-BINS_examples = pdf-bookmarks pdf-mod-info pdf-npages
+BINS_examples = pdf-bookmarks pdf-mod-info pdf-npages double-page-size
CBINS_examples = pdf-linearize
TARGETS_examples = $(foreach B,$(BINS_examples) $(CBINS_examples),examples/$(OUTPUT_DIR)/$(call binname,$(B)))
diff --git a/examples/double-page-size.cc b/examples/double-page-size.cc
new file mode 100644
index 00000000..e933b5ac
--- /dev/null
+++ b/examples/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;
+}
diff --git a/examples/qtest/double-page-size.test b/examples/qtest/double-page-size.test
new file mode 100644
index 00000000..79e74862
--- /dev/null
+++ b/examples/qtest/double-page-size.test
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+require 5.008;
+BEGIN { $^W = 1; }
+use strict;
+
+chdir("double-page-size") or die "chdir testdir failed: $!\n";
+
+require TestDriver;
+
+my $td = new TestDriver('double-page-size');
+
+cleanup();
+
+$td->runtest("double page size",
+ {$td->COMMAND => "double-page-size in.pdf a.pdf"},
+ {$td->STRING => "double-page-size: new file written to a.pdf\n",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "out.pdf"});
+
+cleanup();
+
+$td->report(2);
+
+sub cleanup
+{
+ unlink 'a.pdf';
+}
diff --git a/examples/qtest/double-page-size/in.pdf b/examples/qtest/double-page-size/in.pdf
new file mode 100644
index 00000000..84f252be
--- /dev/null
+++ b/examples/qtest/double-page-size/in.pdf
@@ -0,0 +1,55 @@
+%PDF-1.3
+%¿÷¢þ
+1 0 obj
+<< /Pages 2 0 R /Type /Catalog >>
+endobj
+2 0 obj
+<< /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >>
+endobj
+3 0 obj
+<< /Contents 5 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 6 0 R >> /ProcSet 7 0 R >> /Type /Page >>
+endobj
+4 0 obj
+<< /Contents 8 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 6 0 R >> /ProcSet 7 0 R >> /Type /Page >>
+endobj
+5 0 obj
+<< /Length 44 >>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+6 0 obj
+<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>
+endobj
+7 0 obj
+[ /PDF /Text ]
+endobj
+8 0 obj
+<< /Length 43 >>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Salad) Tj
+ET
+endstream
+endobj
+xref
+0 9
+0000000000 65535 f
+0000000015 00000 n
+0000000064 00000 n
+0000000129 00000 n
+0000000272 00000 n
+0000000415 00000 n
+0000000508 00000 n
+0000000615 00000 n
+0000000645 00000 n
+trailer << /Root 1 0 R /Size 9 /ID [<071a6499182be9cfc990b11d0c4e5bc0><90dbb2f2f000af76d1107187b0e00349>] >>
+startxref
+737
+%%EOF
diff --git a/examples/qtest/double-page-size/out.pdf b/examples/qtest/double-page-size/out.pdf
new file mode 100644
index 00000000..e27706ca
--- /dev/null
+++ b/examples/qtest/double-page-size/out.pdf
@@ -0,0 +1,69 @@
+%PDF-1.3
+%¿÷¢þ
+1 0 obj
+<< /Pages 2 0 R /Type /Catalog >>
+endobj
+2 0 obj
+<< /Count 2 /Kids [ 3 0 R 4 0 R ] /Type /Pages >>
+endobj
+3 0 obj
+<< /Contents [ 5 0 R 6 0 R ] /MediaBox [ 0.00 0.00 1224.00 1584.00 ] /Parent 2 0 R /Resources << /Font << /F1 7 0 R >> /ProcSet 8 0 R >> /Type /Page >>
+endobj
+4 0 obj
+<< /Contents [ 9 0 R 10 0 R ] /MediaBox [ 0.00 0.00 1224.00 1584.00 ] /Parent 2 0 R /Resources << /Font << /F1 7 0 R >> /ProcSet 8 0 R >> /Type /Page >>
+endobj
+5 0 obj
+<< /Length 15 >>
+stream
+2 0 0 2 0 0 cm
+endstream
+endobj
+6 0 obj
+<< /Length 44 >>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+7 0 obj
+<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>
+endobj
+8 0 obj
+[ /PDF /Text ]
+endobj
+9 0 obj
+<< /Length 15 >>
+stream
+2 0 0 2 0 0 cm
+endstream
+endobj
+10 0 obj
+<< /Length 43 >>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Salad) Tj
+ET
+endstream
+endobj
+xref
+0 11
+0000000000 65535 f
+0000000015 00000 n
+0000000064 00000 n
+0000000129 00000 n
+0000000296 00000 n
+0000000464 00000 n
+0000000528 00000 n
+0000000621 00000 n
+0000000728 00000 n
+0000000758 00000 n
+0000000822 00000 n
+trailer << /Root 1 0 R /Size 11 /ID [<071a6499182be9cfc990b11d0c4e5bc0><31415926535897932384626433832795>] >>
+startxref
+915
+%%EOF