aboutsummaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-12-18 19:08:55 +0100
committerJay Berkenbilt <ejb@ql.org>2018-12-18 22:46:10 +0100
commitf38df27aa3eae905e3ee90365099335e317173d8 (patch)
tree3a0c8ac95e389889cbcee3a92924d2652e2d42a0 /qpdf
parent077d3d451204393d17b9a14c2145487c35fce572 (diff)
downloadqpdf-f38df27aa3eae905e3ee90365099335e317173d8.tar.zst
Add QPDFNumberTreeObjectHelper
Diffstat (limited to 'qpdf')
-rw-r--r--qpdf/qtest/qpdf.test10
-rw-r--r--qpdf/qtest/qpdf/number-tree.out15
-rw-r--r--qpdf/qtest/qpdf/number-tree.pdf171
-rw-r--r--qpdf/test_driver.cc30
4 files changed, 226 insertions, 0 deletions
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index 17497710..9ea5b61d 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -226,6 +226,16 @@ foreach my $input (@ext_inputs)
}
show_ntests();
# ----------
+$td->notify("--- Number Trees ---");
+$n_tests += 1;
+
+$td->runtest("number trees",
+ {$td->COMMAND => "test_driver 46 number-tree.pdf"},
+ {$td->FILE => "number-tree.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+
+show_ntests();
+# ----------
$td->notify("--- Page API Tests ---");
$n_tests += 9;
diff --git a/qpdf/qtest/qpdf/number-tree.out b/qpdf/qtest/qpdf/number-tree.out
new file mode 100644
index 00000000..b4b16535
--- /dev/null
+++ b/qpdf/qtest/qpdf/number-tree.out
@@ -0,0 +1,15 @@
+1 one
+2 two
+3 three
+5 five
+6 six
+9 nine
+11 elephant
+12 twelve
+15 fifteen
+19 nineteen
+20 twenty
+22 twenty-two
+23 twenty-three
+29 twenty-nine
+test 46 done
diff --git a/qpdf/qtest/qpdf/number-tree.pdf b/qpdf/qtest/qpdf/number-tree.pdf
new file mode 100644
index 00000000..35c1e375
--- /dev/null
+++ b/qpdf/qtest/qpdf/number-tree.pdf
@@ -0,0 +1,171 @@
+%PDF-1.3
+%¿÷¢þ
+%QDF-1.0
+
+1 0 obj
+<<
+ /Pages 2 0 R
+ /Type /Catalog
+>>
+endobj
+
+2 0 obj
+<<
+ /Count 1
+ /Kids [
+ 3 0 R
+ ]
+ /Type /Pages
+>>
+endobj
+
+%% Page 1
+3 0 obj
+<<
+ /Contents 4 0 R
+ /MediaBox [
+ 0
+ 0
+ 612
+ 792
+ ]
+ /Parent 2 0 R
+ /Resources <<
+ /Font <<
+ /F1 6 0 R
+ >>
+ /ProcSet 7 0 R
+ >>
+ /Type /Page
+>>
+endobj
+
+%% Contents for page 1
+4 0 obj
+<<
+ /Length 5 0 R
+>>
+stream
+BT
+ /F1 24 Tf
+ 72 720 Td
+ (Potato) Tj
+ET
+endstream
+endobj
+
+5 0 obj
+44
+endobj
+
+6 0 obj
+<<
+ /BaseFont /Helvetica
+ /Encoding /WinAnsiEncoding
+ /Name /F1
+ /Subtype /Type1
+ /Type /Font
+>>
+endobj
+
+7 0 obj
+[
+ /PDF
+ /Text
+]
+endobj
+
+8 0 obj
+<<
+ /Kids [
+ 9 0 R
+ 10 0 R
+ ]
+>>
+endobj
+
+9 0 obj
+<<
+ /Kids [
+ 11 0 R
+ 12 0 R
+ ]
+ /Limits [
+ 0
+ 19
+ ]
+>>
+endobj
+
+10 0 obj
+<<
+ /Limits [
+ 20
+ 29
+ ]
+ /Nums [
+ 20 (twenty)
+ 22 (twenty-two)
+ 23 (twenty-three)
+ 29 (twenty-nine)
+ ]
+>>
+endobj
+
+11 0 obj
+<<
+ /Limits [
+ 0
+ 9
+ ]
+ /Nums [
+ 1 (one)
+ 2 (two)
+ 3 (three)
+ 5 (five)
+ 6 (six)
+ 9 (nine)
+ ]
+>>
+endobj
+
+12 0 obj
+<<
+ /Limits [
+ 11
+ 19
+ ]
+ /Nums [
+ 11 (elephant)
+ 12 (twelve)
+ 15 (fifteen)
+ 19 (nineteen)
+ ]
+>>
+endobj
+
+
+xref
+0 13
+0000000000 65535 f
+0000000025 00000 n
+0000000079 00000 n
+0000000161 00000 n
+0000000376 00000 n
+0000000475 00000 n
+0000000494 00000 n
+0000000612 00000 n
+0000000647 00000 n
+0000000704 00000 n
+0000000791 00000 n
+0000000937 00000 n
+0000001078 00000 n
+trailer <<
+ /Root 1 0 R
+ /QTest 8 0 R
+ /Size 13
+ /ID [<2c3b7a6ec7fc61db8a5db4eebf57f540><2c3b7a6ec7fc61db8a5db4eebf57f540>]
+>>
+startxref
+1215
+%%EOF
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index 74b34396..3bcb173e 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -6,6 +6,7 @@
#include <qpdf/QPDFPageDocumentHelper.hh>
#include <qpdf/QPDFPageObjectHelper.hh>
#include <qpdf/QPDFAcroFormDocumentHelper.hh>
+#include <qpdf/QPDFNumberTreeObjectHelper.hh>
#include <qpdf/QUtil.hh>
#include <qpdf/QTC.hh>
#include <qpdf/Pl_StdioFile.hh>
@@ -1660,6 +1661,35 @@ void runtest(int n, char const* filename1, char const* arg2)
exit(3);
}
}
+ else if (n == 46)
+ {
+ // Test number tree. This test is crafted to work with
+ // number-tree.pdf
+ QPDFObjectHandle qtest = pdf.getTrailer().getKey("/QTest");
+ QPDFNumberTreeObjectHelper ntoh(qtest);
+ QPDFNumberTreeObjectHelper::idx_map ntoh_map = ntoh.getAsMap();
+ for (QPDFNumberTreeObjectHelper::idx_map::iterator iter =
+ ntoh_map.begin();
+ iter != ntoh_map.end(); ++iter)
+ {
+ std::cout << (*iter).first << " "
+ << (*iter).second.getStringValue()
+ << std::endl;
+ }
+ assert(1 == ntoh.getMin());
+ assert(29 == ntoh.getMax());
+ assert(ntoh.hasIndex(6));
+ assert(! ntoh.hasIndex(500));
+ QPDFObjectHandle oh;
+ assert(! ntoh.findObject(4, oh));
+ assert(ntoh.findObject(3, oh));
+ assert("three" == oh.getStringValue());
+ QPDFNumberTreeObjectHelper::numtree_number offset = 0;
+ assert(! ntoh.findObjectAtOrBelow(0, oh, offset));
+ assert(ntoh.findObjectAtOrBelow(8, oh, offset));
+ assert("six" == oh.getStringValue());
+ assert(2 == offset);
+ }
else
{
throw std::runtime_error(std::string("invalid test ") +