Skip to content

Commit 79dbd32

Browse files
committed
Add stream property into resources if it contains indirect references
DEVSIX-7387
1 parent 8f1e347 commit 79dbd32

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfObject.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,35 @@ public PdfIndirectReference getIndirectReference() {
182182
return indirectReference;
183183
}
184184

185+
/**
186+
* Checks recursively whether the object contains indirect reference at any level.
187+
*
188+
* @return {@code true} if indirect reference was found, {@code false} otherwise
189+
*/
190+
public boolean containsIndirectReference() {
191+
if (isIndirect()) {
192+
return true;
193+
}
194+
195+
if (isDictionary()) {
196+
PdfDictionary dict = (PdfDictionary) this;
197+
for (PdfObject value : dict.values()) {
198+
if (value.containsIndirectReference()) {
199+
return true;
200+
}
201+
}
202+
} else if (isArray()) {
203+
PdfArray arr = (PdfArray) this;
204+
for (PdfObject value : arr) {
205+
if (value.containsIndirectReference()) {
206+
return true;
207+
}
208+
}
209+
}
210+
211+
return false;
212+
}
213+
185214
/**
186215
* Checks if object is indirect.
187216
* <br>

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/PdfCanvas.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,11 +2171,12 @@ public PdfCanvas beginMarkedContent(PdfName tag, PdfDictionary properties) {
21712171
PdfOutputStream out = contentStream.getOutputStream().write(tag).writeSpace();
21722172
if (properties == null) {
21732173
out.writeBytes(BMC);
2174-
} else if (properties.getIndirectReference() == null) {
2175-
out.write(properties).writeSpace().writeBytes(BDC);
2176-
} else {
2174+
} else if (properties.containsIndirectReference()) {
21772175
out.write(resources.addProperties(properties)).writeSpace().writeBytes(BDC);
2176+
} else {
2177+
out.write(properties).writeSpace().writeBytes(BDC);
21782178
}
2179+
21792180
final Tuple2<PdfName, PdfDictionary> tuple2 = new Tuple2<>(tag, properties);
21802181
if (this.drawingOnPage){
21812182
document.checkIsoConformance(new CanvasBmcValidationContext(tagStructureStack, tuple2));

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfObjectTest.java

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,88 @@ public void pdtIndirectReferenceLateInitializing3() {
260260
document.close();
261261
}
262262

263+
@Test
264+
public void containsIndirectReference1Test() {
265+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
266+
PdfDictionary testDict = getTestPdfDictionary();
267+
Assertions.assertFalse(testDict.containsIndirectReference());
268+
269+
testDict.get(new PdfName("b")).makeIndirect(pdfDoc);
270+
Assertions.assertTrue(testDict.containsIndirectReference());
271+
}
272+
273+
@Test
274+
public void containsIndirectReference2Test() {
275+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
276+
PdfDictionary testDict = getTestPdfDictionary();
277+
PdfObject arrValue = new PdfName("arrValue");
278+
PdfArray pdfArr = new PdfArray();
279+
pdfArr.add(arrValue);
280+
281+
testDict.put(new PdfName("array"), pdfArr);
282+
Assertions.assertFalse(testDict.containsIndirectReference());
283+
284+
arrValue.makeIndirect(pdfDoc);
285+
Assertions.assertTrue(testDict.containsIndirectReference());
286+
}
287+
288+
@Test
289+
public void containsIndirectReferenceFlushedDictValueTest() {
290+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
291+
PdfDictionary testDict = getTestPdfDictionary();
292+
Assertions.assertFalse(testDict.containsIndirectReference());
293+
294+
testDict.get(new PdfName("b")).makeIndirect(pdfDoc).flush();
295+
Assertions.assertTrue(testDict.containsIndirectReference());
296+
}
297+
298+
@Test
299+
public void containsIndirectReferenceFlushedArrayTest() {
300+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
301+
PdfDictionary testDict = getTestPdfDictionary();
302+
PdfObject arrValue = new PdfName("arrValue");
303+
PdfArray pdfArr = new PdfArray();
304+
pdfArr.add(arrValue);
305+
pdfArr.makeIndirect(pdfDoc);
306+
pdfArr.flush();
307+
308+
testDict.put(new PdfName("array"), pdfArr);
309+
Assertions.assertTrue(testDict.containsIndirectReference());
310+
}
311+
312+
@Test
313+
public void containsIndirectReferenceFlushedArrayValueTest() {
314+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
315+
PdfDictionary testDict = getTestPdfDictionary();
316+
PdfObject arrValue = new PdfName("arrValue");
317+
PdfArray pdfArr = new PdfArray();
318+
pdfArr.add(arrValue);
319+
320+
arrValue.makeIndirect(pdfDoc);
321+
arrValue.flush();
322+
323+
testDict.put(new PdfName("array"), pdfArr);
324+
Assertions.assertTrue(testDict.containsIndirectReference());
325+
}
326+
327+
@Test
328+
public void containsIndirectReferenceFlushedArrayAndArrayValueTest() {
329+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
330+
PdfDictionary testDict = getTestPdfDictionary();
331+
PdfObject arrValue = new PdfName("arrValue");
332+
PdfArray pdfArr = new PdfArray();
333+
pdfArr.add(arrValue);
334+
335+
arrValue.makeIndirect(pdfDoc);
336+
arrValue.flush();
337+
338+
pdfArr.makeIndirect(pdfDoc);
339+
pdfArr.flush();
340+
341+
testDict.put(new PdfName("array"), pdfArr);
342+
Assertions.assertTrue(testDict.containsIndirectReference());
343+
}
344+
263345
private static PdfDictionary getTestPdfDictionary() {
264346
HashMap<PdfName, PdfObject> tmpMap = new HashMap<PdfName, PdfObject>();
265347
tmpMap.put(new PdfName("b"), new PdfName("c"));

0 commit comments

Comments
 (0)