Itext 文档关闭时书签PdfOutline异常问题

Itext 文档关闭时书签PdfOutline异常问题,itext,Itext,我在生成PDF时遇到了一个有趣的问题。我最近在PDF中引入了书签,并在关闭文档时注意到了一些问题。让我们从正在发生的事情的示例代码开始 private static String CONTENT = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam vol

我在生成PDF时遇到了一个有趣的问题。我最近在PDF中引入了书签,并在关闭文档时注意到了一些问题。让我们从正在发生的事情的示例代码开始

private static String CONTENT = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n" +
        "\n" +
        "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.\n" +
        "\n" +
        "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.\n" +
        "\n" +
        "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.\n" +
        "\n" +
        "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.\n" +
        "\n" +
        "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.\n";

public static void main(String[] args)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Document document = new Document();
    try
    {
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        document.open();
        PdfOutline root = writer.getRootOutline();

        int i = 0;
        PdfDestination destination = new PdfDestination(PdfDestination.XYZ);
        PdfOutline outline = new PdfOutline(root, destination, "Section 1");
        writer.getDirectContent().localDestination(""+(i++), destination);
        document.add(new Paragraph(CONTENT));

        document.newPage();

        destination = new PdfDestination(PdfDestination.XYZ);
        outline = new PdfOutline(root, destination, "Section 2");
        writer.getDirectContent().localDestination(""+(i++), destination);

        document.close();

        PDFEmbeddedManager manager = new PDFEmbeddedManager();

        JFrame frame = new JFrame("TEST");
        frame.setSize(1024, 768);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());
        frame.getContentPane().add(manager.getFormView(), BorderLayout.CENTER);


        manager.showPDF(baos.toByteArray(), "");

        frame.setVisible(true);
    }
    catch (DocumentException e)
    {
        e.printStackTrace();
    }
}
在我们将内容添加到文档中之后,您会注意到一个newPage()语句,然后是一个提纲。这就是麻烦开始的地方。当我试图关闭文档时,我们得到了一个异常,我看到它的意思是PdfWriter的close()中的设计。但是,如果我们在newPage()之后删除书签,一切都很好,也不例外

现在我的问题是,对于我们来说,在newPage()之后继续添加书签/大纲的好方法是什么,它将允许我们毫无例外地关闭文档?有没有办法让我们浏览所有的书签/大纲,将它们的目的地指向最后一页而不是不存在的页面?非常感谢您的帮助和见解。谢谢

编辑:

例外情况如下:

Exception in thread "main" java.lang.RuntimeException: The page 2 was requested but the document has only 1 pages.
编辑2:

主要是,我想实现的是在书签中显示第2节,即使第2节有没有内容。在第1节末尾调用newPage(),然后添加第2节大纲,但不添加内容,因此引发异常。我有没有办法继续添加第2节大纲/书签,而不必担心第2节是否会向新页面添加内容

对于我们来说,在newPage()之后继续添加书签/大纲的好方法是什么,它将允许我们无一例外地关闭文档

newPage()
之后使用大纲不足以触发您的问题。务必不要在
newPage()
之后添加任何内容,只添加书签

发生以下情况:

  • newPage()
    使iText完成当前(第一)页并在内存中启动新(第二)页
  • localDestination(…)
    初始化目标以指向当前第2页
  • close()
    当前第2页上仍然没有内容,因此没有写入PDF
  • close()
    中写入书签时,iText会看到不存在的页面上存在书签目标,并引发异常
通过在设置目标后向文档中添加内容,可以轻松防止该异常的发生,例如:

    ...
    writer.getDirectContent().localDestination(""+(i++), destination);
    document.add(new Paragraph("x")); // <<<<< Adds content to the page the destination points to

    document.close();
。。。
writer.getDirectContent().localDestination(“+(i++),destination);
文件.添加(新的段落(“x”);//
对于我们来说,在newPage()之后继续添加书签/大纲的好方法是什么,它将允许我们无一例外地关闭文档

newPage()
之后使用大纲不足以触发您的问题。务必不要在
newPage()
之后添加任何内容,只添加书签

发生以下情况:

  • newPage()
    使iText完成当前(第一)页并在内存中启动新(第二)页
  • localDestination(…)
    初始化目标以指向当前第2页
  • close()
    当前第2页上仍然没有内容,因此没有写入PDF
  • close()
    中写入书签时,iText会看到不存在的页面上存在书签目标,并引发异常
通过在设置目标后向文档中添加内容,可以轻松防止该异常的发生,例如:

    ...
    writer.getDirectContent().localDestination(""+(i++), destination);
    document.add(new Paragraph("x")); // <<<<< Adds content to the page the destination points to

    document.close();
。。。
writer.getDirectContent().localDestination(“+(i++),destination);
文件.添加(新的段落(“x”);//
对于我们来说,在newPage()之后继续添加书签/大纲的好方法是什么,它将允许我们无一例外地关闭文档

newPage()
之后使用大纲不足以触发您的问题。务必不要在
newPage()
之后添加任何内容,只添加书签

发生以下情况:

  • newPage()
    使iText完成当前(第一)页并在内存中启动新(第二)页
  • localDestination(…)
    初始化目标以指向当前第2页
  • close()
    当前第2页上仍然没有内容,因此没有写入PDF
  • close()
    中写入书签时,iText会看到不存在的页面上存在书签目标,并引发异常
通过在设置目标后向文档中添加内容,可以轻松防止该异常的发生,例如:

    ...
    writer.getDirectContent().localDestination(""+(i++), destination);
    document.add(new Paragraph("x")); // <<<<< Adds content to the page the destination points to

    document.close();
。。。
writer.getDirectContent().localDestination(“+(i++),destination);
文件.添加(新的段落(“x”);//
对于我们来说,在newPage()之后继续添加书签/大纲的好方法是什么,它将允许我们无一例外地关闭文档

newPage()
之后使用大纲不足以触发您的问题。务必不要在
newPage()
之后添加任何内容,只添加书签

发生以下情况:

  • newPage()
    使iText完成当前(第一)页并在内存中启动新(第二)页
  • localDestination(…)
    初始化目标以指向当前第2页
  • close()
    当前第2页上仍然没有内容,因此没有写入PDF
  • close()
    中写入书签时,iText会看到不存在的页面上存在书签目标,并引发异常
通过在设置目标后向文档中添加内容,可以轻松防止该异常的发生,例如:

    ...
    writer.getDirectContent().localDestination(""+(i++), destination);
    document.add(new Paragraph("x")); // <<<<< Adds content to the page the destination points to

    document.close();
。。。
writer.getDirectContent().localDesti