2017-10-23 5 views
0

Wie kann ich einen Absatz auf 2 Absätze aufteilen, da er nur teilweise in die Leinwand passt. Nach dem Teilen möchte ich den ersten Teil in die Leinwand und den zweiten Teil in eine neue Leinwand einfügen.Itext 7 Split Absatz

+0

Teilen Sie Ihren Code, expliziter sein .. – pirs

+0

Ich würde mich freuen, wenn mir jemand helfen könnte. –

+0

Es wäre ok, warte eine Weile – pirs

Antwort

0

Ihre Vorgehensweise ist im Allgemeinen korrekt und das Layout in iText7 ist flexibel genug, um Ihnen die erforderliche Aufgabe auf einfache Weise zu ermöglichen. Das einzige, was ich sehe, ist nicht sehr klar ist, dass Paragraph ist eigentlich ein Element, das sich nicht teilen kann und keine Klassen im Layout-Framework erleichtern Element Splitting. Sie könnten es manuell tun, aber das ist nicht nötig. Stattdessen sollten Sie direkt mit IRenderer und ParagraphRenderer arbeiten.

IRenderer kann sich als Ergebnis von layout Betrieb aufteilen und stellt den notwendigen Teil der Daten nur im Vergleich zu der Paragraph, die vollständige Daten enthält.

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

Und Sie können die Teil-Renderer zugreifen (der Teil, der den übergebenen Bereich und Überlaufteil passen) aus LayoutResult#getSplitRenderer() und LayoutResult#getOverflowRenderer():

Sie können eine IRenderer, um den CanvasRenderer hinzuzufügen.

Im Allgemeinen kann der Code angepasst werden wie folgt:

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

Und dann für das Hinzufügen von Absatz zu sequenziellen Seiten, bis alle Inhalte, die Sie im Grunde nur zwei Zeilen Code benötigen gelegt wird:

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

Die Lösung funktioniert wirklich gut. Danke vielmals ;-) –