diff options
author | Jay Berkenbilt <ejb@ql.org> | 2012-07-08 20:19:19 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2012-07-11 05:34:32 +0200 |
commit | 8a217eb3a26931453b4f003c6c18ad8569230cf1 (patch) | |
tree | dfca77568e0640be6555bfe550a1e334dfb0710e /qpdf/test_driver.cc | |
parent | af64668ad190a3f28fbeb233238cb4a76db67d7c (diff) | |
download | qpdf-8a217eb3a26931453b4f003c6c18ad8569230cf1.tar.zst |
Add concept of reserved objects
QPDFObjectHandle::{new,is,assert}Reserved, QPDF::replaceReserved
provide a mechanism to add objects to a PDF file when there are
circular references. This is a prerequisite to copying objects from
one PDF to another.
Diffstat (limited to 'qpdf/test_driver.cc')
-rw-r--r-- | qpdf/test_driver.cc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index dd8de73e..1e1bd7d8 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -840,6 +840,82 @@ void runtest(int n, char const* filename) std::vector<QPDFObjectHandle> const& pages = pdf.getAllPages(); pdf.removePage(pages.back()); } + else if (n == 24) + { + // Test behavior of reserved objects + QPDFObjectHandle res1 = QPDFObjectHandle::newReserved(&pdf); + QPDFObjectHandle res2 = QPDFObjectHandle::newReserved(&pdf); + QPDFObjectHandle trailer = pdf.getTrailer(); + trailer.replaceKey("Array1", res1); + trailer.replaceKey("Array2", res2); + + QPDFObjectHandle array1 = QPDFObjectHandle::newArray(); + QPDFObjectHandle array2 = QPDFObjectHandle::newArray(); + array1.appendItem(res2); + array1.appendItem(QPDFObjectHandle::newInteger(1)); + array2.appendItem(res1); + array2.appendItem(QPDFObjectHandle::newInteger(2)); + // Make sure trying to ask questions about a reserved object + // doesn't break it. + if (res1.isArray()) + { + std::cout << "oops -- res1 is an array" << std::endl; + } + if (res1.isReserved()) + { + std::cout << "res1 is still reserved after checking if array" + << std::endl; + } + pdf.replaceReserved(res1, array1); + if (res1.isReserved()) + { + std::cout << "oops -- res1 is still reserved" << std::endl; + } + else + { + std::cout << "res1 is no longer reserved" << std::endl; + } + res1.assertArray(); + std::cout << "res1 is an array" << std::endl; + + try + { + res2.unparseResolved(); + std::cout << "oops -- didn't throw" << std::endl; + } + catch (std::logic_error e) + { + std::cout << "logic error: " << e.what() << std::endl; + } + try + { + res2.makeDirect(); + std::cout << "oops -- didn't throw" << std::endl; + } + catch (std::logic_error e) + { + std::cout << "logic error: " << e.what() << std::endl; + } + + pdf.replaceReserved(res2, array2); + + res2.assertArray(); + std::cout << "res2 is an array" << std::endl; + + // Verify that the previously added reserved keys can be + // dereferenced properly now + int i1 = res1.getArrayItem(0).getArrayItem(1).getIntValue(); + int i2 = res2.getArrayItem(0).getArrayItem(1).getIntValue(); + if ((i1 == 2) && (i2 == 1)) + { + std::cout << "circular access and lazy resolution worked" << std::endl; + } + + QPDFWriter w(pdf, "a.pdf"); + w.setStaticID(true); + w.setStreamDataMode(qpdf_s_preserve); + w.write(); + } else { throw std::runtime_error(std::string("invalid test ") + |