Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128

    [Java] In stampa ignora i \n

    dinuovo salve a tutti, stavolta il problema riguarda la stampa (sia che si tratti di stampante vera sia stampante pdf).

    Costruisco una stringa da stampare tramite uno StringBuilder, ho trovato in rete la classe che stampa, tutto sembra funzionare correttamente ma la stampa che dovrebbe essere su piu righe risulta invece su una riga sola troncata nella lunghezza orizzontale del foglio (idem per stampante pdf)

    della stessa stringa faccio una stampa video ed è ok su piu righe, la salvo dentro un file di log e a parte il problema di notepad con \n non riconosciuti ** con altri programmi (es Word) la visualizzazione è corretta.

    Quindi riguardo il problema in oggetto non ho trovato informazioni quindi mi rivolgo come sempre a voi ringraziandovi della pazienza e cortesia.

    ** problema noto in rete so che dovrei metterci \r\n ma mi pare di aver capito che compilando su altri sistemi operativi - Linux, Andreoid... - non sarebbe portabile, dico bene???? a me serve portabile al 100%

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    \n è un carattere particolare che significa "carriage return", ovvero "ritorno carrello".
    Alla stampante (ed in generale a tutto il monto Windows) questo non è sufficiente. Un "a capo" su Windows e su tutti i dispositivi di stampa si effettua con l'accoppiata "carriage return" + "line feed" (ovvero, "ritorno carrello" + "avanzamento linea"). L'avanzamento linea significa, appunto, vai alla riga successiva.

    L'accoppiata, quindi, è data dai caratteri \n\r (0x0d + 0x0a).

    Il discorso della portabilità in questo caso ha poco senso: se l'output devi farlo su file, non usare le sequenze di caratteri, ma usa l'apposita variabile di sistema per ottenere la stringa corretta come separatore di riga:

    codice:
    String lineSeparator = System.getProperty("line.separator");
    
    // Ovunque voglio andare a capo, aggiunto "lineSeparator" alla fine della riga
    Per quanto concerne la stampa, il problema non è la portabilità, ma la comunicazione con il driver della stampante.

    In ogni caso, la stampa verso un file è diversa dalla stampa a video, che è diversa dalla stampa su dispositivo (stampante).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Grazie dei tuoi consigli Lele,

    il mio problema è che la tringa che creo deve andare sia in un file di log (txt) sia in stampa su carta quindi la stringa deve essere compatibile e correttamente formattata in entrambi i casi.

    Inoltre vorrei che un domani il codice che creo sia cross os cioe che io possa compilarlo su ogni sistema operativo in cui vorro utilizzarlo che sia esso Win, Linux, Andreoid, MacOsx... in fondo non è questo il principale vantaggio di crearlo in Java??

    Mi scuso per la domanda che sto per farti ma la tua soluzione di usare lineSeparator soddisfa a tutti i requisiti che ti ho elencato?

    Grazie mille!!

  4. #4
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Ho verificato la tua soluzione con lineseparator ed è perfetta per il file di log, elimina il problema con notepad. Ottimo grazie!!

    Il problema sussite per la stampa, so che intendevi con stampe output, file o printer immaginavo che fossero cose diverse quindi ora non mi resta che risolvere il problema sull'ultima delle tre cioe stampante carta o pdf che sia.....

    idee??

    grazie a Lele e a tutti

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Kneos
    Grazie dei tuoi consigli Lele,

    il mio problema è che la tringa che creo deve andare sia in un file di log (txt) sia in stampa su carta quindi la stringa deve essere compatibile e correttamente formattata in entrambi i casi.
    Come già detto, non è "logicamente possibile" avere un dato finito che vada bene per tutto. Un file è diverso da una stampante. La stampante ha un suo protocollo, che va rispettato. Il file non ha un "protocollo", ma ciascun S.O. ha il suo modo di interpretare i separatori di linea.

    L'applicazione, a mio parere, va ri-pensata. Cioè, l'informazione va "formattata" nel modo corretto a seconda che l'output sia una stampante, piuttosto che un file, piuttosto che la console di output.

    Per quanto riguarda la scrittura su file, per essere sicuro di essere cross-platform la soluzione è quella da me indicata al punto precedente: ottenere il separatore di riga del sistema operativo su cui l'applicazione gira e usarlo. Il file prodotto sarà leggibile tranquillamente sul sistema operativo su sui è stato creato, ma non lo sarà altrettanto su un sistema diverso (e non ci si può fare nulla).

    Per la scrittura su stampante (che ancora non ho idea di come avvenga), devi semplicemente seguire il protocollo della stampante. Generalmente dovrebbe essere sufficiente l'accoppiata CRLF (Carriage Return Line Feed), ma non è detto.

    Inoltre vorrei che un domani il codice che creo sia cross os cioe che io possa compilarlo su ogni sistema operativo in cui vorro utilizzarlo che sia esso Win, Linux, Andreoid, MacOsx... in fondo non è questo il principale vantaggio di crearlo in Java??
    Veramente, cross-platform è più di quello che hai detto: significa che lo compili una sola volta dove ti pare e poi il compilato gira ovunque.
    Ma non puoi confondere "un programma" con i "dati prodotti" dal programma. E' come pretendere di avere un programma che produce una scritta comprensibile da chiunque: se la scritta è in inglese ci sono buone possibilità che MOLTI la capiscano... ma c'è anche gente che l'inglese non lo sa.

    Mi scuso per la domanda che sto per farti ma la tua soluzione di usare lineSeparator soddisfa a tutti i requisiti che ti ho elencato?
    No, va bene solo per i file di testo, e, mi ripeto: l'obiettivo di quel codice è fare in modo che il programma, ovunque giri, produca un file comprensibile dal sistema su cui gira.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Kneos
    Grazie dei tuoi consigli Lele,

    il mio problema è che la tringa che creo deve andare sia in un file di log (txt) sia in stampa su carta quindi la stringa deve essere compatibile e correttamente formattata in entrambi i casi.

    Inoltre vorrei che un domani il codice che creo sia cross os cioe che io possa compilarlo su ogni sistema operativo in cui vorro utilizzarlo che sia esso Win, Linux, Andreoid, MacOsx... in fondo non è questo il principale vantaggio di crearlo in Java??
    Certo, Java è "portabile" ma il concetto di "newline" varia da un sistema operativo all'altro. Su Windows è CR+LF, sui Linux/Unix è solo LF, su un'altra piattaforma potrebbe essere solo CR (mi pare fosse così sui vecchi vecchi Macintosh di una volta).

    Quindi quando vuoi scrivere un newline in Java devi scegliere se:
    a) scriverlo in un modo fisso e ben preciso, perché magari sai che il documento verrà letto su una certa piattaforma ben precisa.
    b) scriverlo "per la piattaforma corrente", cioè quella su cui sta girando in quel momento l'applicazione.

    Se a) puoi usare es. xyz.print("blabla\r\n") e hai fissato tu il newline.
    Se b) puoi usare la system property "line.separator" o il newLine() di BufferedWriter o i vari println() disponibili in diverse classi di I/O o ancora (da Java 5) lo specificatore %n sui printf/format disponibili in varie classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Grazie Lele e andbin:

    Per quanto riguarda la scrittura su file, per essere sicuro di essere cross-platform la soluzione è quella da me indicata al punto precedente: ottenere il separatore di riga del sistema operativo su cui l'applicazione gira e usarlo. Il file prodotto sarà leggibile tranquillamente sul sistema operativo su sui è stato creato, ma non lo sarà altrettanto su un sistema diverso (e non ci si può fare nulla).
    E chiarissimo il concetto e infatti il problema con il file l'ho risolto con la tua soluzione lineseparator che come dici tu è cross-platform quindi perfetto anche se faccio girare il tutto su piattaforma diversa da quella attuale (Win). Chiarissima anche la spiegazione dettagliata di andbin opto per la soluzione b), grazie a entrambi.

    Veramente, cross-platform è più di quello che hai detto: significa che lo compili una sola volta dove ti pare e poi il compilato gira ovunque.
    Si si certo scusa mi sono espresso malissimo....è come dici tu! chiedo venia

    Per la scrittura su stampante (che ancora non ho idea di come avvenga), devi semplicemente seguire il protocollo della stampante. Generalmente dovrebbe essere sufficiente l'accoppiata CRLF (Carriage Return Line Feed), ma non è detto.
    Questo è il vero problema ora, immagino che io debba modificare la mia stringa per la stampante ma come? Strano che sia un argomento mai trattato....io non ho trovato info
    In fondo la stampa è una delle cose piu comuni che un programma dovrebbe fare.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Kneos
    In fondo la stampa è una delle cose piu comuni che un programma dovrebbe fare.
    Già... sembrerebbe una cosa "semplice", invece è una tra le operazioni più complesse, per tutta una questione di "evoluzione" della tecnologia di stampa e per il fatto che Java, per sua natura, non dovrebbe sapere nulla dell'hardware su cui gira o che è a disposizione dell'hardware su cui gira.

    Esiste una API nativa di Java per la stampa, ma è un "progetto" che non si è mai sviluppato.

    In sostanza, chi deve sviluppare applicazioni che "stampano" di solito si appoggia a programmi di terze parti già fatti, che siano in grado di comunicare a livello nativo con la stampante (ricorda che Java è cross-platform: dell'hardware non sa praticamente nulla... e la stampante è puro hardware). La soluzione più "pratica" consiste nel produrre un PDF e mandare in stampa quello (banalmente, usando il metodo print() della classe Desktop).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Grazie Lele

    Stranezze di Java, cio che dici ha senso intendo il fatto che Java non calcola minimamente l'hardware su cui gira proprio per il fatto che sia cross-platform pero cavolo una cosa cosi stupida come la stampa avrebbero dovuto implementala

    Stavo leggendo questa guida, io non ci capisco molto

    http://www.javaportal.it/rw/19651/13...editorial.html

    magari puo fare al caso mio o forse no

    conosci l'argomento di cui si parla?

    La linko cosi se non fosse adatto al mio problema magari lo potrebbe essere per qualcun altro

  10. #10
    Utente di HTML.it L'avatar di Kneos
    Registrato dal
    Aug 2002
    Messaggi
    128
    Ah dimenticavo, la soluzione di creare pdf e poi stampare quello in modo facile come dici tu non sarebbe nemmeno male. Unica controindicazione secondo me potrebbe essere avere nelle scatole tutti i pdf creati.
    Non so forse c'è il modo di non salvare il pd creato o di cancellarlo subito dopo la stampa

    ho detto una cavolata?

    grazie di tutto

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.