Itext 7 拆分段落
Itext 7 Split Paragraph
如何将给定的段落拆分为 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
操作的结果自行拆分,与包含完整数据的 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);
如何将给定的段落拆分为 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
操作的结果自行拆分,与包含完整数据的 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);