You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PDFBox 3.0.0转换PDF为图片时中文显示不全问题求助

PDF转图片中文显示不全问题及PDFBox 3.0.0字体设置解答

问题描述

使用以下Java代码将PDF转换为图片时,出现中文显示不全的情况:

public void pdf2img() throws IOException {
        String url = "xxxx";
        byte[] pdfByteArray = downloadFile(url);
        PDDocument document = Loader.loadPDF(pdfByteArray);
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int totalPage = document.getNumberOfPages();
        BufferedImage[] bufferedImages = new BufferedImage[totalPage];
        for (int i = 0; i < totalPage; i++) {
            BufferedImage image = pdfRenderer.renderImageWithDPI(i, 180, ImageType.RGB);
            image.flush();
            bufferedImages[i] = image;
        }

        merge(bufferedImages);
}

输入PDF中的中文内容在输出图片中存在部分缺失的情况。

成因分析

  • 核心原因大概率是字体缺失:PDF里的中文依赖特定中文字体(如宋体、黑体等),如果运行代码的系统没安装对应字体,PDFBox渲染时找不到匹配字体,就会出现字符缺失、乱码或显示不全。
  • 少数情况是PDF嵌入了子集字体,若子集字体包含的字符不全,也会导致部分中文无法渲染,但这种情况较少见,优先排查系统字体缺失问题。

PDFBox 3.0.0字体设置方法

PDFBox 3.0.0通过FontProvider配置字体,具体操作如下:

  1. 加载本地中文字体文件并添加到字体提供者:
// 示例:加载本地宋体文件
PDType0Font font = PDType0Font.load(document, new File("simsun.ttf"));
DefaultFontProvider fontProvider = new DefaultFontProvider();
fontProvider.addFont(font);
  1. 初始化PDFRenderer时传入配置好的字体提供者:
PDFRenderer pdfRenderer = new PDFRenderer(document, new RenderingHints(null), fontProvider, null);
  1. 也可设置系统字体路径,让PDFBox自动识别系统中的中文字体:
// Windows系统示例:指向系统字体目录
System.setProperty("sun.awt.font.path", "C:\\Windows\\Fonts");
// Linux系统示例
// System.setProperty("sun.awt.font.path", "/usr/share/fonts");

额外建议

  • 确保运行环境安装常用中文字体(宋体、黑体、微软雅黑等);
  • 若无法安装系统字体,可将字体文件打包到项目中,通过代码加载使用;
  • 渲染时可适当调整DPI参数,避免分辨率问题导致的显示异常。

内容的提问来源于stack exchange,提问作者邵程立

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:22:07