将自定义页码标签保存在书签中

时间:2019-08-14 15:44:05

标签: java pdfbox

在屏幕截图中,您可以看到自定义页码标签(i,ii,iii,vii)。

enter image description here

如何使用PDFBox 2.0保存带有自定义页码标签的书签?

我的代码实际上看起来像这样:

PDDocumentOutline documentOutline =  new PDDocumentOutline();
document.getDocumentCatalog().setDocumentOutline(documentOutline);
PDOutlineItem outline = new PDOutlineItem();
outline.setTitle(toc.getName());
documentOutline.addLast(outline);
addToc(toc, outline);
outline.openNode();
documentOutline.openNode();
private void addToc(Toc toc, PDOutlineItem outlineItem) {
    PDPageFitWidthDestination destination = new PDPageFitWidthDestination();
    PDPage page = document.getPage(toc.getPageNumber() - 1);
    destination.setPage(page);
    PDOutlineItem bookmark = new PDOutlineItem();
    bookmark.setDestination(destination);
    bookmark.setTitle(toc.getName());
    outlineItem.addLast(bookmark);

    if (toc.getChildren() != null) {
        for (Toc subToc : toc.getChildren()) {
            addToc(subToc, bookmark);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您只能标记页面,不能标记书签。在下面的示例中(有3个空页面),罗马数字从3开始,然后十进制从1开始。罗马的前缀是“ RO”。因此页面是“ RO III”,“ RO IV”,“ 1”。

PDDocument doc = new PDDocument();
doc.addPage(new PDPage());
doc.addPage(new PDPage());
doc.addPage(new PDPage());
PDPageLabels pageLabels = new PDPageLabels(doc);
PDPageLabelRange pageLabelRange1 = new PDPageLabelRange();
pageLabelRange1.setPrefix("RO ");
pageLabelRange1.setStart(3);
pageLabelRange1.setStyle(PDPageLabelRange.STYLE_ROMAN_UPPER);
pageLabels.setLabelItem(0, pageLabelRange1);
PDPageLabelRange pageLabelRange2 = new PDPageLabelRange();
pageLabelRange2.setStart(1);
pageLabelRange2.setStyle(PDPageLabelRange.STYLE_DECIMAL);
pageLabels.setLabelItem(2, pageLabelRange2);
doc.getDocumentCatalog().setPageLabels(pageLabels);
doc.save("labels.pdf");
doc.close();