Browse Source

FOP-2760: Make unique links for merged IF

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1816435 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_3
Simon Steiner 6 years ago
parent
commit
a6cb59fb42

+ 11
- 3
fop-core/src/main/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java View File

@@ -147,7 +147,7 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler
if (action == null) {
return null;
}
PDFAction pdfAction = (PDFAction)this.completeActions.get(action.getID());
PDFAction pdfAction = (PDFAction)this.completeActions.get(getCompleteID(action));
if (pdfAction != null) {
return pdfAction;
} else if (action instanceof GoToXYAction) {
@@ -175,7 +175,7 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler
//Some PDF actions are pooled
getPDFDoc().registerObject(pdfAction);
}
this.completeActions.put(action.getID(), pdfAction);
this.completeActions.put(getCompleteID(action), pdfAction);
return pdfAction;
} else {
throw new UnsupportedOperationException("Unsupported action type: "
@@ -202,8 +202,16 @@ public class PDFDocumentNavigationHandler implements IFDocumentNavigationHandler

//Queue this object now that it's complete
getPDFDoc().addObject(pdfGoTo);
this.completeActions.put(action.getID(), pdfGoTo);
this.completeActions.put(getCompleteID(action), pdfGoTo);
}
}

private String getCompleteID(AbstractAction action) {
if (action instanceof GoToXYAction && action.isComplete()) {
int extra = ((GoToXYAction) action).getPageIndex();
return action.getID() + "_" + extra;
}
return action.getID();
}

}

+ 41
- 0
fop-core/src/test/java/org/apache/fop/render/extensions/DocumentNavigationHandlerTestCase.java View File

@@ -22,7 +22,9 @@ import java.awt.Dimension;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.xml.transform.stream.StreamResult;
@@ -85,4 +87,43 @@ public class DocumentNavigationHandlerTestCase {
//Since user may merge IF files we want to use current page
Assert.assertEquals(goToXYActions.get(0).getPageIndex(), currentPage);
}

@Test
public void testGotoXYUniqueLinks() throws IFException, SAXException {
FOUserAgent ua = FopFactory.newInstance(new File(".").toURI()).newFOUserAgent();
PDFDocumentHandler documentHandler = new PDFDocumentHandler(new IFContext(ua));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
documentHandler.setResult(new StreamResult(bos));
documentHandler.setFontInfo(new FontInfo());
documentHandler.startDocument();

PDFDocumentNavigationHandler pdfDocumentNavigationHandler = new PDFDocumentNavigationHandler(documentHandler);
DocumentNavigationHandler navigationHandler = new DocumentNavigationHandler(pdfDocumentNavigationHandler,
new HashMap<String, StructureTreeElement>());
QName xy = DocumentNavigationExtensionConstants.GOTO_XY;

Attributes attributes = mock(Attributes.class);
when(attributes.getValue("page-index")).thenReturn("0");
when(attributes.getValue("x")).thenReturn("0");
when(attributes.getValue("y")).thenReturn("0");

documentHandler.startPage(0, "", "", new Dimension());
navigationHandler.startElement(xy.getNamespaceURI(), xy.getLocalName(), null, attributes);
navigationHandler.endElement(xy.getNamespaceURI(), xy.getLocalName(), null);
documentHandler.endPage();
documentHandler.startPage(1, "", "", new Dimension());
navigationHandler.startElement(xy.getNamespaceURI(), xy.getLocalName(), null, attributes);
navigationHandler.endElement(xy.getNamespaceURI(), xy.getLocalName(), null);
documentHandler.endPage();

Iterator<String> i = Arrays.asList(bos.toString().split("\n")).iterator();
List<String> pageLink = new ArrayList<String>();
while (i.hasNext()) {
if (i.next().equals("/S /GoTo")) {
pageLink.add(i.next());
}
}
Assert.assertEquals(pageLink.size(), 2);
Assert.assertFalse(pageLink.get(0).equals(pageLink.get(1)));
}
}

Loading…
Cancel
Save