pdf转图片文字丢失,字体映射替换

1,143 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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包中的该文件,拷贝出来

image.png

在文件目录中建立与FontMapperImpl相同的目录文件,org.apache.pdfbox.pdmodel.font,并将拷贝的文件放在该目录下,示例如下:

image.png

该文件中就是所有字体的映射关系,接下来在substitutes中将没有的字体映射到存在的字体上就可以了,比如上方日志文件中是STSong-Light不存在,而我们本地有SimHei这个字体,就可以将STSong-Light映射改为SimHei字体

image.png