2017-10-23 6 views
0

どの段落をどの段落に分割するかは、部分的にしかキャンバスに収まらないためです。分割後、最初の部分をキャンバスに追加し、2番目の部分を新しいキャンバスに追加したいと思います。Itext 7段落を分割する

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

コードを共有すると、より明示的になります。 – pirs

+0

誰かが私を助けることができたら、私はうれしいでしょう。 –

+0

それは大丈夫でしょう、しばらく待ってください – pirs

答えて

0

あなたのアプローチは一般的に正しいですし、iText7のレイアウトは、あなたが簡単に必要なことをするのに十分な柔軟性があります。私が唯一知っているのは、実際にはParagraphがそれ自身を分割できない要素であり、レイアウトフレームワーク内のクラスが要素分割を容易にしないということです。手動で行うこともできますが、必要はありません。代わりに、IRendererと特にParagraphRendererを直接使用する必要があります。

IRendererは、layoutの結果として分割することができ、完全なデータを含むParagraphと比較してデータの必要な部分を表します。

あなたはCanvasRendererIRendererを追加することができます。

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

そして、すべてのコンテンツが配置されるまで、連続的なページに段落を追加するために、あなたは基本的には、コードの2つだけの行が必要です。

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

このソリューションは本当にうまく機能します。どうもありがとう ;-) –

関連する問題