Visualizzazione dei risultati da 1 a 6 su 6

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    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, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  2. #2
    Utente bannato
    Registrato dal
    Nov 2015
    Messaggi
    60
    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.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.