PDFBox帶了一些很方便的API, 可以直接創建 讀取 編輯 打印PDF文件.
創建PDF文件
1 public static byte[] createHelloPDF() { 2 ByteArrayOutputStream out = new ByteArrayOutputStream(); 3 try { 4 PDDocument doc = new PDDocument(); 5 PDPage page = new PDPage(); 6 doc.addPage(page); 7 PDFont font = PDType1Font.HELVETICA_BOLD; 8 PDPageContentStream content = new PDPageContentStream(doc, page); 9 content.beginText(); 10 content.setFont(font, 20); 11 content.moveTextPositionByAmount(250, 700); 12 content.drawString("Hello Print!"); 13 14 content.endText(); 15 content.close(); 16 doc.save(out); 17 doc.close(); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 return out.toByteArray(); 22 }
這邊如果不把他save到byte[]里, 而是直接close, 返回PDDocument 給外部文件.
可能會出現Cannot read while there is an open stream writer
打印文件
1 // 獲取本地創建的空白PDF文件 2 PDDocument document = PDDocument.load(createHelloPDF()); 3 // 加載成打印文件 4 PDFPrintable printable = new PDFPrintable(document); 5 PrinterJob job = PrinterJob.getPrinterJob(); 6 job.setPrintable(printable); 7 job.print();
如需要打印自定義紙張, 參加另外一篇博客 使用PDFBox打印自定義紙張的PDF
如果想要讀取本地pdf文件, 那就更簡單了, 直接
1 InputStream in = new FileInputStream("d:\\cc.pdf"); 2 PDDocument document = PDDocument.load(in);
縮放問題
不過發現打印出來的pdf文件存在縮放問題. 顯得邊距很大, 能跑馬.
研究了下, 發現PDFPrintable可以接受是否縮放的參數.
1 public enum Scaling { 2 // 實際大小 3 ACTUAL_SIZE, 4 // 縮小 5 SHRINK_TO_FIT, 6 // 拉伸 7 STRETCH_TO_FIT, 8 // 適應 9 SCALE_TO_FIT; 10 11 private Scaling() { 12 } 13 }
因此只要在 new PDFPrintable(document), 傳入Scaling, 就不會縮放了.
Scaling.ACTUAL_SIZE