java - Itext 7 分割段落

标签 java itext itext7

如何将给定段落拆分为 2 个段落,因为它仅部分适合 Canvas 。分割后,我想将第一部分添加到 Canvas 中,将第二部分添加到新 Canvas 中。

public Paragraph addParagraphToPage(PdfDocument pdfDocument, int pageNum, Rectangle rectangle, Paragraph p) 
{
    PdfPage page = pdfDocument.getPage(pageNum);        
    PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDocument);        
    Canvas canvas = new Canvas(pdfCanvas, pdfDocument, rectangle);

    ParagraphRenderer currentRenderer = (ParagraphRenderer) p.createRendererSubTree();      
    currentRenderer.setParent(canvas.getRenderer());    
    result = currentRenderer.layout(new LayoutContext(new LayoutArea(pageNum, rectangle)));

    ArrayList<Paragraph> paragraphs = new ArrayList<Paragraph>();
    if (result.getStatus() != LayoutResult.FULL)
    {           
        paragraphs = ????? // getNextParagraph(paragraphs, result, pageNum, rectangle, canvas);

        if(paragraphs.size() == 2)
        {
            canvas.add( paragraphs.get(0));
            return paragraphs.get(1);
        }
    }
    return null;
}

最佳答案

您的方法总体上是正确的,iText7 中的布局足够灵活,可以让您轻松地完成所需的操作。我看到的唯一不太清楚的是 Paragraph 实际上是一个无法拆分自身的元素,并且布局框架中没有任何类可以促进元素拆分。您可以手动执行此操作,但没有必要。相反,您应该直接使用 IRenderer,尤其是 ParagraphRenderer

IRenderer 可以由于 layout 操作而 split 自身,并且仅与包含完整数据的 Paragraph 相比,表示必要的数据部分.

您可以将 IRenderer 添加到 CanvasRenderer:

canvas.getRenderer().addChild(rendererToAdd.setParent(canvas.getRenderer()));

并且您可以从 LayoutResult#getSplitRenderer()LayoutResult#getOverflowRenderer() 访问部分渲染器(适合传递区域和溢出部分的部分)。

一般来说,您的代码可以进行如下调整:

public ParagraphRenderer addParagraphToPage(PdfDocument pdfDocument, int pageNum, Rectangle rectangle, ParagraphRenderer renderer) {
    PdfPage page = pdfDocument.getPage(pageNum);
    PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), pdfDocument);
    Canvas canvas = new Canvas(pdfCanvas, pdfDocument, rectangle);

    renderer.setParent(canvas.getRenderer());
    LayoutResult result = renderer.layout(new LayoutContext(new LayoutArea(pageNum, rectangle)));

    IRenderer rendererToAdd = result.getStatus() == LayoutResult.FULL ? renderer : result.getSplitRenderer();

    canvas.getRenderer().addChild(rendererToAdd.setParent(canvas.getRenderer()));

    return result.getStatus() != LayoutResult.FULL ? (ParagraphRenderer) result.getOverflowRenderer() : null;
}

然后,为了将段落添加到连续页面,直到放置所有内容,您基本上只需要两行代码:

ParagraphRenderer renderer = (ParagraphRenderer) p.createRendererSubTree();
while ((renderer = addParagraphToPage(pdfDocument, pageNum++, rectangle, renderer)) != null);

关于java - Itext 7 分割段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46895474/

相关文章:

java - 从Evaluation.predictions() Weka-api java中保存在快速 vector 中的结果的含义是什么

java - 为什么连接没有超时?

java - 大小为 N 的给定数组之间有 k 个空格的 n 个数字的最小总和

Java PDF 操作和渲染

java - 使用 CSS 和 JAVA 生成 PDF

java - Java 中使用 XADES-EPES 进行 XML 签名有一个很好的示例吗?

java - 如何同时进行pdf书写和复印?

java - 获取页面信息时出现 NullPointerException

pdf - iText7中设置表格列宽问题

Itextsharp 7 - 缩放并居中的图像作为水印