java - 从使用 iText 动态延续文件模板的 java 代码生成 PDF

标签 java pdf-generation itext

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

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

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

像这样:

标题.pdf
+-------------------------------------------------------- + | | |标题                        | +----------------------------------------------------------+ | | | |列 1 标题    |列 N 标题   | | | | +---------------------------------------------------------+ 

Java 代码生成的表行
 +--------------------------------------------------------- + | | | |值 11 |值(value)100万 | | | | +----------------------------------------------------------+ ... +----------------------------------------------------------+ | | | |值 N1 |值(value)近乎 | | | | +--------------------------------+------------------------+

页脚.pdf
+-------------------------------------------------------- + | | | |第 1 栏页脚 | N 列页脚 | | | | | | | +--------------------------------+------------------------+ | | |页脚| | | +----------------------------------------------------------+

谢谢。

更新

这是 Excel 中的模板。

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

The template The template

最佳答案

假设您有页眉 ( 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 添加到:

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

请注意,将 PdfImportedPage 包装在 Image 内不会光栅化文本。您会发现文本“这是标题”仍然可以选择、复制和粘贴。

关于java - 从使用 iText 动态延续文件模板的 java 代码生成 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752875/

相关文章:

pdf - JxBrowser 7.X 版本将 html 转换为 pdf

.net - 如何在绝对位置插入 iTextSharp.text.Rectangle 矩形?

java - 线程二叉树

java - Parse 中的 objectId 始终为 NULL

java - findViewByID 找不到 ListView

javascript - 如何从 ApexCharts 获取 URI 以下载 PDF 格式?

fonts - 从.ttf生成.afm

c# - 如何在 iTextSharp 中像 block 一样渲染 PdfContentByte

android - 在现有 PDF 文件中添加文本/注释并在 android 中查看/渲染输出

java - 将 "2 backgrounds"设置为按钮