【问题标题】:Create mutli-page document dynamically using PDFBox使用 PDFBox 动态创建多页文档
【发布时间】:2014-03-26 14:05:02
【问题描述】:

我正在尝试从 Java ResultSet 创建 PDF 报告。如果报告只有一页,我在这里没有问题。问题在于报告的长度可能从一到十页不等。现在,我有这个来创建一个单页文档:

PDDocument document = new PDDocument();
PDPage page = new PDPage(PDPage.PAGE_SIZE_LETTER);
document.addPage(page);
PDPageContentStream content = new PDPageContentStream(document,page);

所以我的问题是,如何根据需要动态创建页面。是否有一个面向对象的答案盯着我看,我只是看不到它?

【问题讨论】:

  • 每次当前页面已满时,page = new PDPagedocument.addPage(page)content = new PDPageContentStream 有什么不好(在非常低级的 PDFBox 页面创建 API 的上下文中)?跨度>
  • @mkl,是的,谢谢!正如我所料,答案就在我的眼皮底下。

标签: java pdf pdfbox


【解决方案1】:

正如我所料,答案就在我眼前,我只是需要有人为我指出来。

PDDocument document = new PDDocument();
PDPage page = new PDPage(PDPage.PAGE_SIZE_LETTER);
document.addPage(page);
PDPageContentStream content = new PDPageContentStream(document,page);

//generate data for first page

content.close();

//if number of results exceeds what can fit on the first page
page = new PDPage(PDPage.PAGE_SIZE_LETTER);
document.addPage(page);
content = new PDPageContentStream(document,page);

//generate data for second page

content.close();

感谢@mkl 的回答。

【讨论】:

  • 能否请您指定如何知道“如果结果数量超过了第一页可以容纳的数量”?谢谢
  • 使用此示例时,我收到警告“pdmodel.PDPageContentStream.:您正在覆盖现有内容,您应该使用附加模式”并且只有 PDF 的最后一页被写入文件”。我使用带有 2 个布尔参数的构造函数解决了它: content = new PDPageContentStream(doc, page, true, true);
  • 从 PDFBox 2.0.20 开始,页面大小的常量现在位于 PDRectangle 类中。所以创建一个新页面将使用PDPage page = new PDPage(PDRectangle.LETTER);
【解决方案2】:

使用 PDFBox 创建多页 PDF 文档:

(a) 创建新页面,新内容流,移动到左上角,开始写作。在编写每个单词时,检查所需空间是否不超过媒体框宽度。如果交叉,移动到最左边的下一行并开始书写。继续写到页面的最后一行。

(b) 当写入操作到达当前页的最后一行时,关闭 contentStream 并将当前页添加到文档中,

(c) 重复步骤 (a) 和 (b) 直到写入最后一条记录/行/行。

        PDDocument document = new PDDocument();
        PDFont font = PDType1Font.HELVETICA;

//For Each Page:
        PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.setFont(font, 12);
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(100, 700);
        contentStream.drawString("PDF BOX TEXT CONTENT");
        contentStream.endText();
        contentStream.close();
        document.addPage(page);

//After All Content is written:
        document.save(pdfFile);
        document.close();

提示:使用字体参数(如大小/高度和剩余媒体框高度)来确定页面的最后一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多