Тихая печать 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. Не все будут заботиться об этой функции, но это важно для меня.