È 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:
- Inizialmente, ho pensato che il
DocFlavor
non è supportato. Quindi ho elencato sul numeroDocFlavor
supportato di quella stampante e uno di questi era application/octet-stream, che èDocFlavor.INPUT_STREAM.AUTOSENSE
. Quindi l'aroma è supportato dalla stampante. - Quindi, ho aggiunto
PrintJobListener
per verificare se il lavoro di stampa è non riuscito. Quando ho aggiunto quell'ascoltatore al printJob, stampaNo_More_Events
eDATA_TRANSFER_COMPLETE
, che avrebbe dovuto stampareJOB_COMPLETE
, se il lavoro è riuscito. - Il passaggio finale consiste nell'eseguire il debug del codice Java. Quando ho eseguito la riga
job.print()
, passa al metodoWin32PrintJob.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 valoremDestination
, 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.
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
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
@maraca: posso stamparlo sulla stampante Xerox, ma non con la Fuji. – Anand