2015-07-16 21 views
10

È necessario stampare i file PDF in due modi diversi: una pagina Web in cui l'utente visualizza l'anteprima di stampa, sceglie la stampante e la stampa. Il secondo modo è quello di automatizzare la stampa, semplicemente facendo clic su un pulsante, il pdf deve essere inviato alla stampante.La stampa automatica non funziona in Java

Il primo modo di stampare tramite la pagina Web funziona correttamente, ma non la seconda. La stampante predefinita viene recuperata con successo per la stampa automatica, ma non viene stampata e non ricevo alcun errore. Segue la mia analisi:

  1. Inizialmente, ho pensato che il DocFlavor non è supportato. Quindi ho elencato sul numero DocFlavor supportato di quella stampante e uno di questi era application/octet-stream, che è DocFlavor.INPUT_STREAM.AUTOSENSE. Quindi l'aroma è supportato dalla stampante.
  2. Quindi, ho aggiunto PrintJobListener per verificare se il lavoro di stampa è non riuscito. Quando ho aggiunto quell'ascoltatore al printJob, stampa No_More_Events e DATA_TRANSFER_COMPLETE, che avrebbe dovuto stampare JOB_COMPLETE, se il lavoro è riuscito.
  3. Il passaggio finale consiste nell'eseguire il debug del codice Java. Quando ho eseguito la riga job.print(), passa al metodo Win32PrintJob.print(). Ho fatto F6 a eseguire ogni riga per vedere cosa sta facendo. L'ho confrontato con il codice in GrepCode, in quanto il codice sorgente non è stato caricato in eclissi. E ' stava andando bene e non ho potuto vedere alcun errore. L'unico posto in cui è stato eseguito lo è questo blocco in cui viene verificato il valore mDestination , poiché non l'ho fornito, non è passato.

prega di consultare il codice qui sotto:

if (mDestination != null) { // if destination attribute is set 
    try { 
     FileOutputStream fos = new FileOutputStream(mDestination); 
     byte [] buffer = new byte[1024]; 
     int cread; 

     while ((cread = instream.read(buffer, 0, buffer.length)) >= 0) { 
      fos.write(buffer, 0, cread); 
     } 
     fos.flush(); 
     fos.close(); 
    } catch (FileNotFoundException fnfe) { 
     notifyEvent(PrintJobEvent.JOB_FAILED); 
     throw new PrintException(fnfe.toString()); 
    } catch (IOException ioe) { 
     notifyEvent(PrintJobEvent.JOB_FAILED); 
     throw new PrintException(ioe.toString()); 
    } 
    notifyEvent(PrintJobEvent.DATA_TRANSFER_COMPLETE); 
    notifyEvent(PrintJobEvent.JOB_COMPLETE); 
    service.wakeNotifier(); 
    return; 
} 

Questo è l'unico luogo in cui si dice JOB_COMPLETE. Penso che questo blocco è quello di scrivere in un file, che non è necessario per me.

Penso che la stampa effettiva avvenga nella riga seguente nello stesso metodo Win32PrintJob.print().

private native boolean More ...printRawData(byte[] data, int count); 

Ma questo è il metodo nativo e quindi non so cosa sta succedendo all'interno di questo.

Per favore fatemi sapere perché non sono in grado di stampare il PDF.

EDIT:

allegato il codice per stampare il file:

PrintService pss = PrintServiceLookup.lookupDefaultPrintService(); 
DocPrintJob job = pss.createPrintJob(); 
DocAttributeSet das = new HashDocAttributeSet(); 
Doc document; 
try { 
    document = new SimpleDoc(new FileInputStream(new File(fileName)), DocFlavor.INPUT_STREAM.AUTOSENSE, das); 

    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
    job.addPrintJobListener(new PrintJobWatcher()); 
    job.print(document, pras); 
} 

NOTA: ho provato diversi gusti come PDF, PCL. Niente funziona e ricevo errore di runtime che non è supportato.

