【发布时间】:2014-05-05 21:54:45
【问题描述】:
我在生成 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();
}
}
在我们将 CONTENT 添加到文档之后,您会注意到一个 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 节是否会将内容添加到新页面?
【问题讨论】:
标签: itext