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%)

  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%)

  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%)

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.