2017-01-03 3 views
0

Я нашел пример печати Java here.Как распечатать PDF-файл в Java с диалогом печати

К сожалению, пытается выполнить я получил исключение

Exception in thread "main" sun.print.PrintJobFlavorException: invalid flavor 
at sun.print.Win32PrintJob.print(Unknown Source) 
at application.UsePrintingServiceInJava.main(UsePrintingServiceInJava.java:55) 

Я также пытался напечатать PNG, используя DocFlavor.INPUT_STREAM.PNG аромат вместо PDF, это работает отлично. Может возникнуть проблема с самим принтером или мне нужно изменить код?

Кроме того, если у вас есть лучшее решение для печати PDF-файла на Java, дайте мне знать.

+0

Отметьте это [ответ] (http://stackoverflow.com/a/18962278/34088) – Gatusko

+0

@ Gatusko - Решение показано в [ответе] (http://stackoverflow.com/questions/16293859/print- a-pdf-file-using-printerjob-in-java/18962278 # 18962278) кажется правильным, он отправляет печатную ссылку на принтер (как я могу видеть в окне «printjob» Windows). Проблема заключается в том, что через некоторое время печатное задание исчезает без эффекта: документ не печатается. – Prodoxon

ответ

1

Наконец, Apache PDFBox решил мою проблему. Я загрузил pdfbox-app-2.0.4.jar и добавил его в путь сборки. Теперь выполнив следующий код печатает нужный файл в формате .pdf:

public class Main { 

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

     String filename = "C:/Users/Prodoxon/Documents/test.pdf"; 
     PDDocument document = PDDocument.load(new File (filename)); 

     //takes standard printer defined by OS 
     PrintService myPrintService = PrintServiceLookup.lookupDefaultPrintService(); 

     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; 
    } 

} 

Даже если он не показывает никакого диалога печати, я думаю, что это хорошее решение, если вы просто хотите, чтобы распечатать файл.

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