【问题标题】:Generate PDF from java code that dynamically continue file template with iText从使用 iText 动态继续文件模板的 java 代码生成 PDF
【发布时间】:2015-04-20 16:04:41
【问题描述】:

我需要使用复杂的模板生成 pdf 报告。我有一个 xls 文件 复杂的布局,通常由表头和表头组成,表 行、表格页脚和一般页脚。

是否可以使用 itext 生成 pdf 报告 从

顺序生成
  • 包含表格列标题行的Header.pdf 文件
  • 在 java 代码表行中动态生成,将无缝继续 Header.pdf 中的表格
  • Footer.pdf 带有可以无缝延续表格行的列页脚 由 java 代码生成。

像这样:

Header.pdf
+----------------------------------------------+  |                                              |  |                Header                        |  +----------------------------------------------+  |                      |                       |  |   Column 1 Header    |     Column N Header   |  |                      |                       |  +----------------------------------------------+ 

Java 代码生成的表行
 +----------------------------------------------+  | | |  | Value 11 | Value 1M |  | | |  +----------------------------------------------+  ...  +----------------------------------------------+  | | |  | Value N1 | Value NM |  | | |  +----------------------+-----------------------+

页脚.pdf
+----------------------------------------------+  | | |  | Column 1 Footer | Column N Footer |  | | |  | | |  +----------------------+-----------------------+  | |  | Footer |  | |  +----------------------------------------------+

谢谢。

更新

这是 Excel 中的模板。

表格的两行在模板的中间。相应地,带有表格列标题的通用标题和带有列脚注的页脚。

The template

【问题讨论】:

  • 请描述 header.pdf 和 footer.pdf。为什么是PDF文件?为什么不只是一些内容?为什么是PDF?这些 1 页 PDF 的页面大小是多少(假设它们只有 1 页)? header.pdf 和 footer.pdf 是交互式 PDF 还是只是平面的?
  • @BrunoLowagie 请查看原帖的更新。我已经制作了源excel文件的截图。
  • 我不明白 excel 文件的用途。我没有看到任何页脚页眉,也没有看到这与 PDF 有什么关系。我将向您展示一个示例,然后您可以使用该示例来阐明您的意思。
  • 我的回答与问题相符吗?

标签: java pdf-generation itext


【解决方案1】:

假设您有页眉 (header.pdf) 和页脚 (footer.pdf),那么您可以将这些静态 PDF 集成为页眉和页脚,如 SimpleTable8 示例中所述(请参阅 simple_table8.pdf) :

我们看一下代码:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(3);
    table.setWidthPercentage(100);
    PdfReader reader = new PdfReader("resources/pdfs/header.pdf");
    PdfImportedPage header = writer.getImportedPage(reader, 1);
    PdfPCell cell = new PdfPCell(Image.getInstance(header));
    cell.setColspan(3);
    table.addCell(cell);
    for (int row = 1; row <= 50; row++) {
        for (int column = 1; column <= 3; column++) {
            table.addCell(String.format("row %s, column %s", row, column));
        }
    }
    reader = new PdfReader("resources/pdfs/footer.pdf");
    PdfImportedPage footer = writer.getImportedPage(reader, 1);
    cell = new PdfPCell(Image.getInstance(footer));
    cell.setColspan(3);
    table.addCell(cell);
    document.add(table);
    document.close();
}

我们像这样导入页眉(或页脚):

PdfReader reader = new PdfReader("resources/pdfs/header.pdf");
PdfImportedPage header = writer.getImportedPage(reader, 1);

现在我们创建一个PdfPCell,将这个PdfImportedPage 包裹在一个Image 中,然后我们将cell 添加到table

PdfPCell cell = new PdfPCell(Image.getInstance(header));
cell.setColspan(3);
table.addCell(cell);

请注意,将PdfImportedPage 包裹在Image 中不会光栅化文本。您会发现“This is a header”文本仍然可以选择、复制和粘贴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 2015-07-17
    • 1970-01-01
    • 2013-06-05
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多