ITextRenderer: Passen Sie die Seitenhöhe an den Inhalt an

Ich benutze ITextRenderer, um ein PDF aus HTML zu generieren, und ich muss einen Kassenbeleg erstellen. Dieser Beleg hat eine dynamische Breite und natürlich einen dynamischen Inhalt. Das heißt, die Höhe des Inhalts wird immer unterschiedlich sein, und im Moment habe ich Mühe, eine Möglichkeit zu finden, die Höhe der PDF-Seite an den Inhalt anzupassen. Wenn es zu groß ist, hat die Quittung am Ende einen langen weißen Bereich und wenn es zu kurz ist, wird das PDF paginiert und ich brauche es nur auf einer Seite.

Ich benutze@page {size: Wpx Hpx;} Die Seitengröße festzulegen, aber es ist fast unmöglich (wäre sehr schmerzhaft), die Höhe des Inhalts basierend auf Breite und Daten zu berechnen.

Dies ist der Code, der das PDF generiert:

ITextRenderer renderer = new ITextRenderer();

byte[] bytes = htmlDocumentString.toString().getBytes("UTF-8");
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource is = new InputSource(bais);
Document doc = builder.parse(is);

renderer.setDocument(doc, null);

renderer.layout();
renderer.createPDF(outputStream);
outputStream.flush();
outputStream.close();

Ich habe es auch versuchtrenderer.getSharedContext().setPrint(false);, aber das wirft eine NPE.

Ebenfalls@page {-fs-page-sequence: "none";} ohne glück.

-------------- "Lösung" ----------------

Die Lösung, die ich gefunden habe, ist nicht annähernd perfekt, funktioniert aber!

@page {
    size: Wpx 1px;
}
* { page-break-inside: always; }

Dadurch werden 1px-Seiten für den gesamten Inhalt generiert. Dann muss ich nur den Drucker anweisen, alle Seiten mit zu drucken0px margin zwischen den Seiten.

Warum ist diese Lösung nicht perfekt? Die Dateigröße reicht von 1 oder 2 KB bis 200 KB. Nicht sehr gut, wenn Sie über 3G streamen.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage