aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFWriter.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-05-08 15:07:59 +0200
committerJay Berkenbilt <ejb@ql.org>2021-05-08 15:42:09 +0200
commit30ac51bc78f7d723e4fc94ff8af5527e88b56f23 (patch)
treeb910f63b69f5e75a9436b9645fbbbde66490b01a /libqpdf/QPDFWriter.cc
parent16c19e94244a7677890b8d7bd36eed09fe20fb0f (diff)
downloadqpdf-30ac51bc78f7d723e4fc94ff8af5527e88b56f23.tar.zst
Exclude unreferenced objects in object streams (fixes #520)
Diffstat (limited to 'libqpdf/QPDFWriter.cc')
-rw-r--r--libqpdf/QPDFWriter.cc31
1 files changed, 25 insertions, 6 deletions
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index 689fef74..83349b48 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -2363,17 +2363,36 @@ QPDFWriter::preserveObjectStreams()
{
// Our object_to_object_stream map has to map ObjGen -> ObjGen
// since we may be generating object streams out of old objects
- // that have generation numbers greater than zero. However in an
+ // that have generation numbers greater than zero. However in an
// existing PDF, all object stream objects and all objects in them
// must have generation 0 because the PDF spec does not provide
- // any way to do otherwise.
+ // any way to do otherwise. This code filters out objects that are
+ // not allowed to be in object streams. In addition to removing
+ // objects that were erroneously included in object streams in the
+ // source PDF, it also prevents unreferenced objects from being
+ // included.
+ std::set<QPDFObjGen> eligible;
+ if (! this->m->preserve_unreferenced_objects)
+ {
+ std::vector<QPDFObjGen> eligible_v =
+ QPDF::Writer::getCompressibleObjGens(this->m->pdf);
+ eligible = std::set<QPDFObjGen>(eligible_v.begin(), eligible_v.end());
+ }
+ QTC::TC("qpdf", "QPDFWriter preserve object streams",
+ this->m->preserve_unreferenced_objects ? 0 : 1);
std::map<int, int> omap;
QPDF::Writer::getObjectStreamData(this->m->pdf, omap);
- for (std::map<int, int>::iterator iter = omap.begin();
- iter != omap.end(); ++iter)
+ for (auto iter: omap)
{
- this->m->object_to_object_stream[QPDFObjGen((*iter).first, 0)] =
- (*iter).second;
+ QPDFObjGen og(iter.first, 0);
+ if (eligible.count(og) || this->m->preserve_unreferenced_objects)
+ {
+ this->m->object_to_object_stream[og] = iter.second;
+ }
+ else
+ {
+ QTC::TC("qpdf", "QPDFWriter exclude from object stream");
+ }
}
}