携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第七天,点击查看活动详情
pdf转图片有文字丢失的问题,通过分析日志,发现是由于系统字体映射有问题,系统默认映射字体在库中不存在,可以手动将映射转向已存在的字体
pom引入
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
代码
/**
* PDF文件转PNG图片
* @return
*/
public void pdf2Image(String pdfPath, String path) throws InterruptedException, IOException {
File file = new File(pdfPath);
try {
PDDocument doc = PDDocument.load(file);
int endPage = null == doc ? Integer.MAX_VALUE : doc.getNumberOfPages();
PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true);
stripper.setStartPage(1);
stripper.setEndPage(endPage);
String content = stripper.getText(doc);
System.out.println("pdf 文件解析,内容为:" + content);
PDFRenderer renderer = new PDFRenderer(doc);
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; i++) {
BufferedImage image = renderer.renderImage(i, 1.5f);// Windows native DPI
File file1 = new File(path);
ImageIO.write(image, "JPG", file1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行之后发现转换后的图片少了一个字,但是内容识别出来了,看了下日志
Using fallback FZCHSJW--GB1-0 for CID-keyed font STSong-Light
No glyph for 27765 (CID 38ac) in font STSong-Light
发现是运行时没有找到STSong-Light这个字体,使用FZCHSJW--GB1-0 这个字体进行替换,这个字体导致文字缺失
解决方法:
在idea中使用ctrl+H,在全局搜索中搜索FontMapperImpl,并且选中scope,找到jar包中的该文件,拷贝出来
在文件目录中建立与FontMapperImpl相同的目录文件,org.apache.pdfbox.pdmodel.font,并将拷贝的文件放在该目录下,示例如下:
该文件中就是所有字体的映射关系,接下来在substitutes中将没有的字体映射到存在的字体上就可以了,比如上方日志文件中是STSong-Light不存在,而我们本地有SimHei这个字体,就可以将STSong-Light映射改为SimHei字体