Author: ssteiner Date: Thu Jun 11 15:48:05 2015 New Revision: 1684929 URL: http://svn.apache.org/r1684929 Log: FOP-2436: Merging of Tagged (Accessible) PDF
Added: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/DocumentRootModifier.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/src/java/org/apache/fop/render/pdf/pdfbox/DocumentRootModifier.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMergerUtil.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMergerUtil.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/TaggedPDFConductor.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/src/java/org/apache/fop/render/pdf/pdfbox/TaggedPDFConductor.java xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/DocumentRootModifierTestCase.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/java/org/apache/fop/render/pdf/DocumentRootModifierTestCase.java xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java xmlgraphics/fop-pdf-images/trunk/test/resources/NoParentTree.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/NoParentTree.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/brokenLink.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/brokenLink.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/classMap.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/classMap.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/emptyRowTable.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/emptyRowTable.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/helloWorld.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/helloWorld.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/linkTagged.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/linkTagged.pdf xmlgraphics/fop-pdf-images/trunk/test/resources/otf.pdf - copied unchanged from r1684916, xmlgraphics/fop-pdf-images/branches/Temp_MergeTaggedPDF/test/resources/otf.pdf Modified: xmlgraphics/fop-pdf-images/trunk/lib/fop.jar xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java Modified: xmlgraphics/fop-pdf-images/trunk/lib/fop.jar URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/lib/fop.jar?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== Binary files - no diff available. Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java (original) +++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java Thu Jun 11 15:48:05 2015 @@ -40,7 +40,9 @@ import org.apache.fop.pdf.PDFArray; import org.apache.fop.pdf.PDFDocument; import org.apache.fop.pdf.PDFPage; import org.apache.fop.pdf.PDFResources; +import org.apache.fop.pdf.PDFStructElem; import org.apache.fop.pdf.Version; +import org.apache.fop.render.pdf.PDFLogicalStructureHandler; import org.apache.fop.render.pdf.pdfbox.Cache.ValueMaker; /** @@ -67,8 +69,11 @@ public abstract class AbstractPDFBoxHand = Collections.synchronizedMap(new WeakHashMap<Object, Cache<String, Map<Object, Object>>>()); protected String createStreamForPDF(ImagePDF image, PDFPage targetPage, FOUserAgent userAgent, - AffineTransform at, FontInfo fontinfo, Rectangle pos, Map<Integer, PDFArray> pageNumbers) - throws IOException { + AffineTransform at, FontInfo fontinfo, Rectangle pos, + Map<Integer, PDFArray> pageNumbers, + PDFLogicalStructureHandler handler, + PDFStructElem curentSessionElem) throws IOException { + EventBroadcaster eventBroadcaster = null; if (userAgent != null) { eventBroadcaster = userAgent.getEventBroadcaster(); @@ -117,7 +122,15 @@ public abstract class AbstractPDFBoxHand } PDFBoxAdapter adapter = new PDFBoxAdapter(targetPage, objectCache, pageNumbers); - String stream = adapter.createStreamFromPDFBoxPage(pddoc, page, originalImageUri, at, fontinfo, pos); + if (handler != null) { + adapter.setCurrentMCID(handler.getPageParentTree().length()); + } + String stream = adapter.createStreamFromPDFBoxPage(pddoc, page, originalImageUri, + at, fontinfo, pos); + if (userAgent.isAccessibilityEnabled()) { + TaggedPDFConductor conductor = new TaggedPDFConductor(curentSessionElem, handler, page, adapter); + conductor.handleLogicalStructure(pddoc); + } return stream; } Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java (original) +++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java Thu Jun 11 15:48:05 2015 @@ -68,7 +68,7 @@ public class MergeFontsPDFWriter extends private Collection<String> parentFonts; public MergeFontsPDFWriter(COSDictionary fonts, FontInfo fontInfo, String key, List<COSName> resourceNames) { - super(key, resourceNames); + super(key, resourceNames, 0); this.fonts = fonts; this.fontInfo = fontInfo; } Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java (original) +++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java Thu Jun 11 15:48:05 2015 @@ -100,6 +100,8 @@ public class PDFBoxAdapter { private Map<COSName, String> newXObj = new HashMap<COSName, String>(); private Map<Integer, PDFArray> pageNumbers; + private int currentMCID; + /** * Creates a new PDFBoxAdapter. * @param targetPage The target FOP PDF page object @@ -113,15 +115,27 @@ public class PDFBoxAdapter { this.pageNumbers = pageNumbers; } - private Object cloneForNewDocument(Object base) throws IOException { + public PDFPage getTargetPage() { + return targetPage; + } + + public int getCurrentMCID() { + return currentMCID; + } + + public void setCurrentMCID(int currentMCID) { + this.currentMCID = currentMCID; + } + + protected Object cloneForNewDocument(Object base) throws IOException { return cloneForNewDocument(base, base); } - private Object cloneForNewDocument(Object base, Object keyBase) throws IOException { + protected Object cloneForNewDocument(Object base, Object keyBase) throws IOException { return cloneForNewDocument(base, keyBase, Collections.EMPTY_LIST); } - private Object cloneForNewDocument(Object base, Object keyBase, Collection exclude) throws IOException { + protected Object cloneForNewDocument(Object base, Object keyBase, Collection exclude) throws IOException { if (base == null) { return null; } @@ -262,11 +276,11 @@ public class PDFBoxAdapter { return cacheClonedObject(keyBase, stream); } - private Object getCachedClone(Object base) { + protected Object getCachedClone(Object base) { return clonedVersion.get(getBaseKey(base)); } - private Object cacheClonedObject(Object base, Object cloned) { + protected Object cacheClonedObject(Object base, Object cloned) { Object key = getBaseKey(base); if (key == null) { return cloned; @@ -276,7 +290,7 @@ public class PDFBoxAdapter { pdfDoc.registerObject(pdfobj); if (log.isTraceEnabled()) { log.trace(key + ": " + pdfobj.getClass().getName() + " registered as " - + pdfobj.getObjectNumber() + " " + pdfobj.getGeneration()); + + pdfobj.getObjectNumber() + " " + pdfobj.getGeneration()); } } clonedVersion.put(key, cloned); @@ -292,13 +306,12 @@ public class PDFBoxAdapter { } } - private void transferDict(COSDictionary orgDict, PDFStream targetDict, - Set filter) throws IOException { + private void transferDict(COSDictionary orgDict, PDFStream targetDict, Set filter) throws IOException { transferDict(orgDict, targetDict, filter, false); } - private void transferDict(COSDictionary orgDict, PDFStream targetDict, - Set filter, boolean inclusive) throws IOException { + private void transferDict(COSDictionary orgDict, PDFStream targetDict, Set filter, boolean inclusive) + throws IOException { Set<COSName> keys = orgDict.keySet(); for (COSName key : keys) { if (inclusive && !filter.contains(key.getName())) { @@ -354,8 +367,11 @@ public class PDFBoxAdapter { // } } if (newStream == null) { - newStream = new PDFWriter(uniqueName, - getResourceNames(sourcePageResources.getCOSDictionary())).writeText(pdStream); + PDFWriter writer = new PDFWriter(uniqueName, getResourceNames(sourcePageResources.getCOSDictionary()), + currentMCID); + newStream = writer.writeText(pdStream); + currentMCID = writer.getCurrentMCID(); + } pdStream = new PDStream(sourceDoc, new ByteArrayInputStream(newStream.getBytes("ISO-8859-1"))); mergeXObj(sourcePageResources.getCOSDictionary(), fontinfo, uniqueName); Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java (original) +++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxImageHandler.java Thu Jun 11 15:48:05 2015 @@ -70,7 +70,9 @@ public class PDFBoxImageHandler extends } FontInfo fontinfo = (FontInfo)context.getHint("fontinfo"); String stream = createStreamForPDF(pdfImage, pdfContext.getPage(), pdfContext.getUserAgent(), - pageAdjust, fontinfo, pos, pdfContext.getPageNumbers()); + pageAdjust, fontinfo, pos, pdfContext.getPageNumbers(), + pdfContext.getPdfLogicalStructureHandler(), pdfContext.getCurrentSessionStructElem()); + if (stream == null) { return; } Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java (original) +++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java Thu Jun 11 15:48:05 2015 @@ -40,10 +40,12 @@ public class PDFWriter { protected StringBuilder s = new StringBuilder(); private String key; private List<COSName> resourceNames; + private int currentMCID; - public PDFWriter(String key, List<COSName> resourceNames) { + public PDFWriter(String key, List<COSName> resourceNames, int currentMCID) { this.key = key; this.resourceNames = resourceNames; + this.currentMCID = currentMCID; } public String writeText(PDStream pdStream) throws IOException { @@ -100,9 +102,20 @@ public class PDFWriter { s.append("] "); } else if (c instanceof COSDictionary) { Collection<COSBase> dictArgs = new ArrayList<COSBase>(); - for (Map.Entry<COSName, COSBase> cn : ((COSDictionary)c).entrySet()) { - dictArgs.add(cn.getKey()); - dictArgs.add(cn.getValue()); + if (currentMCID != 0 && op.getOperation().equals("BDC")) { + for (Map.Entry<COSName, COSBase> cn : ((COSDictionary)c).entrySet()) { + if (cn.getKey().getName().equals("MCID")) { + updateMCID(cn, dictArgs); + } else { + dictArgs.add(cn.getKey()); + dictArgs.add(cn.getValue()); + } + } + } else { + for (Map.Entry<COSName, COSBase> cn : ((COSDictionary)c).entrySet()) { + dictArgs.add(cn.getKey()); + dictArgs.add(cn.getValue()); + } } s.append("<<"); readPDFArguments(op, dictArgs); @@ -114,9 +127,21 @@ public class PDFWriter { } } + private void updateMCID(Map.Entry<COSName, COSBase> cn, Collection<COSBase> dictArgs) { + COSBase cosMCID = cn.getValue(); + assert cosMCID instanceof COSInteger; + COSInteger mcid = (COSInteger) cosMCID; + COSInteger updatedID = COSInteger.get(mcid.intValue() + currentMCID); + dictArgs.add(cn.getKey()); + dictArgs.add(updatedID); + } + protected void addKey(COSName cn) { if (resourceNames.contains(cn)) { s.append(key); } } + protected int getCurrentMCID() { + return currentMCID; + } } Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java?rev=1684929&r1=1684928&r2=1684929&view=diff ============================================================================== --- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java (original) +++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java Thu Jun 11 15:48:05 2015 @@ -95,7 +95,6 @@ import junit.framework.Assert; public class PDFBoxAdapterTestCase { private Rectangle2D r = new Rectangle2D.Double(); - private PDFPage pdfpage = new PDFPage(new PDFResources(0), 0, r, r, r, r); private static final String CFF1 = "test/resources/2fonts.pdf"; private static final String CFF2 = "test/resources/2fonts2.pdf"; private static final String CFF3 = "test/resources/simpleh.pdf"; @@ -118,6 +117,7 @@ public class PDFBoxAdapterTestCase { private PDFBoxAdapter getPDFBoxAdapter() { PDFDocument doc = new PDFDocument(""); + PDFPage pdfpage = new PDFPage(new PDFResources(doc), 0, r, r, r, r); doc.setMergeFontsEnabled(true); pdfpage.setDocument(doc); pdfpage.setObjectNumber(1); @@ -306,7 +306,9 @@ public class PDFBoxAdapterTestCase { @Test public void testStream() throws Exception { - pdfpage.setDocument(new PDFDocument("")); + PDFDocument pdfdoc = new PDFDocument(""); + PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r); + pdfpage.setDocument(pdfdoc); PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>()); PDDocument doc = PDDocument.load(ROTATE); PDPage page = (PDPage) doc.getDocumentCatalog().getAllPages().get(0); @@ -322,9 +324,10 @@ public class PDFBoxAdapterTestCase { @Test public void testLink() throws Exception { - pdfpage.setObjectNumber(1); PDFDocument pdfdoc = new PDFDocument(""); + PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r); pdfpage.setDocument(pdfdoc); + pdfpage.setObjectNumber(1); Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>(); PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), pageNumbers); PDDocument doc = PDDocument.load(LINK); @@ -335,8 +338,7 @@ public class PDFBoxAdapterTestCase { Assert.assertTrue(stream.contains("/Link <</MCID 5 >>BDC")); Assert.assertTrue(pageNumbers.size() == 4); PDFAnnotList annots = (PDFAnnotList) pdfpage.get("Annots"); - Assert.assertEquals(annots.toPDFString(), "[\n9 0 R\n12 0 R\n]"); -// pdfdoc.output(System.out); + Assert.assertEquals(annots.toPDFString(), "[\n1 0 R\n2 0 R\n]"); doc.close(); } @@ -417,17 +419,20 @@ public class PDFBoxAdapterTestCase { PDDocument doc = PDDocument.load(SHADING); ImagePDF img = new ImagePDF(imgi, doc); PDFDocument pdfdoc = new PDFDocument(""); + PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r); pdfpage.setDocument(pdfdoc); PDFGState g = new PDFGState(); pdfdoc.assignObjectNumber(g); pdfpage.addGState(g); PDFContentGenerator con = new PDFContentGenerator(pdfdoc, null, null); - PDFRenderingContext c = new PDFRenderingContext(null, con, pdfpage, null); + FOUserAgent mockedAgent = mock(FOUserAgent.class); + when(mockedAgent.isAccessibilityEnabled()).thenReturn(false); + PDFRenderingContext c = new PDFRenderingContext(mockedAgent, con, pdfpage, null); c.setPageNumbers(new HashMap<Integer, PDFArray>()); new PDFBoxImageHandler().handleImage(c, img, new Rectangle()); PDFResources res = c.getPage().getPDFResources(); OutputStream bos = new ByteArrayOutputStream(); res.output(bos); - Assert.assertTrue(bos.toString().contains("/ExtGState << /GS5")); + Assert.assertTrue(bos.toString().contains("/ExtGState << /GS1")); } } --------------------------------------------------------------------- To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org