Как распечатать PDF из java-приложения


Я должен распечатать PDF-файл с помощью java-приложения. Я попробовал такой подход:

FileInputStream psStream = new FileInputStream("<path to file>");
PrintService service = getPrinterByName("some printer name");
if (service != null) {
    DocPrintJob printJob = service.createPrintJob();
    Doc document = new SimpleDoc(psStream, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
    try {
        printJob.print(document, null);
    } catch (PrintException e) {
        e.printStackTrace();
    }
}

private PrintService[] getPrintersList() {
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);

    return services;
}

private PrintService getPrinterByName(String name) {
    PrintService[] list = getPrintersList();
    if (list.length > 0) {
        for (PrintService service : list) {
            if (service.getName().contains(name)) {
                return service;
            }
        }
    }
    return null;
}

Когда я тестировал это на поддельном принтере (я использовал PDFCreator в качестве принтера), все было в порядке, но когда я попытался напечатать на физическом принтере, ничего не произошло.

Затем я использовал PDFBox. Документ был напечатан, но со странными точками между словами, в тех местах, где их не должно было быть.

Итак, возможно, кто-то имеет опыт печати PDF из java-приложений и может поделиться этим информация?

1 3

1 ответ:

Отправка PDF-файла непосредственно на принтер будет работать только для принтеров, поддерживающих формат PDF изначально. Это будет поддерживаться любым виртуальным PDF-принтером,но не большинством аппаратных принтеров. Если вы хотите надежно распечатать PDF-файл, вам нужно использовать библиотеку для визуализации его содержимого в принтер.

Взгляните тогда на этот вопрос в SO:
какую библиотеку рендеринга PDF на основе Java я должен использовать для печать?

Обновление: Ссылка выше сломана, но нет никакой замены для него другой, что делает поиск google. К сожалению, владельцы переполнения стека решили, что вопросы, связанные с рекомендациями библиотеки, не приветствуются.