Commit 2712869cf96916bceeac7def35b6d0a54bd10316

Authored by Jay Berkenbilt
1 parent 52f9d326

Fix logic for when to compress object and xref streams (fixes #271)

ChangeLog
1 1 2019-01-28 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * Bug fix: when using --stream-data=compress, object streams and
  4 + xref streams were not compressed. They were compressed if no
  5 + --stream-data option was specified. Fixes #271.
  6 +
3 7 * When linearizing or getting the list of all pages in a file,
4 8 replace duplicated page objects with a shallow copy of the page
5 9 object. Linearization and all page manipulation APIs require page
... ...
... ... @@ -9,10 +9,6 @@ Soon
9 9 latter is appropriate when a page is being converted to a form
10 10 XObject.
11 11  
12   - * Look at the file for issue 271 (../misc/bugs/271/6059954.pdf) to
13   - figure out why the compression is bad and see if I can do anything
14   - about it.
15   -
16 12 Next ABI
17 13 ========
18 14  
... ...
libqpdf/QPDFWriter.cc
... ... @@ -1934,7 +1934,9 @@ QPDFWriter::writeObjectStream(QPDFObjectHandle object)
1934 1934  
1935 1935 // Set up a stream to write the stream data into a buffer.
1936 1936 Pipeline* next = pushPipeline(new Pl_Buffer("object stream"));
1937   - if (! (this->m->stream_decode_level || this->m->qdf_mode))
  1937 + if ((this->m->compress_streams ||
  1938 + (this->m->stream_decode_level == qpdf_dl_none)) &&
  1939 + (! this->m->qdf_mode))
1938 1940 {
1939 1941 compressed = true;
1940 1942 next = pushPipeline(
... ... @@ -2876,7 +2878,9 @@ QPDFWriter::writeXRefStream(int xref_id, int max_id, qpdf_offset_t max_offset,
2876 2878  
2877 2879 Pipeline* p = pushPipeline(new Pl_Buffer("xref stream"));
2878 2880 bool compressed = false;
2879   - if (! (this->m->stream_decode_level || this->m->qdf_mode))
  2881 + if ((this->m->compress_streams ||
  2882 + (this->m->stream_decode_level == qpdf_dl_none)) &&
  2883 + (! this->m->qdf_mode))
2880 2884 {
2881 2885 compressed = true;
2882 2886 if (! skip_compression)
... ...
manual/qpdf-manual.xml
... ... @@ -4417,6 +4417,13 @@ print &quot;\n&quot;;
4417 4417 pages tree.
4418 4418 </para>
4419 4419 </listitem>
  4420 + <listitem>
  4421 + <para>
  4422 + Using older option <option>--stream-data=compress</option>
  4423 + with object streams, object streams and xref streams were
  4424 + not compressed.
  4425 + </para>
  4426 + </listitem>
4420 4427 </itemizedlist>
4421 4428 </listitem>
4422 4429 <listitem>
... ...
qpdf/qtest/qpdf.test
... ... @@ -1435,7 +1435,7 @@ foreach my $d (
1435 1435 " $flags streams-with-newlines.pdf a.pdf"},
1436 1436 {$td->STRING => "", $td->EXIT_STATUS => 0},
1437 1437 $td->NORMALIZE_NEWLINES);
1438   - $td->runtest("check output",
  1438 + $td->runtest("check output ($description)",
1439 1439 {$td->FILE => "a.pdf"},
1440 1440 {$td->FILE => "newline-before-endstream-$suffix.pdf"});
1441 1441 if ($flags =~ /qdf/)
... ... @@ -2461,7 +2461,7 @@ for (my $n = 16; $n &lt;= 19; ++$n)
2461 2461 show_ntests();
2462 2462 # ----------
2463 2463 $td->notify("--- Specific File Tests ---");
2464   -$n_tests += 2;
  2464 +$n_tests += 4;
2465 2465  
2466 2466 # Special PDF files that caused problems at some point
2467 2467  
... ... @@ -2473,6 +2473,15 @@ $td-&gt;runtest(&quot;damaged stream (C)&quot;,
2473 2473 {$td->COMMAND => "qpdf-ctest 2 damaged-stream.pdf '' a.pdf"},
2474 2474 {$td->FILE => "damaged-stream-c-check.out", $td->EXIT_STATUS => 0},
2475 2475 $td->NORMALIZE_NEWLINES);
  2476 +$td->runtest("compress objstm and xref",
  2477 + {$td->COMMAND =>
  2478 + "qpdf --static-id --stream-data=compress".
  2479 + " --object-streams=generate minimal.pdf a.pdf"},
  2480 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  2481 + $td->NORMALIZE_NEWLINES);
  2482 +$td->runtest("check output",
  2483 + {$td->FILE => "a.pdf"},
  2484 + {$td->FILE => "compress-objstm-xref.pdf"});
2476 2485  
2477 2486 show_ntests();
2478 2487 # ----------
... ...
qpdf/qtest/qpdf/compress-objstm-xref.pdf 0 → 100644
No preview for this file type