Originariamente inviata da
andbin
Ho fatto alcune prove con la PDFBox (2.0.9 presa come artifact Maven).
Ho usato sostanzialmente le tue impostazioni per font, posizione ecc..
Questione 1)
Al showText() NON si può passare un CR o LF. Ho provato con una banale stringa fissa
"ABC\r\nDEF" ma il risultato è una eccezione:
Exception in thread "main" java.lang.IllegalArgumentException: U+000D ('controlCR') is not available in this font Courier encoding: WinAnsiEncoding
Il senso è chiaro: showText() cerca di "stamparlo" come carattere grafico. Che tra l'altro si evince che non c'è nel Courier predefinito. Insomma, showText() non tratta CR/LF in alcun modo speciale.
Nella documentazione javadoc di PDPageContentStream ho notato il metodo newLine(). La documentazione però è molto chiara:
Move to the start of the next line of text. Requires the leading (see setLeading(double)) to have been set.
Bisogna invocare prima setLeading(double) sul PDPageContentStream per dirgli quanto è il "leading", ovvero di quanto spostare verticalmente il baseline del testo per arrivare ad una riga successiva.
Il leading può variare in base a diversi fattori ma in linea generale (e se non ci sono scenari particolari) si può usare un valore da 1x a 1,5x la dimensione del font.
Se hai impostato un Courier 14, puoi impostare un leading di 14 o 15 (secondo quanto ti aggrada visivamente).
codice:
//....
contentStream.setLeading(15);
contentStream.showText("ABC");
contentStream.newLine();
contentStream.showText("DEF");
contentStream.newLine();
//....
Questione 2)
Andando avanti a forza di showText() e newLine(), NON viene creata in automatico una nuova pagina! Quindi devi essere tu a creare una nuova pagina quando necessario. Questo richiede ovviamente un po' di "logica".
Per stabilire quante righe ci stanno nella pagina, lo puoi determinare un po' "empiricamente". Fai una stampa di prova con un po' di righe e vedi quante righe ti vanno bene in base al punto di inizio e al margine che vuoi dare. Poi usi quel numero di righe nel codice. Stampi X righe, poi alla X+1 crei una nuova pagina e riparti.
P.S. Come ho già detto, la PDFBox è abbastanza a "basso" livello. Se vuoi qualcosa di più maneggiabile c'è la ben nota iText PDF che è ben più ad alto livello. Ma non ho codice sottomano da mostrarti.