summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2012-12-31 11:50:43 +0100
committerJay Berkenbilt <ejb@ql.org>2012-12-31 16:32:32 +0100
commit9eb5982fa334a2db42a278fce853bd7ebd2a61a7 (patch)
tree46c76331bec287e9b1feaa6ca61afc19e11a4d1e
parent0ea70e5daed08e7a7c23ca5bf1a0320478d0e552 (diff)
downloadqpdf-9eb5982fa334a2db42a278fce853bd7ebd2a61a7.tar.zst
Avoid modifying trailer when writing
When preparing the trailer for writing to the new file, trim a copy of the trailer instead of the original file's trailer.
-rw-r--r--include/qpdf/QPDFWriter.hh1
-rw-r--r--libqpdf/QPDFWriter.cc25
2 files changed, 16 insertions, 10 deletions
diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh
index 962c21dc..e8b744d2 100644
--- a/include/qpdf/QPDFWriter.hh
+++ b/include/qpdf/QPDFWriter.hh
@@ -322,6 +322,7 @@ class QPDFWriter
void setDataKey(int objid);
int openObject(int objid = 0);
void closeObject(int objid);
+ QPDFObjectHandle getTrimmedTrailer();
void prepareFileForWrite();
void writeStandard();
void writeLinearized();
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index ba37d423..a1949a9b 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -1057,7 +1057,7 @@ void
QPDFWriter::writeTrailer(trailer_e which, int size, bool xref_stream,
qpdf_offset_t prev)
{
- QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle trailer = getTrimmedTrailer();
if (! xref_stream)
{
writeString("trailer <<");
@@ -1932,20 +1932,19 @@ QPDFWriter::generateObjectStreams()
}
}
-void
-QPDFWriter::prepareFileForWrite()
+QPDFObjectHandle
+QPDFWriter::getTrimmedTrailer()
{
// Remove keys from the trailer that necessarily have to be
// replaced when writing the file.
- QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle trailer = pdf.getTrailer().shallowCopy();
- // Note that removing the encryption dictionary does not interfere
- // with reading encrypted files. QPDF loads all the information
- // it needs from the encryption dictionary at the beginning and
- // never looks at it again.
+ // Remove encryption keys
trailer.removeKey("/ID");
trailer.removeKey("/Encrypt");
+
+ // Remove modification information
trailer.removeKey("/Prev");
// Remove all trailer keys that potentially come from a
@@ -1958,6 +1957,12 @@ QPDFWriter::prepareFileForWrite()
trailer.removeKey("/Type");
trailer.removeKey("/XRefStm");
+ return trailer;
+}
+
+void
+QPDFWriter::prepareFileForWrite()
+{
// Do a traversal of the entire PDF file structure replacing all
// indirect objects that QPDFWriter wants to be direct. This
// includes stream lengths, stream filtering parameters, and
@@ -1967,7 +1972,7 @@ QPDFWriter::prepareFileForWrite()
// holders.
std::list<QPDFObjectHandle> queue;
- queue.push_back(pdf.getTrailer());
+ queue.push_back(getTrimmedTrailer());
std::set<int> visited;
while (! queue.empty())
@@ -2861,7 +2866,7 @@ QPDFWriter::writeStandard()
writeString(this->extra_header_text);
// Put root first on queue.
- QPDFObjectHandle trailer = pdf.getTrailer();
+ QPDFObjectHandle trailer = getTrimmedTrailer();
enqueueObject(trailer.getKey("/Root"));
// Next place any other objects referenced from the trailer