Sto cercando di convertire un file txt da pdf e ci sono anche riuscito con questo codice utilizzando la ibreria Pdfbox, l'unica cosa che mi converte solo prima riga
https://nopaste.xyz/?9c2d34c5cfce376...Wl7YHayhEcvAc=
Come risolvo ?
Sto cercando di convertire un file txt da pdf e ci sono anche riuscito con questo codice utilizzando la ibreria Pdfbox, l'unica cosa che mi converte solo prima riga
https://nopaste.xyz/?9c2d34c5cfce376...Wl7YHayhEcvAc=
Come risolvo ?
ho notato che nella funzione readFileContent legge tutto, invece nel pdf mette solo la prima riga![]()
Ultima modifica di ilterribile; 07-06-2018 a 12:26
Innanzitutto ci sono cose superflue, del tipo: se hai un java.io.File, lo puoi passare direttamente al costruttore di FileReader, non c'è bisogno del getAbsolutePath().
A parte cose superflue, una questione è che il readLine() legge la riga ma SCARTA la sequenza di newline. Quindi un problema è che tu stai leggendo tante righe e le stai accodando una dietro l'altra in una stringa, senza alcun newline in mezzo. Se il file ha 2 righe "abc" e "def" tu ottieni una stringa "abcdef". Non va ovviamente fatto così.
E a parte questo, la PDFBox per quanto mi ricordo (usata poco e per progettini "personali") è abbastanza a "basso" livello. Quindi: a) anche ammesso di tenere i newline nella stringa, bisogna vedere COME si comporta la showText se riceve un testo con dei newline e b) anche ammesso che la showText mostri le righe, DUBITO altamente che faccia andare su una nuova pagina da solo.
Insomma, ti servono più "indagini" in particolare sulla PDFBox.![]()
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
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.
Ultima modifica di andbin; 07-06-2018 a 21:47
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
La iText è usabile sia sotto licenza "commerciale" (a pagamento) sia sotto licenza AGPL. Chiaramente se non si può/vuole rispettare la AGPL e non si vuole pagare ... concordo che sarebbe meglio non usarla.
Riguardo la PDFBox, ti ho dato credo sufficienti indicazioni e spunti per arrivare a generare quel testo in PDF. Se vuoi anche fare cose particolari del tipo: se una riga è troppo lunga viene spezzata su più righe, questo è anche fattibile ma è completamente a tuo carico.
Ma se hai bisogno di altro, chiedi.
Ultima modifica di andbin; 08-06-2018 a 09:23
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet