Массовая печать в Яве - PullRequest
1 голос
/ 16 марта 2012

У меня проблема с печатью нескольких HTML-документов с использованием Java.Мне нужно приложение, которое показывает ONE диалоговое окно печати для всех печатаемых файлов (количество файлов может быть большим).Сначала я попытался сделать это, используя стандартный метод 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, который я нарисовал в Paint :)), мой код:

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, но это требует отображения документа на форме, для меня это не обязательно, потому что мне нужна печать в «тихом» режиме, без открытия документов.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2012

В конце концов, я выбираю этот способ:

  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 голосов
/ 16 марта 2012

Здесь вы можете найти полный код для доступа к принтеру через код Java.

обеспечивает такие функции, как

1. cancel print job,
2. display print dialog,
3. print file etc..

http://anonsvn.icesoft.org//repo/icepdf/tags/icepdf-3.1.0/icepdf/viewer/src/org/icepdf/ri/common/PrintHelper.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...