1. 程式人生 > >Java實現PDF列印的解決方案

Java實現PDF列印的解決方案

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命令有興趣可自行搜尋~