Commit 06b818dcd39b5aeaeeee5c247483633a02a0222e
Committed by
Jay Berkenbilt
1 parent
5e0ba126
Exclude signature dictionary from compressible objects
It seems better not to compress signature dictionaries. Various PDF digital signing tools, including Adobe Acrobat Reader DC, do not compress signature dictionaries. Table 8.93 "Entries in a signature dictionary" in PDF 1.5 reference describes that /ByteRange in the signature dictionary shall be used to describe a digest that does not include the signature value (/Contents) itself. The byte ranges cannot be determined if the dictionary is compressed.
Showing
2 changed files
with
9 additions
and
3 deletions
libqpdf/QPDF.cc
| ... | ... | @@ -2673,7 +2673,13 @@ QPDF::getCompressibleObjGens() |
| 2673 | 2673 | { |
| 2674 | 2674 | QTC::TC("qpdf", "QPDF exclude encryption dictionary"); |
| 2675 | 2675 | } |
| 2676 | - else if (! obj.isStream()) | |
| 2676 | + else if ((! obj.isStream()) && | |
| 2677 | + (! (obj.isDictionary() && | |
| 2678 | + obj.hasKey("/ByteRange") && | |
| 2679 | + obj.hasKey("/Contents") && | |
| 2680 | + obj.hasKey("/Type") && | |
| 2681 | + obj.getKey("/Type").isName() && | |
| 2682 | + obj.getKey("/Type").getName() == "/Sig"))) | |
| 2677 | 2683 | { |
| 2678 | 2684 | result.push_back(og); |
| 2679 | 2685 | } | ... | ... |
qpdf/qtest/qpdf.test
| ... | ... | @@ -3998,9 +3998,9 @@ $td->runtest("fix-qdf with big object stream", # > 255 objects in a stream |
| 3998 | 3998 | show_ntests(); |
| 3999 | 3999 | # ---------- |
| 4000 | 4000 | $td->notify("--- Signature Dictionary ---"); |
| 4001 | -$n_tests += 4; | |
| 4001 | +$n_tests += 6; | |
| 4002 | 4002 | |
| 4003 | -foreach my $i (qw(preserve disable)) | |
| 4003 | +foreach my $i (qw(preserve disable generate)) | |
| 4004 | 4004 | { |
| 4005 | 4005 | $td->runtest("sig dict contents hex (object-streams=$i)", |
| 4006 | 4006 | {$td->COMMAND => | ... | ... |