2013-04-30 17 views
10

Ho un problema quando provo a stampare un file PDF usando Java. Ecco il mio codice:Stampa di un file PDF utilizzando PrinterJob in Java

PdfReader readFtp = new PdfReader(); // This class is used for reading a PDF file 
PDDocument document = readFtp.readFTPFile(documentID); 

printRequestAttributeSet.add(new PageRanges(1, 10)); 

job.setPageable(document); 
job.print(printRequestAttributeSet); // calling for print 

document.close() 


Io uso document.silentPrint(job); e job.print(printRequestAttributeSet); - funziona benissimo. Se utilizzo document.silentPrint(job); - Non riesco a impostare lo PrintRequestAttributeSet.

Qualcuno può dirmi come impostare PrintRequestAttributeSet?

risposta

0

Prova di questo codice:

FileInputStream fis = new FileInputStream(“C:/mypdf.pdf”); 
Doc pdfDoc = new SimpleDoc(fis, null, null); 
DocPrintJob printJob = printService.createPrintJob(); 
printJob.print(pdfDoc, new HashPrintRequestAttributeSet()); 
fis.close(); 

Potete anche seguire these steps

+0

Come può stampare PDF senza DocFlavor? – whizzzkey

11

Questo ha funzionato per me per stampare un file PDF con una JRE semplice:

public static void main(String[] args) throws PrintException, IOException { 
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PAGEABLE; 
    PrintRequestAttributeSet patts = new HashPrintRequestAttributeSet(); 
    patts.add(Sides.DUPLEX); 
    PrintService[] ps = PrintServiceLookup.lookupPrintServices(flavor, patts); 
    if (ps.length == 0) { 
     throw new IllegalStateException("No Printer found"); 
    } 
    System.out.println("Available printers: " + Arrays.asList(ps)); 

    PrintService myService = null; 
    for (PrintService printService : ps) { 
     if (printService.getName().equals("Your printer name")) { 
      myService = printService; 
      break; 
     } 
    } 

    if (myService == null) { 
     throw new IllegalStateException("Printer not found"); 
    } 

    FileInputStream fis = new FileInputStream("C:/Users/John Doe/Desktop/SamplePDF.pdf"); 
    Doc pdfDoc = new SimpleDoc(fis, DocFlavor.INPUT_STREAM.AUTOSENSE, null); 
    DocPrintJob printJob = myService.createPrintJob(); 
    printJob.print(pdfDoc, new HashPrintRequestAttributeSet()); 
    fis.close();   
} 
+0

Questo funziona solo su Linux, giusto? Credo che su Windows non ci sia un renderer PDF in Java, corretto? – Daniel

+1

@Mirko Seifert Questo codice non funziona, la mia stampante stampa solo caratteri illeggibili invece il mio documento PDF. – whizzzkey

+2

Il codice funziona solo con stampanti che sono in grado di interpretare il PDF da soli. Ho trovato alcune stampanti che lo fanno (ad esempio alcuni modelli HP LaserJet), ma ho anche notato che alcune stampanti stampano il contenuto non elaborato del file PDF (come testo). In tal caso dovrai convertire il PDF in un'immagine (ad es. Usando Ghostview). –

0

paginabile attuazione PDDocument è deprecato , utilizzare invece la classe dell'adattatore PDPageable e provare setPrintable anziché setPageable:

job.setPrintable(new PDPageable(document)); 
+0

ciao nuovo utente! un esempio migliore che mostra come impostare le PageRanges con il tuo esempio sarebbe bello così come un riferimento agli apis di javadoc e alla versione –

1

Di seguito ha lavorato per me per stampare più documenti PDF con una finestra di stampa:

public void printPDF() 
{ 
    PrinterJob printerJob = PrinterJob.getPrinterJob(); 

    PrintService printService; 
    if(printerJob.printDialog()) 
    { 
     printService = printerJob.getPrintService(); 
    } 
    DocFlavor docType = DocFlavor.INPUT_STREAM.AUTOSENSE; 

    for (//fetch documents to be printed) 
    { 
     DocPrintJob printJob = printService.createPrintJob(); 
     final byte[] byteStream = // fetch content in byte array; 
      Doc documentToBePrinted = new SimpleDoc(new ByteArrayInputStream(byteStream), docType, null); 
     printJob.print(documentToBePrinted, null); 
    } 
} 
13

La mia stampante non supporta la stampa PDF nativo.

Ho usato la libreria open source Apache PDFBox https://pdfbox.apache.org per stampare il PDF. La stampa stessa è ancora gestita da PrinterJob di Java.

import java.awt.print.PrinterJob; 
import java.io.File; 

import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 

import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.printing.PDFPageable; 

public class PrintingExample { 

    public static void main(String args[]) throws Exception { 

     PDDocument document = PDDocument.load(new File("C:/temp/example.pdf")); 

     PrintService myPrintService = findPrintService("My Windows printer Name"); 

     PrinterJob job = PrinterJob.getPrinterJob(); 
     job.setPageable(new PDFPageable(document)); 
     job.setPrintService(myPrintService); 
     job.print(); 

    }  

    private static PrintService findPrintService(String printerName) { 
     PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null); 
     for (PrintService printService : printServices) { 
      if (printService.getName().trim().equals(printerName)) { 
       return printService; 
      } 
     } 
     return null; 
    } 
} 
+1

è meglio chiudere il PDDocument, quindi avresti bisogno di un try catch e infine, ma nel complesso ok! –

Problemi correlati