PDDocument pdDocument = PDDocument.load(inputStreamByUrl);
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(i, 144F, ImageType.RGB);
使用pdfbox读取pdf转图片的时候,如果缺失字体,中文会乱码。
运行在Windows的提示
2020-03-20 19:14:53.598 [Thread-13] WARN o.a.pdfbox.pdmodel.font.FileSystemFontProvider - New fonts found, font cache will be re-built
2020-03-20 19:14:53.598 [Thread-13] WARN o.a.pdfbox.pdmodel.font.FileSystemFontProvider - Building on-disk font cache, this may take a while
2020-03-20 19:14:53.704 [Thread-13] WARN o.a.pdfbox.pdmodel.font.FileSystemFontProvider - Finished building on-disk font cache, found 447 fonts
2020-03-20 19:14:53.711 [Thread-13] WARN org.apache.pdfbox.pdmodel.font.PDCIDFontType0 - Using fallback DengXian for CID-keyed font AdobeKaitiStd-Regular
2020-03-20 19:14:53.829 [Thread-13] WARN org.apache.pdfbox.pdmodel.font.PDCIDFontType0 - Using fallback DengXian for CID-keyed font AdobeKaitiStd-Regular
2020-03-20 19:14:53.860 [Thread-13] WARN org.apache.pdfbox.pdmodel.font.PDCIDFontType0 - Using fallback MalgunGothic-Semilight for CID-keyed font STSong-Light
2020-03-20 19:14:53.916 [Thread-13] WARN org.apache.pdfbox.rendering.CIDType0Glyph2D - No glyph for 21271 (CID 041a) in font STSong-Light
2020-03-20 19:14:53.918 [Thread-13] WARN org.apache.pdfbox.rendering.CIDType0Glyph2D - No glyph for 20140 (CID 08d8) in font STSong-Light
2020-03-20 19:14:53.660 [Thread-13] ERROR o.a.pdfbox.pdmodel.font.FileSystemFontProvider - Could not load font file: C:\WINDOWS\FONTS\mstmc.ttf
java.io.EOFException: null
at org.apache.fontbox.ttf.TTFDataStream.readUnsignedInt(TTFDataStream.java:152)
at org.apache.fontbox.ttf.TTFParser.readTableDirectory(TTFParser.java:309)
at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:139)
at org.apache.fontbox.ttf.TTFParser.parse(TTFParser.java:87)
运行在Linux的提示
2020-03-25 14:17:28.686 WARN 1 --- [ Thread-3] o.a.pdfbox.pdmodel.font.PDCIDFontType0 : Using fallback LiberationSans for CID-keyed font AdobeKaitiStd-Regular
2020-03-25 14:17:28.766 WARN 1 --- [ Thread-3] o.a.pdfbox.rendering.CIDType0Glyph2D : No glyph for 1050 (CID 041a) in font AdobeKaitiStd-Regular
2020-03-25 14:17:28.767 WARN 1 --- [ Thread-3] o.a.pdfbox.rendering.CIDType0Glyph2D : No glyph for 2264 (CID 08d8) in font AdobeKaitiStd-Regular
Using fallback LiberationSans for CID-keyed font AdobeKaitiStd-Regular
Using fallback LiberationSans for CID-keyed font STSong-Light
这个提示是说当前环境缺少CID-keyed font AdobeKaitiStd-Regular字体和CID-keyed font STSong-Light字体,pdfbox使用使用LiberationSans字体进行替换。
这两个字体可以用AdobeKaitiStd-Regular.otf和SimSun.ttf两个字体文件。
找字体文件可以在自己的电脑上找,可以在这个C:\Windows\Fonts找到,或者用everything工具查找,没有的话可以在网上找
有些字体实在找不到,也可以修改pdfbox的源码,修改字体的替换规则,
替换的规则在org.apache.pdfbox.pdmodel.font.FontMapperImpl可以查看到
可以看到这个集合里,如果key的字体缺失,就会依次找value指定的字体进行替换。
pdf文件用到了哪些字体,可以用福昕之类的pdf编辑工具查看
可以看到项目提示信息指的字体,所使用的实际字体是什么名字,查找这个字体就可以。
至于报错的那个缺少字体mstmc.ttf,这个字体找了很久没找到,不过也无所谓了,反正项目最后是布在Linux上的。
找到字体之后将字体安装在服务器环境就可以。
要进到这个路径
/usr/share/fonts/
然后新建一个文件夹,把字体文件放到新建的文件夹里
然后执行下面三条命令
mkfontscale
mkfontdir
fc-cache -fv
执行完之后字体就安装成功了,可以使用fc-list命令查看已安装的字体。
如果是使用docker的话,记得要把刚刚新建的字体文件夹挂载到docker容器里,不然不会生效。