У меня возникла проблема с печатью нескольких 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, но он требует отображения документа в форме, для меня это не важно, потому что мне нужна печать в «тихом» режиме, не открывая документы.
Любые идеи?
В этом примере Aset не используется. Похоже, что pdfbox 2.0.0 будет поддерживать передачу PrintRequestAttributeSet в метод 'silentPrint()'. – Aaron