iText 8 中的动态页面高度

问题描述 投票:0回答:1

我遇到这种情况,我需要将所有内容都放在 iText8 的单个 PDF 页面中。

到目前为止我已经尝试了几种方法都没有成功。

我的想法之一是创建一个元素列表,将其添加到文档中并计算每个元素的高度,然后将所有元素相加,并将高度发送到 Document 对象中的 PageSize 上。

那不起作用。

另一个想法是向表中添加行并将表添加到临时文档中,然后获取表高度并创建另一个文档,将该表高度传递给 PageSize,但这也不起作用。

还有其他想法吗?

创建一个包含 50 行的表示例:

private List<IElement> createContent() {
    List<IElement> elements = new ArrayList<>();
    int totalRows = 50;
    Table table = new Table(UnitValue.createPercentArray(new float[] { 70f, 30f })).useAllAvailableWidth().setMarginTop(0f);
    for (int i = 0; i < totalRows; i++) {
        Cell coluna1 = new Cell().setPadding(0f).add(new Paragraph("" + (i + 1) + ", 1").setPadding(1f));
        Cell coluna2 = new Cell().setPadding(0f).add(new Paragraph("" + (i + 1) + ", 2").setPadding(1f));
        table.addCell(coluna1);
        table.addCell(coluna2);
    }
    elements.add(table);
    return elements;
}  

尝试获取总高度:

   private static float calculateTotalHeight(List<IElement> elements, float availableWidth) {
    float totalHeight = 0f;
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(new ByteArrayOutputStream()));
    Document doc = new Document(pdfDoc, new PageSize(availableWidth, 1000));
    doc.setMargins(0, 0, 0, 0);

    for (IElement element : elements) {
        IRenderer renderer = element.createRendererSubTree().setParent(doc.getRenderer());
        LayoutResult result = renderer.layout(new LayoutContext(new LayoutArea(0, new Rectangle(availableWidth, 1000))));
        totalHeight += result.getOccupiedArea().getBBox().getHeight();
    }

    doc.close();
    return totalHeight;
}

尝试设置文档页面大小:

List<IElement> elements = createContent();
float totalHeight = calculateTotalHeight(elements, paperWidth);
PageSize pageSizeTemp = new PageSize(paperWidth, totalHeight);
itext java-11
1个回答
0
投票

由于您没有添加它为您生成的一些输出,所以我不确定出了什么问题。但这个代码片段似乎提供了所需的行为。

    int pageWidth = 200;
    float INF = 1e6f;

    //layout in infinite space
    Document doc = new Document(new PdfDocument(new PdfWriter(new ByteArrayOutputStream())), new PageSize(pageWidth, INF));

    List<IElement> f = createContent();
    Div container = new Div();
    for (IElement iElement : f) {
        container.add((BlockElement<?>) iElement);
    }
    LayoutContext context = new LayoutContext(new LayoutArea(1, new Rectangle(pageWidth, INF)));
    DivRenderer renderer = (DivRenderer) container.createRendererSubTree();
    renderer.setParent(doc.getRenderer());
    LayoutResult result = renderer.layout(context);

    float size = result.getOccupiedArea().getBBox().getHeight();
    doc.close();


    // Use the calculated size to set the just fitting page
    PdfDocument doc2 = new PdfDocument(new PdfWriter("hello.pdf"));
    Document doc3 = new Document(doc2, new PageSize(200, size));
    //It's probably this line you are missing
    doc3.setMargins(0,0,0,0);
    for (IElement iElement : createContent()) {
        doc3.add((BlockElement<?>) iElement);
    }
    doc3.close();

这导致 pdf 看起来像这样:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.