Commit bd7261da9b3735688e8dcaeefe21294a1d13afd6
1 parent
54303cea
getRawStreamData()
git-svn-id: svn+q:///qpdf/trunk@1010 71b93d88-0707-0410-a8cf-f5a4172ac649
Showing
12 changed files
with
176 additions
and
3 deletions
ChangeLog
TODO
| 1 | 2.2.0 | 1 | 2.2.0 |
| 2 | ===== | 2 | ===== |
| 3 | 3 | ||
| 4 | - * Add QPDFObjectHandle::getRawStreamData() | ||
| 5 | - | ||
| 6 | * shared library version information already bumped for 2.2.rc1; | 4 | * shared library version information already bumped for 2.2.rc1; |
| 7 | replace 2.2.rc1 with 2.2.0 in manual and update in other places for | 5 | replace 2.2.rc1 with 2.2.0 in manual and update in other places for |
| 8 | 2.2.0. | 6 | 2.2.0. |
include/qpdf/QPDFObjectHandle.hh
| @@ -216,6 +216,9 @@ class QPDFObjectHandle | @@ -216,6 +216,9 @@ class QPDFObjectHandle | ||
| 216 | // exception if the stream is filtered and we can't decode it. | 216 | // exception if the stream is filtered and we can't decode it. |
| 217 | QPDF_DLL | 217 | QPDF_DLL |
| 218 | PointerHolder<Buffer> getStreamData(); | 218 | PointerHolder<Buffer> getStreamData(); |
| 219 | + // Returns unfiltered (raw) stream data. | ||
| 220 | + QPDF_DLL | ||
| 221 | + PointerHolder<Buffer> getRawStreamData(); | ||
| 219 | 222 | ||
| 220 | // Write stream data through the given pipeline. A null pipeline | 223 | // Write stream data through the given pipeline. A null pipeline |
| 221 | // value may be used if all you want to do is determine whether a | 224 | // value may be used if all you want to do is determine whether a |
libqpdf/QPDFObjectHandle.cc
| @@ -343,6 +343,13 @@ QPDFObjectHandle::getStreamData() | @@ -343,6 +343,13 @@ QPDFObjectHandle::getStreamData() | ||
| 343 | return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getStreamData(); | 343 | return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getStreamData(); |
| 344 | } | 344 | } |
| 345 | 345 | ||
| 346 | +PointerHolder<Buffer> | ||
| 347 | +QPDFObjectHandle::getRawStreamData() | ||
| 348 | +{ | ||
| 349 | + assertType("Stream", isStream()); | ||
| 350 | + return dynamic_cast<QPDF_Stream*>(obj.getPointer())->getRawStreamData(); | ||
| 351 | +} | ||
| 352 | + | ||
| 346 | bool | 353 | bool |
| 347 | QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, | 354 | QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter, |
| 348 | bool normalize, bool compress) | 355 | bool normalize, bool compress) |
libqpdf/QPDF_Stream.cc
| @@ -75,6 +75,16 @@ QPDF_Stream::getStreamData() | @@ -75,6 +75,16 @@ QPDF_Stream::getStreamData() | ||
| 75 | { | 75 | { |
| 76 | throw std::logic_error("getStreamData called on unfilterable stream"); | 76 | throw std::logic_error("getStreamData called on unfilterable stream"); |
| 77 | } | 77 | } |
| 78 | + QTC::TC("qpdf", "QPDF_Stream getStreamData"); | ||
| 79 | + return buf.getBuffer(); | ||
| 80 | +} | ||
| 81 | + | ||
| 82 | +PointerHolder<Buffer> | ||
| 83 | +QPDF_Stream::getRawStreamData() | ||
| 84 | +{ | ||
| 85 | + Pl_Buffer buf("stream data buffer"); | ||
| 86 | + pipeStreamData(&buf, false, false, false); | ||
| 87 | + QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); | ||
| 78 | return buf.getBuffer(); | 88 | return buf.getBuffer(); |
| 79 | } | 89 | } |
| 80 | 90 |
libqpdf/qpdf/QPDF_Stream.hh
| @@ -22,6 +22,7 @@ class QPDF_Stream: public QPDFObject | @@ -22,6 +22,7 @@ class QPDF_Stream: public QPDFObject | ||
| 22 | bool pipeStreamData(Pipeline*, bool filter, | 22 | bool pipeStreamData(Pipeline*, bool filter, |
| 23 | bool normalize, bool compress); | 23 | bool normalize, bool compress); |
| 24 | PointerHolder<Buffer> getStreamData(); | 24 | PointerHolder<Buffer> getStreamData(); |
| 25 | + PointerHolder<Buffer> getRawStreamData(); | ||
| 25 | void replaceStreamData(PointerHolder<Buffer> data, | 26 | void replaceStreamData(PointerHolder<Buffer> data, |
| 26 | QPDFObjectHandle const& filter, | 27 | QPDFObjectHandle const& filter, |
| 27 | QPDFObjectHandle const& decode_parms); | 28 | QPDFObjectHandle const& decode_parms); |
manual/qpdf-manual.xml
| @@ -2107,6 +2107,16 @@ print "\n"; | @@ -2107,6 +2107,16 @@ print "\n"; | ||
| 2107 | </listitem> | 2107 | </listitem> |
| 2108 | <listitem> | 2108 | <listitem> |
| 2109 | <para> | 2109 | <para> |
| 2110 | + Add new method in <classname>QPDFObjectHandle</classname>: | ||
| 2111 | + <function>getRawStreamData</function>, which returns the raw | ||
| 2112 | + (unfiltered) stream data into a buffer. This complements the | ||
| 2113 | + <function>getStreamData</function> method, which returns the | ||
| 2114 | + filtered (uncompressed) stream data and can only be used when | ||
| 2115 | + the stream's data is filterable. | ||
| 2116 | + </para> | ||
| 2117 | + </listitem> | ||
| 2118 | + <listitem> | ||
| 2119 | + <para> | ||
| 2110 | Provide two new examples: | 2120 | Provide two new examples: |
| 2111 | <command>pdf-double-page-size</command> and | 2121 | <command>pdf-double-page-size</command> and |
| 2112 | <command>pdf-invert-images</command> that illustrate the newly | 2122 | <command>pdf-invert-images</command> that illustrate the newly |
qpdf/qpdf.testcov
| @@ -183,3 +183,5 @@ QPDFObjectHandle newStream with data 0 | @@ -183,3 +183,5 @@ QPDFObjectHandle newStream with data 0 | ||
| 183 | QPDF_Stream pipe no stream data 0 | 183 | QPDF_Stream pipe no stream data 0 |
| 184 | QPDFObjectHandle prepend page contents 0 | 184 | QPDFObjectHandle prepend page contents 0 |
| 185 | QPDFObjectHandle append page contents 0 | 185 | QPDFObjectHandle append page contents 0 |
| 186 | +QPDF_Stream getRawStreamData 0 | ||
| 187 | +QPDF_Stream getStreamData 0 |
qpdf/qtest/qpdf.test
| @@ -111,7 +111,7 @@ $td->runtest("new stream", | @@ -111,7 +111,7 @@ $td->runtest("new stream", | ||
| 111 | show_ntests(); | 111 | show_ntests(); |
| 112 | # ---------- | 112 | # ---------- |
| 113 | $td->notify("--- Miscellaneous Tests ---"); | 113 | $td->notify("--- Miscellaneous Tests ---"); |
| 114 | -$n_tests += 22; | 114 | +$n_tests += 23; |
| 115 | 115 | ||
| 116 | $td->runtest("qpdf version", | 116 | $td->runtest("qpdf version", |
| 117 | {$td->COMMAND => "qpdf --version"}, | 117 | {$td->COMMAND => "qpdf --version"}, |
| @@ -131,6 +131,11 @@ foreach (my $i = 1; $i <= 3; ++$i) | @@ -131,6 +131,11 @@ foreach (my $i = 1; $i <= 3; ++$i) | ||
| 131 | $td->NORMALIZE_NEWLINES); | 131 | $td->NORMALIZE_NEWLINES); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | +$td->runtest("get stream data", | ||
| 135 | + {$td->COMMAND => "test_driver 11 stream-data.pdf"}, | ||
| 136 | + {$td->FILE => "test11.out", $td->EXIT_STATUS => 0}, | ||
| 137 | + $td->NORMALIZE_NEWLINES); | ||
| 138 | + | ||
| 134 | # Make sure we ignore decode parameters that we don't understand | 139 | # Make sure we ignore decode parameters that we don't understand |
| 135 | $td->runtest("unknown decode parameters", | 140 | $td->runtest("unknown decode parameters", |
| 136 | {$td->COMMAND => "qpdf --check fax-decode-parms.pdf"}, | 141 | {$td->COMMAND => "qpdf --check fax-decode-parms.pdf"}, |
qpdf/qtest/qpdf/stream-data.pdf
0 → 100644
| 1 | +%PDF-1.3 | ||
| 2 | +%¿÷¢þ | ||
| 3 | +%QDF-1.0 | ||
| 4 | + | ||
| 5 | +1 0 obj | ||
| 6 | +<< | ||
| 7 | + /Pages 2 0 R | ||
| 8 | + /QStream 3 0 R | ||
| 9 | + /Type /Catalog | ||
| 10 | +>> | ||
| 11 | +endobj | ||
| 12 | + | ||
| 13 | +2 0 obj | ||
| 14 | +<< | ||
| 15 | + /Count 1 | ||
| 16 | + /Kids [ | ||
| 17 | + 5 0 R | ||
| 18 | + ] | ||
| 19 | + /Type /Pages | ||
| 20 | +>> | ||
| 21 | +endobj | ||
| 22 | + | ||
| 23 | +3 0 obj | ||
| 24 | +<< | ||
| 25 | + /Length 4 0 R | ||
| 26 | + /Filter /ASCIIHexDecode | ||
| 27 | +>> | ||
| 28 | +stream | ||
| 29 | +706F7461746F0A | ||
| 30 | +endstream | ||
| 31 | +endobj | ||
| 32 | + | ||
| 33 | +4 0 obj | ||
| 34 | +15 | ||
| 35 | +endobj | ||
| 36 | + | ||
| 37 | +%% Page 1 | ||
| 38 | +5 0 obj | ||
| 39 | +<< | ||
| 40 | + /Contents 6 0 R | ||
| 41 | + /MediaBox [ | ||
| 42 | + 0 | ||
| 43 | + 0 | ||
| 44 | + 612 | ||
| 45 | + 792 | ||
| 46 | + ] | ||
| 47 | + /Parent 2 0 R | ||
| 48 | + /Resources << | ||
| 49 | + /Font << | ||
| 50 | + /F1 8 0 R | ||
| 51 | + >> | ||
| 52 | + /ProcSet 9 0 R | ||
| 53 | + >> | ||
| 54 | + /Type /Page | ||
| 55 | +>> | ||
| 56 | +endobj | ||
| 57 | + | ||
| 58 | +%% Contents for page 1 | ||
| 59 | +6 0 obj | ||
| 60 | +<< | ||
| 61 | + /Length 7 0 R | ||
| 62 | +>> | ||
| 63 | +stream | ||
| 64 | +BT | ||
| 65 | + /F1 24 Tf | ||
| 66 | + 72 720 Td | ||
| 67 | + (Potato) Tj | ||
| 68 | +ET | ||
| 69 | +endstream | ||
| 70 | +endobj | ||
| 71 | + | ||
| 72 | +7 0 obj | ||
| 73 | +44 | ||
| 74 | +endobj | ||
| 75 | + | ||
| 76 | +8 0 obj | ||
| 77 | +<< | ||
| 78 | + /BaseFont /Helvetica | ||
| 79 | + /Encoding /WinAnsiEncoding | ||
| 80 | + /Name /F1 | ||
| 81 | + /Subtype /Type1 | ||
| 82 | + /Type /Font | ||
| 83 | +>> | ||
| 84 | +endobj | ||
| 85 | + | ||
| 86 | +9 0 obj | ||
| 87 | +[ | ||
| 88 | |||
| 89 | + /Text | ||
| 90 | +] | ||
| 91 | +endobj | ||
| 92 | + | ||
| 93 | +xref | ||
| 94 | +0 10 | ||
| 95 | +0000000000 65535 f | ||
| 96 | +0000000025 00000 n | ||
| 97 | +0000000096 00000 n | ||
| 98 | +0000000168 00000 n | ||
| 99 | +0000000264 00000 n | ||
| 100 | +0000000293 00000 n | ||
| 101 | +0000000508 00000 n | ||
| 102 | +0000000607 00000 n | ||
| 103 | +0000000626 00000 n | ||
| 104 | +0000000744 00000 n | ||
| 105 | +trailer << | ||
| 106 | + /Root 1 0 R | ||
| 107 | + /Size 10 | ||
| 108 | + /ID [<422061d5d2701ad547ece6eb89b05b77><422061d5d2701ad547ece6eb89b05b77>] | ||
| 109 | +>> | ||
| 110 | +startxref | ||
| 111 | +779 | ||
| 112 | +%%EOF |
qpdf/qtest/qpdf/test11.out
0 → 100644
qpdf/test_driver.cc
| @@ -445,6 +445,23 @@ void runtest(int n, char const* filename) | @@ -445,6 +445,23 @@ void runtest(int n, char const* filename) | ||
| 445 | w.setStreamDataMode(qpdf_s_preserve); | 445 | w.setStreamDataMode(qpdf_s_preserve); |
| 446 | w.write(); | 446 | w.write(); |
| 447 | } | 447 | } |
| 448 | + else if (n == 11) | ||
| 449 | + { | ||
| 450 | + QPDFObjectHandle root = pdf.getRoot(); | ||
| 451 | + QPDFObjectHandle qstream = root.getKey("/QStream"); | ||
| 452 | + PointerHolder<Buffer> b1 = qstream.getStreamData(); | ||
| 453 | + PointerHolder<Buffer> b2 = qstream.getRawStreamData(); | ||
| 454 | + if ((b1.getPointer()->getSize() == 7) && | ||
| 455 | + (memcmp(b1.getPointer()->getBuffer(), "potato\n", 7) == 0)) | ||
| 456 | + { | ||
| 457 | + std::cout << "filtered stream data okay" << std::endl; | ||
| 458 | + } | ||
| 459 | + if ((b2.getPointer()->getSize() == 15) && | ||
| 460 | + (memcmp(b2.getPointer()->getBuffer(), "706F7461746F0A\n", 15) == 0)) | ||
| 461 | + { | ||
| 462 | + std::cout << "raw stream data okay" << std::endl; | ||
| 463 | + } | ||
| 464 | + } | ||
| 448 | else | 465 | else |
| 449 | { | 466 | { |
| 450 | throw std::runtime_error(std::string("invalid test ") + | 467 | throw std::runtime_error(std::string("invalid test ") + |