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: [email protected]
For additional commands, e-mail: [email protected]