前篇文章分享到了 透過模板生成word文件的功能,以下接著分享如何透過Java將docx轉成pdf文件。
<dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.document.docx</artifactId> <version>2.0.2</version></dependency><dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.document</artifactId> <version>2.0.2</version></dependency><dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.template</artifactId> <version>2.0.2</version></dependency><dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.core</artifactId> <version>2.0.2</version></dependency><dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId> <version>2.0.2</version></dependency><dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId> <version>2.0.2</version></dependency>
重點強調 fr.opensagres.poi.xwpf.converter.pdf 這個jar包作為關鍵部分,同時也要注意依賴的POI版本 ,如下依賴包一個不能少
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.0.1</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.1</version></dependency><dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>3.0.2</version></dependency>
程式關鍵就在於依賴的包的版本,依賴不對程式調不通的。核心程式碼如下:
private byte[] convertPdf(byte[] bytes){ ByteArrayOutputStream out = new ByteArrayOutputStream(); try{ ByteArrayInputStream bis = new ByteArrayInputStream(bytes); XWPFDocument document = new XWPFDocument(bis); PdfOptions options = PdfOptions.create(); PdfConverter.getInstance().convert(document, out, options); }catch (Exception e){ e.printStackTrace(); } return out.toByteArray();}
關鍵程式碼只有三行,程式碼算是很簡單了。
接下來實現PDF列印功能
這裡也是摸索特別久的地方,最初找到列印程式碼參考的
https://my.oschina.net/960823/blog/2994220 ,這裡應該是對大型的A4印表機有效的,具體還沒測試,但是對於這種小型的條碼印表機或者票據印表機無效。提示不支援的型別。
本來要放棄迴歸原始手段的時候,發現了另外一篇文章 https://cloud.tencent.com/developer/article/1028615 ,抱著死馬當成活馬醫的態度,先試試再說,沒想到就成功了。
下面記錄我的步驟:
1、引入pdfbox
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.22</version></dependency>
2、編寫列印程式碼
// 定位預設的列印服務PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();System.out.println(defaultService.getName());try { PrinterJob job = PrinterJob.getPrinterJob();// 建立列印作業 PDDocument document = PDDocument.load(pdf); PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE); job.setPrintable(pdfPrintable); job.setPrintService(defaultService); Paper paper = new Paper(); paper.setSize(133.8, 384); paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); PageFormat pageFormat = new PageFormat(); pageFormat.setPaper(paper); Book book = new Book(); book.append(pdfPrintable, pageFormat, 1); job.setPageable(book); //設定列印份數 job.setCopies(1); job.print(); document.close();} catch (Exception e) { e.printStackTrace(); return false;}
經測試,效果完美!
是不是很完美
後面繼續分享如何改造前端頁面部分 #Vue.js# #ant#
最新評論