一、引入依賴
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.13</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.13</version> </dependency>
二、PDF轉PNG代碼
String pdfBase64 = "XXXXX"; PDDocument pdDocument = PDDocument.load(Base64Utils.decodeFromString(pdfBase64)); PDFRenderer renderer = new PDFRenderer(pdDocument); BufferedImage bufferedImage = renderer.renderImage(0); ImageIO.write(bufferedImage, "png", new File("xxx.png"));
三、PNG中文方塊亂碼
查看linux服務器上的字體庫如下。
轉換后的PNG如下。
日志中打印出類似這樣的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就說明系統沒有安裝STSong-Light字體,pdfbox使用XXX字體來替代了。如果出現方塊,就說明沒有這種字體,並且替代字體也沒有,日志也有相應的其他提示。
四、linux添加字體庫
可以選擇STSong-Light字體,而我這里選擇simsun.ttf字體。
#cd /usr/share/fonts/ // 進入系統自帶的字體目錄 #mkdir myfonts // myfonts 是你自己隨便取得文件夾名字,一定要有這一步 #將字體文件拷貝到這個文件夾下,在cd /usr/share/fonts/目錄下執行以下命令 #mkfontscale #mkfontdir #fc-cache -fv //更新字體緩存 #fc-list // 查看系統中所有得字體,可用於測試是否安裝字體成功
如果 /usr/share/fonts/ 目錄當前用戶沒有權限,可以在 ~/.fonts/ 目錄下新增字體庫,操作步驟和上面一樣。
注意:一定要創建字體對應的文件夾,如果字體直接放在fonts目錄,不會生效。
新增字體之后,可以看到字體庫列表中有如下 宋體 的字樣了。
最終轉換后正常的PNG如下。