From: Simon Steiner Date: Fri, 9 Sep 2022 14:52:08 +0000 (+0000) Subject: FOP-3092: PDF/UA NPE when using external pdf X-Git-Tag: fop-2_8~2^2~10 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=142ae43d6333de7bbd17aa98d6a3107a02c759c8;p=xmlgraphics-fop.git FOP-3092: PDF/UA NPE when using external pdf git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1903941 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFStructElem.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFStructElem.java index 603402ac2..8386241c8 100644 --- a/fop-core/src/main/java/org/apache/fop/pdf/PDFStructElem.java +++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFStructElem.java @@ -37,6 +37,8 @@ import org.apache.fop.util.LanguageTags; */ public class PDFStructElem extends StructureHierarchyMember implements StructureTreeElement, CompressedObject, Serializable { + private static final List BLSE = Arrays.asList(StandardStructureTypes.Table.TABLE, + StandardStructureTypes.List.L, StandardStructureTypes.Paragraphlike.P); private static final long serialVersionUID = -3055241807589202532L; private StructureType structureType; @@ -253,12 +255,9 @@ public class PDFStructElem extends StructureHierarchyMember put("Alt", "No alternate text specified"); } else if (kids != null) { for (PDFObject kid : kids) { - if (kid instanceof PDFStructElem - && !(kid instanceof Placeholder) - && structureType.toString().equals("P") - && isBSLE(((PDFStructElem) kid).getStructureType().toString())) { + if (kid instanceof PDFStructElem && isBSLE(((PDFStructElem) kid))) { structureType = StandardStructureTypes.Grouping.DIV; - put("S", StandardStructureTypes.Grouping.DIV.getName()); + put("S", structureType.getName()); break; } } @@ -267,9 +266,9 @@ public class PDFStructElem extends StructureHierarchyMember return super.output(stream); } - private boolean isBSLE(String type) { - String[] blseValues = {"Table", "L", "P"}; - return Arrays.asList(blseValues).contains(type); + private boolean isBSLE(PDFStructElem kid) { + boolean pType = !(kid instanceof Placeholder) && structureType == StandardStructureTypes.Paragraphlike.P; + return pType && BLSE.contains(kid.getStructureType()); } /** diff --git a/fop-core/src/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java b/fop-core/src/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java index 3940ada7e..52b4802c0 100644 --- a/fop-core/src/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java +++ b/fop-core/src/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java @@ -37,7 +37,16 @@ import org.apache.fop.render.pdf.PDFStructureTreeBuilder; public class PDFUAWarningTestCase { - PDFFactory pdfFactory; + private PDFFactory pdfFactory; + + @Before + public void setUp() { + PDFParentTree tree = new PDFParentTree(); + PDFDocument doc = new PDFDocument(""); + doc.makeStructTreeRoot(tree); + doc.getProfile().setPDFUAMode(PDFUAMode.PDFUA_1); + pdfFactory = new PDFFactory(doc); + } @Test public void nestedTableWarningTestCase() throws IOException { @@ -50,12 +59,15 @@ public class PDFUAWarningTestCase { Assert.assertEquals("Div", block.getStructureType().toString()); } - @Before - public void setUp() { - PDFParentTree tree = new PDFParentTree(); - PDFDocument doc = new PDFDocument(""); - doc.makeStructTreeRoot(tree); - doc.getProfile().setPDFUAMode(PDFUAMode.PDFUA_1); - pdfFactory = new PDFFactory(doc); + @Test + public void testNoStructureType() throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PDFStructElem structElem = new PDFStructElem(); + structElem.setDocument(pdfFactory.getDocument()); + PDFStructElem structElem2 = new PDFStructElem(); + structElem2.setDocument(pdfFactory.getDocument()); + structElem.addKid(structElem2); + structElem.output(bos); + Assert.assertEquals(bos.toString(), "<< /K [<< >>] >>"); } }