Java實現PDF列印的解決方案
阿新 • • 發佈:2019-02-12
1.Java Print Service
Java Print Service是Java自帶的列印框架,所在的包javax.print.PrintService;。
實現PDF列印的程式碼流程如下
//1.得到一個檔案的輸入流
FileInputStream fiStream;
try {
psStream = new FileInputStream("./sample.PDF");
} catch (FileNotFoundException ffne) {
}
if (psStream == null) {
return;
}
//這是要列印檔案的格式,如果是PDF文件要設為自動識別
DocFlavor fileFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
//2.得到要列印的文件類DOC
Doc myDoc = new SimpleDoc(fiStream, fileFormat, null);
//3.生成一個列印屬性設定物件
PrintRequestAttributeSet aset =
new HashPrintRequestAttributeSet();
aset.add(new Copies(5));//Copies-列印份數5份
aset.add(MediaSize.A4);//A4紙張
aset.add(Sides.DUPLEX);//雙面列印
//4.關鍵一步,得到當前機器上所有已經安裝的印表機
//傳入的引數是文件格式跟列印屬性,只有支援這個格式與屬性的印表機才會被找到
PrintService[] services =
PrintServiceLookup.lookupPrintServices(fileFormat, aset);
if (services.length > 0) {
//5.用列印服務生成一個文件列印任務,這裡用的是第一個服務
//也可以進行篩選,services[i].getName()可以得到印表機名稱,可用名稱進行比較得到自己想要的印表機
DocPrintJob job = services[0 ].createPrintJob();
try {
//6.最後一步,執行列印文件任務,傳入的引數是Doc文件類,與屬性(5份,雙面,A4)
job.print(myDoc, aset);//成功後電腦會提示已有文件新增到列印佇列
} catch (PrintException pe) {}
}
2.Apache PDFBox
PDFBox是一個用以生成PDF的開源專案,下載地址。
它的列印實現也是封裝了Java Service Print框架的列印功能。
列印PDF很簡單,只需呼叫一個方法即可,PrintPdf.main().不過不能指定列印份數等一些屬性。
經本人測試發現這個PDFBox實現的列印功能比Java Service Print支援的列印機種類更多,有些印表機用Java Service Print 不能正常列印,但用PDFBox可以正常打印出來。
PrintPDF.main(new String[]{
"-silentPrint",//靜默列印
"-password","abcde",//pdf開啟密碼
"-printerName","hp Laserjet 1020" ,//指定印表機名
"-orientation","auto|landscape|portrait",//列印方向,三種可選
"pdfFilePath"//列印PDF文件的路徑
});
PS:這個類在tools包下package org.apache.pdfbox.tools
3.Adobe Reader 命令列印
這種方法實現PDF的文件列印的前提條件是電腦上必須安裝有Adobe公司的Acrobat Reader DC這個軟體,實現列印的原理就是通過這個軟體的一些命令來開啟一個PDF文件,並用軟體直接列印,相當於人工點選列印。
Java呼叫命令如下,其它就是開啟一個Cmd,輸入了列印命令而已
Runtime.getRuntime().exec("cmd.exe /C start acrord32 /P /h " + filePath);
這種方案有個缺點,就是列印時會開啟reader軟體的介面,無法關閉
4.linux列印PDF
如果環境是linux,則列印檔案非常方便,呼叫列印命令,即可列印PDF檔案。
lpr -P printername -#2 /home/csdn.pdf
上述程式碼的含義是:
呼叫名為printername的印表機,當然首先要保證linux上安裝了該名稱的印表機,去列印home目錄下名為csdn.pdf的檔案,份數為2份。
要注意一點,-P必須是大寫,不然無法識別。
如果結合Java使用,命令如下。
String [] cmd={"sh","-c","lpr -P printername -#2 /home/csdn.pdf"}
Runtime.getRuntime().exec(cmd);
上述方法是親測可行的,至於為什麼要加這”sh”,”c”兩個引數,對linux命令有興趣可自行搜尋~