2009-09-10 14 views
13

Stiamo esaminando la stampa silenziosa di documenti PDF da Java. La stampa verrà invocata dal desktop e non tramite un browser, quindi non possiamo usare JavaScript. PDF Renderer è una soluzione operativa ma la loro qualità di rendering non è accettabile. iText non sembra essere collegabile con il servizio di stampa Java. Ci sono alcune librerie Java commerciali, jPDFPrint di Qoppa, JPedal e ICEpdf che non abbiamo ancora provato.Stampa silenziosa di PDF da Java

Qualcuno ha esperienza con la stampa silenziosa PDF da Java?

+0

Qual è il tuo problema con PDFRender di Sun? Ho alcune stampe qui e sembrano pulite e belle. Hai elementi o immagini speciali che causano problemi? – Stroboskop

risposta

11

Apache PDFBox. È attualmente in fase di incubazione, ma la funzionalità di stampa in PDF è stata utilizzata prima. Internamente, utilizza i servizi di stampa Java per creare un lavoro di stampa e supporta anche lo silent printing.

Si noti che richiede anche Fontbox e la versione corrente (prossima versione 0.8.0) ha incluso il fallback grazioso per i documenti con i font Type 0. I font Type 1 sono stampati correttamente; tuttavia, in 0.7.3, i tentativi di stampare documenti con font Type 0 provocheranno un'eccezione.

+1

Ho provato questo, ma il pdf ha stampato almeno principalmente in bianco (a volte pagine completamente vuote, a volte solo una sezione). – Stephen

+1

Bene, la riga di comando (PrintPDF) sembra funzionare e stampare tutto (anche se crea un pasticcio della mia immagine PNG trasparente) – Stephen

+0

Questo è un po 'strano, considerando che la stampa da riga di comando sembra aver funzionato (tranne l'immagine PNG) . Vedrò come sono rappresentati i PNG nel modello PDFBox. A proposito, stai provando questo con 0.7.3 o una versione successiva? –

0

Dai un'occhiata a www.pdflib.com. È commerciale ma PDFlib Lite è disponibile gratuitamente per progetti open source. Ha attacchi per java.

2

Forse sto fraintendendo, ma perché non utilizzare direttamente l'API del servizio di stampa? I seguenti lavori per me (presuppone che il documento PDF come un array di byte):

DocFlavor flavor = DocFlavor.BYTE_ARRAY.PDF; 
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null); 
if (services.length > 0) 
{ 
    DocPrintJob printJob = services[0].createPrintJob(); 
    Doc document = new SimpleDoc(pdfBytes, flavor, null) 
    printJob.print(document, null); 
} 
else 
{ 
    System.out.println("No PDF printer available."); 
} 
+6

funziona solo se la tua stampante supporta nativamente il PDF - pochi fanno –

+0

Tutti quelli che ho ho provato sotto Linux sembra funzionare. Sotto Windows ho dovuto aggiornare i driver –

+0

Sto provando questo in Windows e in Linux.Qui è la versione aggiornata ma comunque non posso farlo funzionare, come come posso caricare il file in c: \ print.pdf e push to silent print ?. Qualsiasi suggerimento plz? eg: https://gist.github.com/1093987 – YumYumYum

0

Ho esperienza con la realizzazione di Acrobat (Reader o Full), ma è tutt'altro che silenzioso (è incustodito, però - dipende solo da quanto "silenzioso" è il requisito silenzioso). Se c'è interesse, posso spararti il ​​codice nativo che effettua le chiamate DDE richieste.

+0

Potrebbe per favore mostrare il codice? – asalamon74

+0

C'è un interruttore a linea di comando per attivare un'operazione di stampa dal lettore Acrobat, ma il lettore rimane aperto ... Una soluzione è utilizzare un'utilità esterna, vedere http://www.rgagnon.com/javadetails/java-print-a-pdf.html. Ovviamente, questo è solo per Windows. ! – RealHowTo

+0

e che l'interruttore della riga di comando non ha mai w orked for me (nelle versioni moderne di Acrobat e/o Reader - ha funzionato nelle versioni precedenti) ... –

0

iText è inteso per la creazione di file PDF (per un post che ho visto dall'autore), e quindi probabilmente non è quello che vuoi.

Ho usato Qoppa's jPDFPrint con successo proprio per questo scopo, ma non è economico. Se te lo puoi permettere, è la soluzione più robusta che ho trovato finora. Sono anche rimasto molto colpito dal livello di supporto; hanno persino generato un codice di esempio personalizzato per me.

Ho provato PDFBox, ma ho scoperto che non supporta il ridimensionamento della pagina "Riduci all'area stampabile" che ottieni con Acrobat. Non tutti saranno interessati a questa funzione, ma è essenziale per me.

2

questo funziona per me:

public void print() { 
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null); 
    FileInputStream psStream = null; 
    try { 
     psStream = new FileInputStream("c:\\test.pdf"); 
     } catch (FileNotFoundException ffne) { 
      ffne.printStackTrace(); 
     } 
    if (psStream == null) { 
     return; 
    }  
    if (services.length > 0) 
    { 
     PrintService myService = null; 
     for(PrintService service : services) { 
      System.out.println(service.getName()); 
      if(service.getName().contains("my printer")) { 
       myService = service; 
       break; 
      } 
     } 
     DocPrintJob printJob = myService.createPrintJob(); 
     Doc document = new SimpleDoc(psStream, flavor, null); 
     try { 
      printJob.print(document, null); 
     } catch (PrintException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    else 
    { 
     System.out.println("No PDF printer available."); 
    }  
}