使用 JPype 使 iText 7 Table 适合带有图像的单页

Fit iText 7 Table to Single Page with Images using JPype

我正在尝试将 table 的所有内容放入单个 A4 PDF。

我在同一主题上找到了另一篇链接到 itextpdf 页面的 SO 文章 here

但是,我不确定应该如何实施。我将上面的代码转换为 JPype,它似乎 运行。但是我没有得到想要的效果。

我希望能够向此 table 添加图像,并使其大小合适,以便它保持单个 A4 页面。

来源和示例在我的 github 页面上: https://github.com/krowvin/jpypeitext7example

Example PDF

Source

假设这是 table 完全适合 A4 页面:

    Table table = new Table(2);
    for (int i = 0; i < 100; i++) {
        table.addCell(new Cell().add(new Paragraph(i + " Hello")));
        table.addCell(new Cell().add(new Paragraph(i + " World")));
    }

由于它太长而无法通过通常的布局流程完全适应(例如 Document#add),我们应该以某种方式对其进行缩放。但首先,让我们看看如果要放置的页面是无限的,这个table占多少space:

    LayoutResult result = table.createRendererSubTree().setParent(doc.getRenderer())
            .layout(new LayoutContext(new LayoutArea(1, new Rectangle(10000, 10000))));
    Rectangle occupiedRectangle = result.getOccupiedArea().getBBox();

现在让我们创建这个 table 的表单 xobject,我们将在下面缩放几行:

    PdfFormXObject xObject = new PdfFormXObject(new Rectangle(occupiedRectangle.getWidth(), occupiedRectangle.getHeight()));
    new Canvas(xObject, pdfDoc).add(table).close();

所以现在我们有了 table 的 xObject,唯一的问题是如何适应它,例如要应用的比例系数:

   double coefficient = Math.min(PageSize.A4.getWidth() / occupiedRectangle.getWidth(), 
            PageSize.A4.getHeight() / occupiedRectangle.getHeight());

我们快完成了:现在让我们将 table 的缩放版本添加到文档页面:

        new PdfCanvas(pdfDoc.addNewPage())
            .saveState()
            .concatMatrix(coefficient, 0, 0, coefficient, 0, 0)
            .addXObject(xObject)
            .restoreState();

就是这样: