Commit a5afb8675d3059a31a9ce66fd025e271a391da7a

Authored by m-holger
1 parent 1dd0575c

Refactor `QPDFWriter`: replace `QPDFObjectHandle` with `Dictionary` for trimmed …

…trailer handling, streamline trailer processing logic, and simplify related method calls.
Showing 1 changed file with 20 additions and 22 deletions
libqpdf/QPDFWriter.cc
... ... @@ -392,7 +392,7 @@ class QPDFWriter::Members: QPDF::Writer
392 392 void enqueueObjectsPCLm();
393 393 void enqueuePart(std::vector<QPDFObjectHandle>& part);
394 394 void assignCompressedObjectNumbers(QPDFObjGen og);
395   - QPDFObjectHandle getTrimmedTrailer();
  395 + Dictionary trimmed_trailer();
396 396  
397 397 bool willFilterStream(
398 398 QPDFObjectHandle stream,
... ... @@ -1443,7 +1443,7 @@ void
1443 1443 QPDFWriter::Members::writeTrailer(
1444 1444 trailer_e which, int size, bool xref_stream, qpdf_offset_t prev, int linearization_pass)
1445 1445 {
1446   - QPDFObjectHandle trailer = getTrimmedTrailer();
  1446 + auto trailer = trimmed_trailer();
1447 1447 if (xref_stream) {
1448 1448 cur_data_key.clear();
1449 1449 } else {
... ... @@ -1453,7 +1453,7 @@ QPDFWriter::Members::writeTrailer(
1453 1453 if (which == t_lin_second) {
1454 1454 write(" /Size ").write(size);
1455 1455 } else {
1456   - for (auto const& [key, value]: trailer.as_dictionary()) {
  1456 + for (auto const& [key, value]: trailer) {
1457 1457 if (value.null()) {
1458 1458 continue;
1459 1459 }
... ... @@ -2241,28 +2241,28 @@ QPDFWriter::Members::generateObjectStreams()
2241 2241 }
2242 2242 }
2243 2243  
2244   -QPDFObjectHandle
2245   -QPDFWriter::Members::getTrimmedTrailer()
  2244 +Dictionary
  2245 +QPDFWriter::Members::trimmed_trailer()
2246 2246 {
2247 2247 // Remove keys from the trailer that necessarily have to be replaced when writing the file.
2248 2248  
2249   - QPDFObjectHandle trailer = pdf.getTrailer().unsafeShallowCopy();
  2249 + Dictionary trailer = pdf.getTrailer().unsafeShallowCopy();
2250 2250  
2251 2251 // Remove encryption keys
2252   - trailer.removeKey("/ID");
2253   - trailer.removeKey("/Encrypt");
  2252 + trailer.erase("/ID");
  2253 + trailer.erase("/Encrypt");
2254 2254  
2255 2255 // Remove modification information
2256   - trailer.removeKey("/Prev");
  2256 + trailer.erase("/Prev");
2257 2257  
2258 2258 // Remove all trailer keys that potentially come from a cross-reference stream
2259   - trailer.removeKey("/Index");
2260   - trailer.removeKey("/W");
2261   - trailer.removeKey("/Length");
2262   - trailer.removeKey("/Filter");
2263   - trailer.removeKey("/DecodeParms");
2264   - trailer.removeKey("/Type");
2265   - trailer.removeKey("/XRefStm");
  2259 + trailer.erase("/Index");
  2260 + trailer.erase("/W");
  2261 + trailer.erase("/Length");
  2262 + trailer.erase("/Filter");
  2263 + trailer.erase("/DecodeParms");
  2264 + trailer.erase("/Type");
  2265 + trailer.erase("/XRefStm");
2266 2266  
2267 2267 return trailer;
2268 2268 }
... ... @@ -3128,12 +3128,12 @@ QPDFWriter::Members::enqueueObjectsStandard()
3128 3128 }
3129 3129  
3130 3130 // Put root first on queue.
3131   - QPDFObjectHandle trailer = getTrimmedTrailer();
3132   - enqueueObject(trailer.getKey("/Root"));
  3131 + auto trailer = trimmed_trailer();
  3132 + enqueueObject(trailer["/Root"]);
3133 3133  
3134 3134 // Next place any other objects referenced from the trailer dictionary into the queue, handling
3135 3135 // direct objects recursively. Root is already there, so enqueuing it a second time is a no-op.
3136   - for (auto& item: trailer.as_dictionary()) {
  3136 + for (auto& item: trailer) {
3137 3137 if (!item.second.null()) {
3138 3138 enqueueObject(item.second);
3139 3139 }
... ... @@ -3166,9 +3166,7 @@ QPDFWriter::Members::enqueueObjectsPCLm()
3166 3166 }
3167 3167 }
3168 3168  
3169   - // Put root in queue.
3170   - QPDFObjectHandle trailer = getTrimmedTrailer();
3171   - enqueueObject(trailer.getKey("/Root"));
  3169 + enqueueObject(trimmed_trailer()["/Root"]);
3172 3170 }
3173 3171  
3174 3172 void
... ...