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,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 |