Тихая печать PDF изнутри Java
-
05-07-2019 - |
Вопрос
Мы ищем тихую печать документов 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.
Пример использования JPedal можно найти по адресу http://www.jpedal.org/support_egSP.php а> р>
Вам понадобится коммерческая версия IcePdf, если вам нужна полная поддержка шрифтов.
У меня есть опыт в том, чтобы Acrobat (Reader или Full) выполнял печать, но это совсем не тихо (хотя и без присмотра - зависит только от того, насколько «тихо» требование молчания). Если есть интерес, я могу снять вам нативный код, который делает необходимые вызовы DDE.
iText предназначен для создания PDF-файлов (согласно сообщению, которое я видел у автора), и поэтому, вероятно, это не то, что вам нужно.
Я достаточно успешно использовал jPDFPrint от Qoppa именно для этой цели, но это не дешево. Если вы можете себе это позволить, это самое надежное решение, которое я когда-либо нашел. Я также был очень впечатлен уровнем поддержки; они даже сгенерировали некоторый пользовательский пример кода для меня.
Я пробовал PDFBox, но обнаружил, что он не поддерживает " Сократить до области печати " масштабирование страницы, которое вы получаете с Acrobat. Не все будут заботиться об этой функции, но она важна для меня. Р>