Verwenden von iText7 Ich möchte eine ansonsten leere Spalte mit einem umrandeten Rechteck füllen, das mit einem Text versehen ist. Die Randmethoden scheinen in iText7 aus Rectangle verschwunden zu sein und die einzigen Beispiele, die ich finden kann, benutzen sie. Wenn Rectangle der richtige Ansatz ist, wie mache ich das? Wenn nicht, was ist der richtige Ansatz?Verwenden Sie iText7, wie fülle ich eine ansonsten leere Spalte mit einem Rechteck?
Antwort
Bitte nehmen Sie sich einen Blick auf Chapter 2 of the tutorial "iText 7: Building Blocks"
In diesem Tutorial erstellen wir ein Rectangle
Objekt und wir ziehen es zu einem PdfCanvas
Objekt:
Rectangle rectangle = new Rectangle(36, 650, 100, 100);
pdfCanvas.rectangle(rectangle);
pdfCanvas.stroke();
Wie bekomme ich ein Objekt PdfCanvas
?
Entweder Sie schaffen es von einem PdfPage
Objekt, das Sie selbst erstellt haben:
OutputStream fos = new FileOutputStream(dest);
PdfWriter writer = new PdfWriter(fos);
PdfDocument pdf = new PdfDocument(writer);
PdfPage page = pdf.addNewPage();
PdfCanvas pdfCanvas = new PdfCanvas(page);
Oder Sie erhalten eine vorhandene Seite aus dem PdfDocument
Objekt:
PdfCanvas canvas = new PdfCanvas(pdf, pdf.getNumberOfPages());
Sie die Linienbreite optimieren können, Strichmuster, Linienfarbe, ... mit verschiedenen Methoden im Objekt PdfCanvas
.
Es gibt andere Möglichkeiten, ein Rechteck zu zeichnen, aber in einer Ihrer vorherigen Fragen erwähnten Sie eine ColumnDocumentRenderer
. Wenn Ihre aktuelle Frage Teil desselben Kontextes ist, haben Sie bereits Rectangle
Objekte und wenn Sie eine ColumnDocumentRenderer
haben, haben Sie Zugriff auf ein PdfCanvas
Objekt. Sie können Ihre App problemlos automatisieren, um ein Rechteck um jede gerenderte Spalte zu zeichnen.
Natürlich: Da Sie meine vorherige Antwort nie akzeptiert haben, könnte meine Annahme falsch sein.
Zum Guten oder Schlechten dieser schien mein Ziel zu erreichen:
AreaBreak nextArea = new AreaBreak(AreaBreakType.NEXT_AREA);
document.add(nextArea);
float h = document.getRenderer().getCurrentArea().getBBox().getHeight();
float w = document.getRenderer().getCurrentArea().getBBox().getWidth();
Paragraph endB = new Paragraph(" ");
endB.setHeight(h);
endB.setWidth(w);
SolidBorder b = new SolidBorder(2);
endB.setBorder(b);
document.add(endB);
Das ist ziemlich komplex, um etwas so einfaches zu erreichen. Ich werde eine andere Antwort geben. –
Wenn das OP möchte, dass iText das Layout macht, kann seine Antwort mehr auf den Punkt kommen, da das Zeichnen direkt auf der Leinwand die iText-Layouts umgeht. Aber wie Sie bereits angemerkt haben, ist das OP ziemlich zurückhaltend zu beschreiben, was er will, also wissen wir nicht ... – mkl
Die meisten der High-Level-Objekte ('Paragraph',' Table', 'Cell', ...) haben eine 'setBorder()' Methode, die für genau denselben Zweck implementiert ist, aber das OP explizit aufgefordert, ein 'Rectangle' zu rendern. –
* aber das OP hat explizit gebeten, ein 'Rectangle' zu rendern. * ... und benutzt dann den Absatz selbst. Naja ...;) – mkl