Commit ac32dbc313db9490165271d1fa2a602315ddb7e0

Authored by m-holger
1 parent ad73bbcd

Reserve foreign /Page objects in QPDF::copyForeignObject

Ensure that links to foreign pages are not broken provided that the page is
subsequently copied.
libqpdf/QPDF.cc
... ... @@ -2056,11 +2056,6 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
2056 2056 return;
2057 2057 }
2058 2058  
2059   - if ((!top) && foreign.isPageObject()) {
2060   - QTC::TC("qpdf", "QPDF not crossing page boundary");
2061   - return;
2062   - }
2063   -
2064 2059 if (foreign.isIndirect()) {
2065 2060 QPDFObjGen foreign_og(foreign.getObjGen());
2066 2061 if (obj_copier.object_map.count(foreign_og) > 0) {
... ... @@ -2075,9 +2070,14 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
2075 2070 }
2076 2071 QTC::TC("qpdf", "QPDF copy indirect");
2077 2072 if (obj_copier.object_map.count(foreign_og) == 0) {
2078   - obj_copier.to_copy.push_back(foreign);
2079 2073 obj_copier.object_map[foreign_og] =
2080 2074 foreign.isStream() ? newStream() : newIndirectNull();
  2075 + if ((!top) && foreign.isPageObject()) {
  2076 + QTC::TC("qpdf", "QPDF not crossing page boundary");
  2077 + obj_copier.visiting.erase(foreign);
  2078 + return;
  2079 + }
  2080 + obj_copier.to_copy.push_back(foreign);
2081 2081 }
2082 2082 }
2083 2083  
... ... @@ -2109,7 +2109,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop
2109 2109 QTC::TC("qpdf", "QPDF replace indirect");
2110 2110 auto mapping = obj_copier.object_map.find(foreign.getObjGen());
2111 2111 if (mapping == obj_copier.object_map.end()) {
2112   - // This case would occur if this is a reference to a Page or Pages object that we didn't
  2112 + // This case would occur if this is a reference to a Pages object that we didn't
2113 2113 // traverse into.
2114 2114 QTC::TC("qpdf", "QPDF replace foreign indirect with null");
2115 2115 result = QPDFObjectHandle::newNull();
... ...
qpdf/qtest/qpdf/test80b1.pdf
No preview for this file type
qpdf/qtest/qpdf/test80b2.pdf
No preview for this file type