From 61a8216891526346dc7370d4b194107ba383bb61 Mon Sep 17 00:00:00 2001 From: Simon Steiner Date: Tue, 28 Jul 2015 14:46:09 +0000 Subject: [PATCH] FOP-2499: PDF/UA warnings for nested elements git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1693102 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/pdf/PDFStructElem.java | 25 +++++++- .../fo/PDFUAWarningTestCase.java | 61 +++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java diff --git a/src/java/org/apache/fop/pdf/PDFStructElem.java b/src/java/org/apache/fop/pdf/PDFStructElem.java index ac755bd4b..19864f6e3 100644 --- a/src/java/org/apache/fop/pdf/PDFStructElem.java +++ b/src/java/org/apache/fop/pdf/PDFStructElem.java @@ -21,7 +21,9 @@ package org.apache.fop.pdf; import java.io.IOException; import java.io.OutputStream; + import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -244,13 +246,30 @@ public class PDFStructElem extends StructureHierarchyMember } public int output(OutputStream stream) throws IOException { - if (getDocument().getProfile().getPDFUAMode().isEnabled() - && entries.containsKey("Alt") && "".equals(get("Alt"))) { - put("Alt", "No alternate text specified"); + if (getDocument().getProfile().getPDFUAMode().isEnabled()) { + if (entries.containsKey("Alt") && "".equals(get("Alt"))) { + 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())) { + structureType = StandardStructureTypes.Grouping.DIV; + put("S", StandardStructureTypes.Grouping.DIV.getName()); + break; + } + } + } } return super.output(stream); } + private boolean isBSLE(String type) { + String[] blseValues = {"Table", "L", "P"}; + return Arrays.asList(blseValues).contains(type); + } + /** * Class representing a placeholder for a PDF Structure Element. */ diff --git a/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java b/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java new file mode 100644 index 000000000..3940ada7e --- /dev/null +++ b/test/java/org/apache/fop/accessibility/fo/PDFUAWarningTestCase.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.accessibility.fo; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import org.xml.sax.helpers.AttributesImpl; + +import org.apache.fop.pdf.PDFDocument; +import org.apache.fop.pdf.PDFFactory; +import org.apache.fop.pdf.PDFParentTree; +import org.apache.fop.pdf.PDFStructElem; +import org.apache.fop.pdf.PDFUAMode; +import org.apache.fop.render.pdf.PDFStructureTreeBuilder; + +public class PDFUAWarningTestCase { + + PDFFactory pdfFactory; + + @Test + public void nestedTableWarningTestCase() throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PDFStructElem emptyElem = new PDFStructElem(); + PDFStructElem block = PDFStructureTreeBuilder.createStructureElement("block", emptyElem, + new AttributesImpl(), pdfFactory, null); + PDFStructureTreeBuilder.createStructureElement("table", block, new AttributesImpl(), pdfFactory, null); + block.output(bos); + 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); + } +} -- 2.39.5