用pdfbox进行pdf转图片中文乱码,缺失字体

  • Post author:
  • Post category:其他


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容器里,不然不会生效。



版权声明:本文为qq_36956002原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。