如何使用矩形数组获取 ColumnDocumentRenderer 的 LayoutResult

How to get LayoutResult for ColumnDocumentRenderer with Rectangle Array

下面的代码使用 ColumnDocumentRenderer 将段落呈现为 4 个矩形区域。在调用 cdr.draw() 方法之前,我想确定文本是否太长而不适合。如果是,我将使用 setHorizo​​ntalScaling 使其适合。

我想使用生成 LayoutResult 的 ColumnDocumentRenderer.layout 方法来完成此操作。但是,它需要一个矩形 bBox:cdr.layout(new LayoutContext(new LayoutArea(pageNumber, bBox)));

有没有办法遍历这些区域,看看是否所有的区域都被填满了,而最后一个区域是否会溢出?

public static void main(String[] args) throws FileNotFoundException {

    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
    PdfPage page = pdfDoc.addNewPage();
    PdfCanvas pdfCanvas = new PdfCanvas(page);
    Document doc = new Document(pdfDoc);

    Rectangle r1 = new Rectangle(50, 560, 200, 20);
    Rectangle r2 = new Rectangle(50, 540, 200, 20);
    Rectangle r3 = new Rectangle(25, 520, 275, 20);
    Rectangle r4 = new Rectangle(25, 500, 275, 20);
    Rectangle[] rects = { r1, r2, r3, r4 };

    Text t = new Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt "
            + "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris "
            + "nisi ut aliquip ex ea commodo consequat. "); 
    t.setFontSize(10f);
    //t.setHorizontalScaling(.85f);

    Paragraph p = new Paragraph(); 
    p.setMargin(0);
    p.setMultipliedLeading(1);
    p.add(t);
    p.setTextAlignment(TextAlignment.JUSTIFIED);

    ParagraphRenderer pr = (ParagraphRenderer)p.createRendererSubTree();

    ColumnDocumentRenderer cdr = new ColumnDocumentRenderer(doc, rects);
    cdr.addChild(pr);


    cdr.draw(new DrawContext(pdfDoc, pdfCanvas));
    pdfDoc.close();
}

这里的重点是根渲染器不支持 layout 操作。但是,他们有 getCurrentArea() 方法可以让您跟踪文档中当前未使用的位置。

想法是排版段落,看看我们是在第二页还是第一页,如果发生溢出(第二页),则缩小文本。

根据您的用例,此方法可能需要进行一些更改,尤其是在删除页面的部分,但我假设您是从头开始创建文档,就像您在问题中提供的示例中所做的那样。

代码中的方法如下所示:

float step = 0.05f;
float curHorScaling = 1;
ColumnDocumentRenderer cdr;
while (true) {
    // Remove extra pages and create a new, clean ColumnDocumentRenderer
    while (doc.getPdfDocument().getNumberOfPages() > 1) {
        doc.getPdfDocument().removePage(1);
    }
    cdr = new ColumnDocumentRenderer(doc, false, rects);
    t.setHorizontalScaling(curHorScaling);
    cdr.getChildRenderers().clear();
    cdr.addChild(p.createRendererSubTree());
    If one page is not enough, decrease the scaling, otherwise go to drawing
    if (cdr.getCurrentArea().getPageNumber() > 1) {
        curHorScaling -= step;
    } else {
        break;
    }
}

完整修改代码:

Document doc = new Document(pdfDoc);

Rectangle r1 = new Rectangle(50, 560, 200, 20);
Rectangle r2 = new Rectangle(50, 540, 200, 20);
Rectangle r3 = new Rectangle(25, 520, 275, 20);
Rectangle r4 = new Rectangle(25, 500, 275, 20);
Rectangle[] rects = { r1, r2, r3, r4 };

Text t = new Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt "
        + "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris "
        + "nisi ut aliquip ex ea commodo consequat. ");
t.setFontSize(10f);

Paragraph p = new Paragraph();
p.setMargin(0);
p.setMultipliedLeading(1);
p.add(t);
p.setTextAlignment(TextAlignment.JUSTIFIED);

float step = 0.05f;
float curHorScaling = 1;
ColumnDocumentRenderer cdr;
while (true) {
    while (doc.getPdfDocument().getNumberOfPages() > 0) {
        doc.getPdfDocument().removePage(1);
    }
    cdr = new ColumnDocumentRenderer(doc, false, rects);
    t.setHorizontalScaling(curHorScaling);
    cdr.getChildRenderers().clear();
    cdr.addChild(p.createRendererSubTree());
    if (cdr.getCurrentArea().getPageNumber() > 1) {
        curHorScaling -= step;
    } else {
        break;
    }
}

cdr.draw(new DrawContext(pdfDoc, new PdfCanvas(pdfDoc.getFirstPage())));
pdfDoc.close();