Java内からのPDFのサイレント印刷
-
05-07-2019 - |
質問
Java内からのPDFドキュメントのサイレント印刷を検討しています。印刷はブラウザではなくデスクトップから呼び出されるため、JavaScriptを使用できません。 PDFレンダラーは運用上のソリューションですが、そのレンダリング品質は受け入れられません。 iTextはJava印刷サービスとプラグインできないようです。いくつかの商用Javaライブラリ、QoppaによるjPDFPrint、JPedal、およびまだ試していないICEpdfがあります。
JavaからのPDFサイレント印刷の経験はありますか?
解決
Apache PDFBox 。現在インキュベーション中ですが、PDF印刷機能はその前にありました。内部的には、Java印刷サービスを使用して印刷ジョブを作成し、サイレント印刷。
Fontboxも必要であり、現在の(今後の0.8.0リリース)には、Type 0フォントを持つドキュメントの適切なフォールバックが含まれていることに注意してください。タイプ1フォントは正しく印刷されます。ただし、0.7.3では、タイプ0フォントでドキュメントを印刷しようとすると、例外がスローされます。
他のヒント
私は誤解しているかもしれませんが、Print Service 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のバインディングがあります。
JPadalを使用した例が http://www.jpedal.org/support_egSP.php <にあります
完全なフォントサポートが必要な場合は、IcePdfの商用バージョンが必要になります。
Acrobat(ReaderまたはFull)に印刷を行わせた経験はありますが、それはサイレント以外の何物でもありません(ただし、無人です-サイレント要件がどの程度「サイレント」であるかに依存します)。興味があれば、必要なDDE呼び出しを行うネイティブコードを撮影できます。
iTextは、PDFファイルを作成することを目的としており(著者から見た投稿ごと)、おそらくあなたが望むものではありません。
この目的のためにQoppaのjPDFPrintを非常にうまく使用しましたが、安くはありません。余裕があれば、これは私がこれまでに見つけた最も堅牢なソリューションです。サポートのレベルにも非常に感銘を受けました。いくつかのカスタムサンプルコードも生成してくれました。
PDFBoxを試しましたが、「印刷可能領域に縮小」をサポートしていないことがわかりました。 Acrobatで得られるページスケーリング。誰もがこの機能を気にするわけではありませんが、それは私にとって不可欠です。