从java代码生成PDF,使用iText动态继续文件模板

时间:2015-04-20 16:04:42

标签: java pdf-generation itext

我需要使用复杂模板生成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 |  | | |  +----------------------+-----------------------+

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

谢谢。

更新

这是Excel中的模板。

表格的两行在模板中间笔直。因此,一般标题包含表格列标题,页脚标题为页脚。

The template The template

1 个答案:

答案 0 :(得分:1)

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

enter image description here

enter image description here

让我们来看看代码:

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内并不会对文本进行栅格化。您将发现文本&#34;这是标题&#34;仍然可以选择,复制和粘贴。