+0

Potresti aggiornare la domanda con il codice che scrivi per stampare il file? Come hai detto sopra, il codice è usato per scrivere su file. – Parth

+0

Penso che il problema sia che devi ** render ** il pdf prima, non puoi stamparlo direttamente, circa 10 anni fa l'ho fatto con la funzione acrobat cli silent ... scommetti che ci sono alternative ora. – maraca

+0

@maraca: posso stamparlo sulla stampante Xerox, ma non con la Fuji. – Anand

risposta

0

Hai provato JPadel stampare i file PDF:

Estratto dal Sample codes

final PdfBook pdfBook = new PdfBook(pdfDecoder, printJob.getPrintService(), attributes); 
pdfBook.setChooseSourceByPdfPageSize(false); 

final SimpleDoc doc = new SimpleDoc(pdfBook, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null); 

// used to track print activity 
printJob.addPrintJobListener(new PDFPrintJobListener()); 

try { 
    printJob.print(doc, attributes); 
} 
catch (final Exception e) { 
    LogWriter.writeLog("Exception " + e + " printing"); 
    // <end-demo> 
} 

Oltre a questo è possibile fornire il nome della stampante e aggiungere un listner PDFPrintJobListener pure.

+0

Posso stampare il PDF senza problemi con la stampante Xerox. Ma di fronte a problemi con altre stampanti che sono seduti al cliente. – Anand

+0

@Anand ... intendi dire che la stampa automatica funziona con la stampante Xerox ma non con il tipo Fuji. – Garry

+0

Sì. questo tipo di stampante Fuji non stampa automaticamente. – Anand

0

Recentemente ho avuto lo stesso compito e la risposta non è così semplice per la seconda opzione di stampa (ho anche provato JPedal, Samba e altre soluzioni ..). Il modo più semplice per stampare (che alla fine ho provato) era semplicemente posizionare il file nella coda della stampante, a.k.a la posizione di root. Es: MY_SERVER \ PRINTER_NAME \

Il problema ora diventa un ambiente/O.S uno, e non uno Java. Attraverso un'app installata su un computer Windows, è possibile accedere a tale cartella, copiare il file che si desidera stampare e voilà. Inoltre, usando i metodi che usi, puoi anche dare al lavoro un nome, numero di copie, ecc.

Tuttavia, una volta che l'app è installata sul server, è un gioco di palla completamente diverso, specialmente se tu stanno lavorando con i server Linux.

Prima di tutto dovresti tradurre gli indirizzi di Windows in quelli di Linux per provare anche a copiare il file/stamparlo.

In secondo luogo, e questa è la chiave, è molto raro/difficile per una stampante "solo accettare un file" per la stampa, se non fa parte di un flusso di dati più complicato/proprietario. Ad esempio, è possibile trovare la "lingua di comunicazione" delle stampanti con il server o anche con la macchina quando si esegue "Ctrl + P". Questo sarà per lo più file .xml o qualche altro formato.

Ma/e al fine di "calcolare" questo formato, è necessario sviluppare (in definitiva in Java) un'applet che chiamerebbe quella stampante.

Si potrebbe anche provare a installare Cups4j su quel server o configurare un server di stampa (presupponendo dove si lavora non è a posto), ma ciò causerà problemi quando le stampanti cambieranno, verranno aggiunte al rete, ecc.

In definitiva si dovrebbe attenersi all'approccio "Ctrl + P", creare un piccolo script JS che chiama "CTRL + P" nel browser o iniziare a ricreare la ruota, che non è un male cosa (dal momento che ci sono persone che scelgono questo approccio anche ... ma non ho trovato un esempio da nessuna parte), ma mi ci vorrà probabilmente più tempo di quello che hai.

Spero di aver contribuito in qualche modo (mi dispiace per il post lungo ... ma è un argomento che ho cercato e lavorato per un buon periodo di tempo).