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,7 +392,7 @@ class QPDFWriter::Members: QPDF::Writer
392 void enqueueObjectsPCLm(); 392 void enqueueObjectsPCLm();
393 void enqueuePart(std::vector<QPDFObjectHandle>& part); 393 void enqueuePart(std::vector<QPDFObjectHandle>& part);
394 void assignCompressedObjectNumbers(QPDFObjGen og); 394 void assignCompressedObjectNumbers(QPDFObjGen og);
395 - QPDFObjectHandle getTrimmedTrailer(); 395 + Dictionary trimmed_trailer();
396 396
397 bool willFilterStream( 397 bool willFilterStream(
398 QPDFObjectHandle stream, 398 QPDFObjectHandle stream,
@@ -1443,7 +1443,7 @@ void @@ -1443,7 +1443,7 @@ void
1443 QPDFWriter::Members::writeTrailer( 1443 QPDFWriter::Members::writeTrailer(
1444 trailer_e which, int size, bool xref_stream, qpdf_offset_t prev, int linearization_pass) 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 if (xref_stream) { 1447 if (xref_stream) {
1448 cur_data_key.clear(); 1448 cur_data_key.clear();
1449 } else { 1449 } else {
@@ -1453,7 +1453,7 @@ QPDFWriter::Members::writeTrailer( @@ -1453,7 +1453,7 @@ QPDFWriter::Members::writeTrailer(
1453 if (which == t_lin_second) { 1453 if (which == t_lin_second) {
1454 write(" /Size ").write(size); 1454 write(" /Size ").write(size);
1455 } else { 1455 } else {
1456 - for (auto const& [key, value]: trailer.as_dictionary()) { 1456 + for (auto const& [key, value]: trailer) {
1457 if (value.null()) { 1457 if (value.null()) {
1458 continue; 1458 continue;
1459 } 1459 }
@@ -2241,28 +2241,28 @@ QPDFWriter::Members::generateObjectStreams() @@ -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 // Remove keys from the trailer that necessarily have to be replaced when writing the file. 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 // Remove encryption keys 2251 // Remove encryption keys
2252 - trailer.removeKey("/ID");  
2253 - trailer.removeKey("/Encrypt"); 2252 + trailer.erase("/ID");
  2253 + trailer.erase("/Encrypt");
2254 2254
2255 // Remove modification information 2255 // Remove modification information
2256 - trailer.removeKey("/Prev"); 2256 + trailer.erase("/Prev");
2257 2257
2258 // Remove all trailer keys that potentially come from a cross-reference stream 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 return trailer; 2267 return trailer;
2268 } 2268 }
@@ -3128,12 +3128,12 @@ QPDFWriter::Members::enqueueObjectsStandard() @@ -3128,12 +3128,12 @@ QPDFWriter::Members::enqueueObjectsStandard()
3128 } 3128 }
3129 3129
3130 // Put root first on queue. 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 // Next place any other objects referenced from the trailer dictionary into the queue, handling 3134 // Next place any other objects referenced from the trailer dictionary into the queue, handling
3135 // direct objects recursively. Root is already there, so enqueuing it a second time is a no-op. 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 if (!item.second.null()) { 3137 if (!item.second.null()) {
3138 enqueueObject(item.second); 3138 enqueueObject(item.second);
3139 } 3139 }
@@ -3166,9 +3166,7 @@ QPDFWriter::Members::enqueueObjectsPCLm() @@ -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 void 3172 void