diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-07-04 15:01:03 +0200 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-07-04 20:59:09 +0200 |
commit | 769a4915e8392490b77aba3b6ddda3e4a2e89508 (patch) | |
tree | 0d92e89fcc20ae70e3ec0d340705614e0e64c76e /libqpdf/QPDF.cc | |
parent | b8f20fe34c1e91e312e904cf828cb164dac2326e (diff) | |
download | qpdf-769a4915e8392490b77aba3b6ddda3e4a2e89508.tar.zst |
Add new private method QPDF::insertReconstructedXrefEntry
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 396dfe8f..8c96eb9c 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -564,7 +564,7 @@ QPDF::reconstruct_xref(QPDFExc& e) if ((t2.isInteger()) && (readToken(m->file, MAX_LEN).isWord("obj"))) { int obj = QUtil::string_to_int(t1.getValue().c_str()); int gen = QUtil::string_to_int(t2.getValue().c_str()); - insertXrefEntry(obj, 1, token_start, gen, true); + insertReconstructedXrefEntry(obj, token_start, gen); } } else if (!m->trailer.isInitialized() && t1.isWord("trailer")) { QPDFObjectHandle t = readObject(m->file, "trailer", QPDFObjGen(), false); @@ -577,6 +577,7 @@ QPDF::reconstruct_xref(QPDFExc& e) m->file->seek(next_line_start, SEEK_SET); line_start = next_line_start; } + m->deleted_objects.clear(); if (!m->trailer.isInitialized()) { // We could check the last encountered object to see if it was an xref stream. If so, we @@ -1126,7 +1127,6 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite) QPDFObjGen og(obj, gen); if (m->xref_table.count(og)) { if (overwrite) { - QTC::TC("qpdf", "QPDF xref overwrite object"); m->xref_table.erase(og); } else { QTC::TC("qpdf", "QPDF xref reused object"); @@ -1160,6 +1160,20 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite) } } +// Replace uncompressed object. This is used in xref recovery mode, which reads the file from +// beginning to end. +void +QPDF::insertReconstructedXrefEntry(int obj, qpdf_offset_t f1, int f2) +{ + QPDFObjGen og(obj, f2); + if (!m->deleted_objects.count(obj)) { + // deleted_objects stores the uncompressed objects removed from the xref table at the start + // of recovery. + QTC::TC("qpdf", "QPDF xref overwrite object"); + m->xref_table[QPDFObjGen(obj, f2)] = QPDFXRefEntry(f1); + } +} + void QPDF::showXRefTable() { |