Visualizzazione dei risultati da 1 a 6 su 6

Discussione: convertire un file di testo a file pdf

  1. #1

    convertire un file di testo a file pdf

    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 ?

  2. #2
    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

  3. #3
    Quote Originariamente inviata da ilterribile Visualizza il messaggio
    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
    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, www.andbin.net – Senior Java developer – SCJP 5 (91%) – SCWCD 5 (94%)
    Il mio blog sulla programmazione

  4. #4

    Aggiornamento

    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, www.andbin.net – Senior Java developer – SCJP 5 (91%) – SCWCD 5 (94%)
    Il mio blog sulla programmazione

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    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.
    lo so ma me l'hanno sconsiglia perchè a lavoro non voglio usare cose che si pagano.

  6. #6
    Quote Originariamente inviata da ilterribile Visualizza il messaggio
    lo so ma me l'hanno sconsiglia perchè a lavoro non voglio usare cose che si pagano.
    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, www.andbin.net – Senior Java developer – SCJP 5 (91%) – SCWCD 5 (94%)
    Il mio blog sulla programmazione

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.