itext 7拆分段落 [英] Itext 7 Split Paragraph

查看:205
本文介绍了itext 7拆分段落的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何将给定的段落分为2个段落,因为它只适合画布的一部分.拆分后,我想将第一部分添加到画布中,然后将第二部分添加到新画布中.

How can I split a given paragraph to 2 paragraphs, due to that it fits only partial into canvas. After split, I would like to add the first part into canvas and the second to a new 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.

Your approach is correct in general and layout in iText7 is flexible enough to allow you to do required thing in an easy manner. The only thing I see that is not very clear is that Paragraph is actually an element that cannot split itself and no classes in layout framework facilitate element splitting. You could do it manually, but there is no need to. Instead you should work with IRenderer, and ParagraphRenderer in particular, directly.

IRenderer可以通过layout操作进行自我拆分,并且仅与包含完整数据的Paragraph相比,表示数据的必要部分.

IRenderer can split itself as a result of layout operation and represents the necessary portion of data only compared to the Paragraph which contains full data.

您可以将IRenderer添加到CanvasRenderer:

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

您可以从LayoutResult#getSplitRenderer()LayoutResult#getOverflowRenderer()访问部分渲染器(适合通过区域和溢出部分的部分).

And you can access the partial renderers (the portion that fit the passed area and overflow part) from LayoutResult#getSplitRenderer() and LayoutResult#getOverflowRenderer().

通常,您的代码可以按如下所示进行修改:

In general, your code can be adapted like follows:

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;
}

然后将段落添加到顺序页面中,直到所有内容都放置完毕,您基本上只需要两行代码:

And then for adding paragraph to sequential pages until all the content is placed you basically need only two lines of code:

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

这篇关于itext 7拆分段落的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