diff options
author | Jay Berkenbilt <ejb@ql.org> | 2024-01-06 22:51:03 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2024-01-06 22:51:03 +0100 |
commit | 2994f9cf4cc45e33406de34d4bce45ca491df98e (patch) | |
tree | e108755c1deb2a7cc711e44d7dbe9b693c8b4cef /qpdf | |
parent | 8a24287c392969d1aa25bc9aaabc3502c0bbaf08 (diff) | |
download | qpdf-2994f9cf4cc45e33406de34d4bce45ca491df98e.tar.zst |
Attempt to find xref streams during recovery (fixes #1103)
Diffstat (limited to 'qpdf')
-rw-r--r-- | qpdf/qpdf.testcov | 1 | ||||
-rw-r--r-- | qpdf/qtest/object-stream.test | 12 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/bad7-recover.out | 2 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/issue-146.out | 3 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/issue-148.out | 7 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/issue-150.out | 1 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/issue-202.out | 2 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/recover-xref-stream-recovered.pdf | bin | 0 -> 968 bytes | |||
-rw-r--r-- | qpdf/qtest/qpdf/recover-xref-stream.out | 5 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/recover-xref-stream.pdf | bin | 0 -> 3817 bytes |
10 files changed, 31 insertions, 2 deletions
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index cbb4ac1d..df2555d6 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -689,3 +689,4 @@ QPDFPageObjectHelper used fallback without copying 0 QPDF skipping cache for known unchecked object 0 QPDF fix dangling triggered xref reconstruction 0 QPDFPageDocumentHelper flatten resources missing or invalid 0 +QPDF recover xref stream 0 diff --git a/qpdf/qtest/object-stream.test b/qpdf/qtest/object-stream.test index 04d1bb0d..22b35af4 100644 --- a/qpdf/qtest/object-stream.test +++ b/qpdf/qtest/object-stream.test @@ -16,7 +16,7 @@ cleanup(); my $td = new TestDriver('object-stream'); -my $n_tests = 3 + (36 * 4) + (12 * 2); +my $n_tests = 5 + (36 * 4) + (12 * 2); my $n_compare_pdfs = 36; for (my $n = 16; $n <= 19; ++$n) @@ -87,5 +87,15 @@ $td->runtest("check file", {$td->FILE => "gen1.qdf"}); +# Recover a file with xref streams +$td->runtest("recover file with xref stream", + {$td->COMMAND => "qpdf --static-id --compress-streams=n" . + " recover-xref-stream.pdf a.pdf"}, + {$td->FILE => "recover-xref-stream.out", $td->EXIT_STATUS => 3}, + $td->NORMALIZE_NEWLINES); +$td->runtest("check file", + {$td->FILE => "a.pdf"}, + {$td->FILE => "recover-xref-stream-recovered.pdf"}); + cleanup(); $td->report(calc_ntests($n_tests, $n_compare_pdfs)); diff --git a/qpdf/qtest/qpdf/bad7-recover.out b/qpdf/qtest/qpdf/bad7-recover.out index 1b39acd9..0e5d4a6c 100644 --- a/qpdf/qtest/qpdf/bad7-recover.out +++ b/qpdf/qtest/qpdf/bad7-recover.out @@ -1,4 +1,6 @@ WARNING: bad7.pdf: file is damaged WARNING: bad7.pdf (offset 698): expected trailer dictionary WARNING: bad7.pdf: Attempting to reconstruct cross-reference table +WARNING: bad7.pdf (object 2 0, offset 128): expected endobj +WARNING: bad7.pdf (object 4 0, offset 389): expected endobj bad7.pdf: unable to find trailer dictionary while recovering damaged file diff --git a/qpdf/qtest/qpdf/issue-146.out b/qpdf/qtest/qpdf/issue-146.out index 0aa23ed8..3e3b50da 100644 --- a/qpdf/qtest/qpdf/issue-146.out +++ b/qpdf/qtest/qpdf/issue-146.out @@ -2,4 +2,7 @@ WARNING: issue-146.pdf: file is damaged WARNING: issue-146.pdf: can't find startxref WARNING: issue-146.pdf: Attempting to reconstruct cross-reference table WARNING: issue-146.pdf (trailer, offset 695): ignoring excessively deeply nested data structure +WARNING: issue-146.pdf (object 1 0, offset 92): expected endobj +WARNING: issue-146.pdf (object 7 0, offset 146): unknown token while reading object; treating as string +WARNING: issue-146.pdf (object 7 0, offset 168): expected endobj qpdf: issue-146.pdf: unable to find trailer dictionary while recovering damaged file diff --git a/qpdf/qtest/qpdf/issue-148.out b/qpdf/qtest/qpdf/issue-148.out index a59c1343..dbc424f2 100644 --- a/qpdf/qtest/qpdf/issue-148.out +++ b/qpdf/qtest/qpdf/issue-148.out @@ -7,4 +7,9 @@ WARNING: issue-148.pdf (offset 73): error decoding stream data for object 8 0: s WARNING: issue-148.pdf: file is damaged WARNING: issue-148.pdf (offset 73): getStreamData called on unfilterable stream WARNING: issue-148.pdf: Attempting to reconstruct cross-reference table -qpdf: issue-148.pdf: unable to find trailer dictionary while recovering damaged file +WARNING: issue-148.pdf (xref stream: object 8 0, offset 26): stream dictionary lacks /Length key +WARNING: issue-148.pdf (xref stream: object 8 0, offset 73): attempting to recover stream length +WARNING: issue-148.pdf (xref stream: object 8 0, offset 73): recovered stream length: 2 +WARNING: issue-148.pdf (xref stream: object 8 0, offset 85): expected endobj +WARNING: issue-148.pdf (offset 73): error decoding stream data for object 8 0: stream inflate: inflate: data: incorrect header check +qpdf: issue-148.pdf: error decoding candidate xref stream while recovering damaged file diff --git a/qpdf/qtest/qpdf/issue-150.out b/qpdf/qtest/qpdf/issue-150.out index 3291f96f..9fe8b5ac 100644 --- a/qpdf/qtest/qpdf/issue-150.out +++ b/qpdf/qtest/qpdf/issue-150.out @@ -2,4 +2,5 @@ WARNING: issue-150.pdf: can't find PDF header WARNING: issue-150.pdf: file is damaged WARNING: issue-150.pdf: error reading xref: overflow/underflow converting 9900000000000000000 to 64-bit integer WARNING: issue-150.pdf: Attempting to reconstruct cross-reference table +WARNING: issue-150.pdf (object 8 0): object has offset 0 qpdf: issue-150.pdf: unable to find trailer dictionary while recovering damaged file diff --git a/qpdf/qtest/qpdf/issue-202.out b/qpdf/qtest/qpdf/issue-202.out index 8310c103..441b7087 100644 --- a/qpdf/qtest/qpdf/issue-202.out +++ b/qpdf/qtest/qpdf/issue-202.out @@ -3,4 +3,6 @@ WARNING: issue-202.pdf: file is damaged WARNING: issue-202.pdf (offset 54769): expected trailer dictionary WARNING: issue-202.pdf: Attempting to reconstruct cross-reference table WARNING: issue-202.pdf (trailer, offset 55770): ignoring excessively deeply nested data structure +WARNING: issue-202.pdf (object 222 0, offset 50101): dictionary has duplicated key /Creator; last occurrence overrides earlier ones +WARNING: issue-202.pdf (object 222 0, offset 50101): dictionary has duplicated key /Producer; last occurrence overrides earlier ones qpdf: issue-202.pdf: unable to find trailer dictionary while recovering damaged file diff --git a/qpdf/qtest/qpdf/recover-xref-stream-recovered.pdf b/qpdf/qtest/qpdf/recover-xref-stream-recovered.pdf Binary files differnew file mode 100644 index 00000000..dfbfceed --- /dev/null +++ b/qpdf/qtest/qpdf/recover-xref-stream-recovered.pdf diff --git a/qpdf/qtest/qpdf/recover-xref-stream.out b/qpdf/qtest/qpdf/recover-xref-stream.out new file mode 100644 index 00000000..ba0e1aa6 --- /dev/null +++ b/qpdf/qtest/qpdf/recover-xref-stream.out @@ -0,0 +1,5 @@ +WARNING: recover-xref-stream.pdf: file is damaged +WARNING: recover-xref-stream.pdf: can't find startxref +WARNING: recover-xref-stream.pdf: Attempting to reconstruct cross-reference table +WARNING: recover-xref-stream.pdf: reported number of objects (14) is not one plus the highest object number (15) +qpdf: operation succeeded with warnings; resulting file may have some problems diff --git a/qpdf/qtest/qpdf/recover-xref-stream.pdf b/qpdf/qtest/qpdf/recover-xref-stream.pdf Binary files differnew file mode 100644 index 00000000..f8da3f1b --- /dev/null +++ b/qpdf/qtest/qpdf/recover-xref-stream.pdf |