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

if (action == null) { if (action == null) {
return null; return null;
} }
PDFAction pdfAction = (PDFAction)this.completeActions.get(action.getID());
PDFAction pdfAction = (PDFAction)this.completeActions.get(getCompleteID(action));
if (pdfAction != null) { if (pdfAction != null) {
return pdfAction; return pdfAction;
} else if (action instanceof GoToXYAction) { } else if (action instanceof GoToXYAction) {
//Some PDF actions are pooled //Some PDF actions are pooled
getPDFDoc().registerObject(pdfAction); getPDFDoc().registerObject(pdfAction);
} }
this.completeActions.put(action.getID(), pdfAction);
this.completeActions.put(getCompleteID(action), pdfAction);
return pdfAction; return pdfAction;
} else { } else {
throw new UnsupportedOperationException("Unsupported action type: " throw new UnsupportedOperationException("Unsupported action type: "


//Queue this object now that it's complete //Queue this object now that it's complete
getPDFDoc().addObject(pdfGoTo); 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

import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;


import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
//Since user may merge IF files we want to use current page //Since user may merge IF files we want to use current page
Assert.assertEquals(goToXYActions.get(0).getPageIndex(), currentPage); 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