Java Itext 7分段

Java Itext 7分段,java,itext,itext7,Java,Itext,Itext7,如何将给定的段落拆分为2段,因为它只适合画布的一部分。拆分后,我想将第一部分添加到画布中,将第二部分添加到新画布中 public Paragraph addParagraphToPage(PdfDocument pdfDocument, int pageNum, Rectangle rectangle, Paragraph p) { PdfPage page = pdfDocument.getPage(pageNum); PdfCanvas pdfCanvas

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

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;
}
公共段落添加段落页面(PdfDocument PdfDocument,int pageNum,矩形,段落p)
{
PdfPage page=pdfDocument.getPage(pageNum);
PdfCanvas PdfCanvas=新的PdfCanvas(page.newContentStreamAfter(),page.getResources(),pdfDocument);
画布画布=新画布(pdfCanvas、pdfDocument、矩形);
ParagraphRenderer currentRenderer=(ParagraphRenderer)p.CreateRenderSubtree();
currentRenderer.setParent(canvas.getRenderer());
结果=currentRenderer.layout(新的LayoutContext(新的LayoutArea(pageNum,矩形));
ArrayList段落=新的ArrayList();
if(result.getStatus()!=LayoutResult.FULL)
{           
段落=???//getNextParagraph(段落、结果、页面编号、矩形、画布);
如果(段落大小()==2)
{
canvas.add(段落.get(0));
返回段落。获取(1);
}
}
返回null;
}

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

i文件夹
可以由于
布局
操作而自行拆分,只表示与包含完整数据的
段落
相比所需的数据部分

您可以将
i渲染器添加到
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);

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

i文件夹
可以由于
布局
操作而自行拆分,只表示与包含完整数据的
段落
相比所需的数据部分

您可以将
i渲染器添加到
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);

分享你的代码,更明确一点。如果有人能帮助我,我会很高兴的。可以,等一下。它到底应该在哪里拆分?@mkl第一部分:取决于段落的哪一部分适合画布(getSplitRenderer)。第二部分:段落的其余部分(getOverflowRenderer)是否共享您的代码,请更明确一点。如果有人能帮助我,我将很高兴。可以,请稍等片刻。具体在哪里拆分?@mkl第一部分:取决于段落的哪一部分适合画布(getSplitRenderer)。第二部分:段落的其余部分(getOverflowRenderer)是如何捕获文本的?我的第一页被分成三部分,第一部分和第三部分是静态元素。我需要将第二部分作为续页转到第二页。你如何捕获文本?我的第一页被分成三部分,第一部分和第三部分是静态元素。我需要第二部分作为续页转到第二页。