2012-03-16 2 views
1

У меня возникла проблема с печатью нескольких html-документов с использованием java. Мне нужно приложение, которое показывает ONE диалог печати для всех файлов для печати (количество файлов может быть большим). Во-первый я попытался сделать это, используя стандартный метод Java:Массовая печать в java

if (Desktop.isDesktopSupported()){ 
     Desktop desktop = Desktop.getDesktop(); 
     if (desktop.isSupported(Desktop.Action.PRINT)) 
     { 
      try { 
       File html1 = new File("c://file1.html"); 
       File html2 = new File("c://file2.html"); 
       desktop.print(html1); 
       desktop.print(html2); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
} 

Но я видел один диалог для каждой печати файла, он меня не устраивает. Затем я попытался использовать API Java печати, но оказалось, что мой принтер не поддерживает DocFlavor из HTML-файлов, мой список поддерживаемых DocFlavor выглядеть следующим образом:

image/gif; class="[B" 
image/gif; class="java.io.InputStream" 
image/gif; class="java.net.URL" 
image/jpeg; class="[B" 
image/jpeg; class="java.io.InputStream" 
image/jpeg; class="java.net.URL" 
image/png; class="[B" 
image/png; class="java.io.InputStream" 
image/png; class="java.net.URL" 
application/x-java-jvm-local-objectref; class="java.awt.print.Pageable" 
application/x-java-jvm-local-objectref; class="java.awt.print.Printable" 
application/octet-stream; class="[B" 
application/octet-stream; class="java.net.URL" 
application/octet-stream; class="java.io.InputStream" 

Затем я попытался напечатать HTML файл как изображения (PNG, который я нарисовал в красках :)), мой код:

PrintRequestAttributeSet pras = 
        new HashPrintRequestAttributeSet(); 
      DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG; 
      PrintRequestAttributeSet aset = 
        new HashPrintRequestAttributeSet(); 
      aset.add(MediaSizeName.ISO_A4); 
      aset.add(new Copies(1)); 
      aset.add(Sides.ONE_SIDED); 
      aset.add(Finishings.STAPLE); 

      PrintService printService[] = 
        PrintServiceLookup.lookupPrintServices(flavor, pras); 
      PrintService defaultService = 
        PrintServiceLookup.lookupDefaultPrintService(); 
      PrintService service = ServiceUI.printDialog(null, 200, 200, 
        printService, defaultService, flavor, pras); 
      if (service != null) { 
       try { 
        FileInputStream fis = new FileInputStream("c://test//test.png"); 
        DocAttributeSet das = new HashDocAttributeSet(); 
        Doc doc1 = new SimpleDoc(fis, flavor, das); 

        FileInputStream fis2 = new FileInputStream("c://test//test2.png"); 
        DocAttributeSet das2 = new HashDocAttributeSet(); 
        Doc doc2 = new SimpleDoc(fis2, flavor, das2); 

        DocPrintJob job1 = service.createPrintJob(); 
        DocPrintJob job2 = service.createPrintJob(); 

        try { 
         job1.print(doc1, pras); 
         job2.print(doc2, pras); 
        } catch (PrintException e) { 
         e.printStackTrace(); 
        } 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
      } 

Он отлично работает, но конвертация от HTML к изображению не простая задача. Я пытался использовать компоненты swing, реализовал интерфейс Printable и использовал библиотеку Cobra, но он требует отображения документа в форме, для меня это не важно, потому что мне нужна печать в «тихом» режиме, не открывая документы.

Любые идеи?

ответ

0

В конце концов, я выбрал этот путь:

  1. Преобразование HTML файлы в формате PDF.

  2. Печать файлов в формате pdf с использованием PDFBox в режиме бесшумной печати.


List<PDDocument> docs = new ArrayList<PDDocument>(); 
try { 
    docs.add(PDDocument.load("c://test/test.pdf")); 
    docs.add(PDDocument.load("c://test/test2.pdf")); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

try { 
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
    PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
    aset.add(MediaSizeName.ISO_A4); 
    aset.add(new Copies(1)); 
    aset.add(Sides.ONE_SIDED); 
    aset.add(Finishings.STAPLE); 

    PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras); 
    PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); 
    PrintService service = ServiceUI.printDialog(null, 200, 200, 
      printService, defaultService, flavor, pras); 

    if (service != null && !docs.isEmpty()) { 
     for (PDDocument doc : docs) { 
      PrinterJob printJob = PrinterJob.getPrinterJob(); 
      printJob.setPrintService(service); 
      doc.silentPrint(printJob); 
     } 
    } 
} catch (PrinterException e) { 
    e.printStackTrace(); 
} finally { 
    for (PDDocument doc : docs) { 
     if (doc != null) { 
      try { 
       doc.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

В этом примере Aset не используется. Похоже, что pdfbox 2.0.0 будет поддерживать передачу PrintRequestAttributeSet в метод 'silentPrint()'. – Aaron