]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-3092: PDF/UA NPE when using external pdf
authorSimon Steiner <ssteiner@apache.org>
Fri, 9 Sep 2022 14:52:08 +0000 (14:52 +0000)
committerSimon Steiner <ssteiner@apache.org>
Fri, 9 Sep 2022 14:52:08 +0000 (14:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1903941 13f79535-47bb-0310-9956-ffa450edef68

fop-core/src/main/java/org/apache/fop/pdf/PDFStructElem.java
fop-core/src/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java

index 603402ac23ca49d015a98293836f1fffa9d3c975..8386241c8d405f463c00fa224aad23690c0224ef 100644 (file)
@@ -37,6 +37,8 @@ import org.apache.fop.util.LanguageTags;
  */
 public class PDFStructElem extends StructureHierarchyMember
         implements StructureTreeElement, CompressedObject, Serializable {
+    private static final List<StructureType> 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());
     }
 
     /**
index 3940ada7e284d0ec6ee836ebdd43f383fd93035f..52b4802c0efbc03ae9d306df7486c3fda09ede50 100644 (file)
@@ -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 [<< >>] >>");
     }
 }