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 で、ブックマークをクリックしても、対応するリスト項目に移動しません。チャプターとセクションを調べましたが、番号付きの箇条書きが表示されますが、これは望ましくありません。