2013-04-30 2 views
10

У меня проблема при попытке распечатать файл PDF с помощью Java. Вот мой код:Печать файла PDF с использованием PrinterJob в 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() 


Я использую document.silentPrint(job); и job.print(printRequestAttributeSet); - он отлично работает. Если я использую document.silentPrint(job); - Я не могу установить PrintRequestAttributeSet.

Может ли кто-нибудь сказать мне, как установить PrintRequestAttributeSet?

ответ

0

Попробуйте этот код:

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(); 

Вы также можете следить за these steps

+0

Как он может печатать PDF без DocFlavor? – whizzzkey

11

Это работает для меня, чтобы напечатать PDF с простым JRE:

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

Это работает только на Linux, верно? Я считаю, что в Windows нет рендеринга PDF в Java, правильно? – Daniel

+1

@Mirko Seifert Этот код не работает, мой принтер печатает только нечитаемые символы вместо моего PDF-документа. – whizzzkey

+2

Код работает только с принтерами, которые могут интерпретировать PDF самостоятельно. Я нашел несколько принтеров, которые это делают (например, некоторые модели HP LaserJet), но я также испытал, что некоторые принтеры печатают исходное содержимое PDF-файла (в виде текста). В таком случае вам нужно будет преобразовать PDF в изображение (например, используя Ghostview). –

0

выгружаемой реализация PDDocument является устаревшим , вместо этого используйте класс адаптера PDPageable и попробуйте setPrintable вместо setPageable:

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

привет новый пользователь! лучший пример, который показывает, как установить PageRanges с вашим примером, будет приятным, а также ссылку на javadoc apis и версию –

1

Следующая работал для меня, чтобы напечатать несколько документов PDF с диалогом печати:

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

Мой принтер не обладает встроенной поддержкой печати PDF.

Я использовал библиотеку с открытым исходным кодом Apache PDFBox https://pdfbox.apache.org для печати PDF. Сам принтер по-прежнему обрабатывается PrinterJob 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

, лучше закрыть PDDocument, поэтому вам понадобится попытка catch и, наконец, но в целом хорошо! –

Смежные вопросы