Вопрос

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

Кто-нибудь имеет опыт работы с PDF-печатью без вывода сообщений на Java?

Это было полезно?

Решение

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

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

Другие советы

Может быть, я неправильно понимаю, но почему бы просто не использовать 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.");
}

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

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.");
    }       
}

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

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

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

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

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

scroll top