Commit a5afb8675d3059a31a9ce66fd025e271a391da7a
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 | ... | ... |