1

iText の代わりにOpenPDFを使用しています。それは私の要件のほとんどを満たしています。List と ListItems のクリック アンド ナビゲート ブックマークを追加しようとしましたが、できませんでした。これが私が試したことです。段落が追加されたときにイベント ハンドラー フックを追加しました。

public class OPBookmarkBuilder extends PdfPageEventHelper {
    public void onParagraph(PdfWriter writer, Document document, float position) {
        PdfContentByte cb = writer.getDirectContent();
        PdfDestination destination = new PdfDestination(PdfDestination.FITH, position);
        new PdfOutline(cb.getRootOutline(), destination, "Para1-bookmark");
    }
}

Listまたはを追加するとListItem、次のようにブックマークがその段落に追加されるように、ダミーの段落も追加されます。

public class PDFGenerator {
    public static void main(String[] args) {
        Document document = new Document();
        final PdfWriter instance = PdfWriter.getInstance(document, new FileOutputStream("testbm.pdf"));
        OPBookmarkBuilder bookmarkBuilder = new OPBookmarkBuilder();
        instance.setPageEvent(bookmarkBuilder);
        instance.setPageEvent(image);
        document.open();
        instance.setViewerPreferences(PdfWriter.PageModeUseOutlines);
        document.add(new Paragraph(....));
        List section = new Section();
        section.add(new ListItem("test1",...));
        section.add(new Table(..));
        // Add a dummy empty paragraph so that PDFOutline is added.
        document.add(new Paragraph("",...));
        section.add(new ListItem("test2",...));
        // ...
        document.add(section);
        document.close();
    }
}

何らかの要素がドキュメントに追加されるまで、位置は移動しません。ここでの問題は、ドキュメントにリストを追加しない限り(前にdocument.close())、位置が移動していないため、ダミー段落を追加すると同じ宛先にアウトラインが追加されることです。生成された PDF で、ブックマークをクリックしても、対応するリスト項目に移動しません。チャプターセクションを調べましたが、番号付きの箇条書きが表示されますが、これは望ましくありません。

4

1 に答える 1

1

最初のステップでは、この宛先に静的な名前を割り当てる レベルでローカル宛先を設定します。Chunk2 番目のステップでは、 PdfActionPdfOutlineを渡して を作成し、 で参照されているローカルの宛先にジャンプします。PdfAction.gotoLocalPage("label", false)

これが実際の例です:

Document document = new Document(PageSize.A4);
PdfWriter instance = PdfWriter.getInstance(document, new FileOutputStream("out.pdf"));
instance.setViewerPreferences(PdfWriter.PageModeUseOutlines);
document.open();

List list = new List();
list.add(new ListItem(new Chunk(LOREM_IPSUM_A).setLocalDestination("dest1")));
list.add(new ListItem(new Chunk(LOREM_IPSUM_B).setLocalDestination("dest2")));
list.add(new ListItem(new Chunk(LOREM_IPSUM_C).setLocalDestination("dest3")));
document.add(list);

// add outline items
PdfOutline root = instance.getDirectContent().getRootOutline();
new PdfOutline(root, PdfAction.gotoLocalPage("dest1", false), "test-a");
new PdfOutline(root, PdfAction.gotoLocalPage("dest2", false), "test-b");
new PdfOutline(root, PdfAction.gotoLocalPage("dest3", false), "test-c");

document.close();

LOREM_IPSUM_A, LOREM_IPSUM_B,LOREM_IPSUM_Cは、フィラー テキストを含む定数です。

これは、 test-bをクリックした後の Adob​​e Acrobat での外観です。

結果

于 2021-07-17T09:05:32.593 に答える