Тихая печать PDF изнутри Java

Мы изучаем тихую печать PDF-документов из Java. Печать будет вызываться с рабочего стола, а не через браузер, поэтому мы не можем использовать JavaScript. PDF Renderer - это операционное решение, но качество их рендеринга неприемлемо. iText, похоже, не подключается к службе печати Java. Есть некоторые коммерческие библиотеки Java, jPDFPrint от Qoppa, JPedal и ICEpdf, которые мы еще не пробовали.

Есть ли у кого-нибудь опыт работы с автоматической печатью в формате PDF с помощью Java?

Ответы

Ответ 1

Apache PDFBox. В настоящее время он инкубируется, но перед этим появилась функция печати PDF. Внутри он использует службы печати Java для создания задания на печать, а также поддерживает тихую печать.

Обратите внимание, что для него также нужен Fontbox, а текущий (предстоящий выпуск 0.8.0) включает в себя грациозную откат для документов с шрифтами Type 0. Шрифты Type 1 напечатаны правильно; однако в 0.7.3 попытки печати документов с шрифтами Type 0 приведут к тому, что будет выведено исключение.

Ответ 2

Возможно, я не понимаю, но почему бы просто не использовать API печати? Для меня работает следующее (предполагается, что у вас есть документ PDF в виде байтового массива):

DocFlavor flavor = DocFlavor.BYTE_ARRAY.PDF;
PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
if (services.length > 0)
{
    DocPrintJob printJob = services[0].createPrintJob();
    Doc document = new SimpleDoc(pdfBytes, flavor, null)
    printJob.print(document, null);
}
else
{
    System.out.println("No PDF printer available.");
}

Ответ 3

Это работает для меня:

public void print() {
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);
    FileInputStream psStream = null;  
    try {  
        psStream = new FileInputStream("c:\\test.pdf");  
        } catch (FileNotFoundException ffne) {  
          ffne.printStackTrace();  
        }  
    if (psStream == null) {  
        return;  
    }       
    if (services.length > 0)
    {
        PrintService myService = null;
        for(PrintService service : services) {
            System.out.println(service.getName());
            if(service.getName().contains("my printer")) {
                myService = service;
                break;
            }
        }
        DocPrintJob printJob = myService.createPrintJob();
        Doc document = new SimpleDoc(psStream, flavor, null);
        try {
            printJob.print(document, null);
        } catch (PrintException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    else
    {
        System.out.println("No PDF printer available.");
    }       
}

Ответ 4

Посмотрите на www.pdflib.com. Его коммерческий, но PDFlib Lite доступен бесплатно для проектов с открытым исходным кодом. Он имеет привязки для java.

Ответ 5

Существует пример использования JPedal в http://www.jpedal.org/support_egSP.php

Вам понадобится коммерческая версия IcePdf, если вы хотите получить полную поддержку шрифтов.

Ответ 6

У меня есть опыт работы с Acrobat (Reader или Full), но это ничего, кроме бесшумного (это без присмотра, однако - просто зависит от того, как "тихий" тихий запрос). Если у вас есть интерес, я могу снять с вас собственный код, который делает необходимые DDE-вызовы.

Ответ 7

iText предназначен для создания файлов PDF (за сообщение, которое я видел у автора), и, вероятно, это не то, что вы хотите.

Я использовал Qoppa jPDFPrint довольно успешно именно для этой цели, но это не дешево. Если вы можете себе это позволить, это самое надежное решение, которое я нашел до сих пор. Я также был очень впечатлен уровнем поддержки; они даже сгенерировали для меня какой-то пользовательский образец кода.

Я попробовал PDFBox, но обнаружил, что он не поддерживает масштабирование страницы "Сжатие в печатную область", которое вы получаете с помощью Acrobat. Не все будут заботиться об этой функции, но это важно для меня.