Skip to content

Commit 922093f

Browse files
committed
Support structure destinations for outlines
DEVSIX-7956
1 parent 14f989f commit 922093f

File tree

16 files changed

+48
-7
lines changed

16 files changed

+48
-7
lines changed

src/main/java/com/itextpdf/html2pdf/attach/impl/OutlineHandler.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.html2pdf.attach.impl;
2424

25+
import com.itextpdf.commons.datastructures.Tuple2;
2526
import com.itextpdf.html2pdf.html.TagConstants;
2627
import com.itextpdf.html2pdf.logs.Html2PdfLogMessageConstant;
2728
import com.itextpdf.html2pdf.attach.ITagWorker;
2829
import com.itextpdf.html2pdf.attach.ProcessorContext;
2930
import com.itextpdf.commons.utils.MessageFormatUtil;
31+
import com.itextpdf.kernel.pdf.PdfDictionary;
3032
import com.itextpdf.kernel.pdf.PdfOutline;
31-
import com.itextpdf.kernel.pdf.PdfString;
32-
import com.itextpdf.kernel.pdf.navigation.PdfDestination;
33+
import com.itextpdf.kernel.pdf.action.PdfAction;
3334
import com.itextpdf.layout.element.IElement;
3435
import com.itextpdf.layout.properties.Property;
3536
import com.itextpdf.styledxmlparser.node.IElementNode;
@@ -72,7 +73,7 @@ public class OutlineHandler {
7273
/**
7374
* The destinations in process.
7475
*/
75-
private Deque<String> destinationsInProcess = new LinkedList<String>();
76+
private Deque<Tuple2<String, PdfDictionary>> destinationsInProcess = new LinkedList<Tuple2<String, PdfDictionary>>();
7677

7778
/**
7879
* The levels in process.
@@ -241,9 +242,9 @@ OutlineHandler addOutlineAndDestToDocument(ITagWorker tagWorker, IElementNode el
241242
}
242243
PdfOutline outline = parent.addOutline(generateOutlineName(element));
243244
String destination = generateUniqueDestinationName(element);
244-
outline.addDestination(PdfDestination.makeDestination(new PdfString(destination)));
245-
246-
destinationsInProcess.push(destination);
245+
PdfAction action = PdfAction.createGoTo(destination);
246+
outline.addAction(action);
247+
destinationsInProcess.push(new Tuple2<String, PdfDictionary>(destination, action.getPdfObject()));
247248

248249
levelsInProcess.push(level);
249250
currentOutline = outline;
@@ -264,7 +265,7 @@ OutlineHandler addOutlineAndDestToDocument(ITagWorker tagWorker, IElementNode el
264265
OutlineHandler setDestinationToElement(ITagWorker tagWorker, IElementNode element) {
265266
String tagName = element.name();
266267
if (null != tagWorker && hasTagPriorityMapping(tagName) && destinationsInProcess.size() > 0) {
267-
String content = destinationsInProcess.pop();
268+
Tuple2<String, PdfDictionary> content = destinationsInProcess.pop();
268269
if (tagWorker.getElementResult() instanceof IElement) {
269270
tagWorker.getElementResult().setProperty(Property.DESTINATION, content);
270271
} else {

src/test/java/com/itextpdf/html2pdf/HtmlConverterPdfUA2Test.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.html2pdf;
2424

25+
import com.itextpdf.html2pdf.attach.impl.OutlineHandler;
2526
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
2627
import com.itextpdf.kernel.pdf.PdfDocument;
2728
import com.itextpdf.kernel.pdf.PdfDocumentInfo;
@@ -108,6 +109,25 @@ public void backwardLinkTest() throws IOException, InterruptedException, XMPExce
108109
compareAndCheckCompliance(destinationPdf, cmpPdf, false);
109110
}
110111

112+
@Test
113+
public void simpleOutlineTest() throws IOException, InterruptedException, XMPException {
114+
String sourceHtml = SOURCE_FOLDER + "simpleOutline.html";
115+
String destinationPdf = DESTINATION_FOLDER + "simpleOutline.pdf";
116+
String cmpPdf = SOURCE_FOLDER + "cmp_simpleOutline.pdf";
117+
118+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(destinationPdf, new WriterProperties().setPdfVersion(
119+
PdfVersion.PDF_2_0)));
120+
createSimplePdfUA2Document(pdfDocument);
121+
122+
ConverterProperties converterProperties = new ConverterProperties();
123+
FontProvider fontProvider = new DefaultFontProvider(false, true, false);
124+
converterProperties.setFontProvider(fontProvider);
125+
converterProperties.setOutlineHandler(OutlineHandler.createStandardHandler());
126+
HtmlConverter.convertToPdf(new FileInputStream(sourceHtml), pdfDocument, converterProperties);
127+
128+
compareAndCheckCompliance(destinationPdf, cmpPdf, true);
129+
}
130+
111131
private void createSimplePdfUA2Document(PdfDocument pdfDocument) throws IOException, XMPException {
112132
byte[] bytes = Files.readAllBytes(Paths.get(SOURCE_FOLDER + "simplePdfUA2.xmp"));
113133
XMPMeta xmpMeta = XMPMetaFactory.parse(new ByteArrayInputStream(bytes));
Binary file not shown.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<html>
2+
<head>
3+
</head>
4+
<body>
5+
<H1>Top level</H1>
6+
<div>text</div>
7+
<H2>Sublevel 1</H2>
8+
<div>text</div>
9+
<H4>Sublevel 1.1</H4>
10+
<div>text</div>
11+
<H4>Sublevel 1.2</H4>
12+
<div>text</div>
13+
<H2>Sublevel 2</H2>
14+
<div>text</div>
15+
<H4>Sublevel 2.1</H4>
16+
<div>text</div>
17+
<H4>Sublevel 2.2</H4>
18+
<div>text</div>
19+
</body>
20+
</html>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)