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

使用ITextRenderer转换HTML到PDF时图片不显示的问题求助

问题:ITextRenderer转换HTML到PDF时PNG图片无法显示,文本正常

我尝试把包含文本和PNG图片的HTML内容转换成PDF,用ITextRenderer处理后,只有图片显示不出来,文本内容是正常的。我已经通过Sysout打印了HTML内容,图片标签看起来是正常的,但就是无法在PDF里呈现。我的Java代码如下:

ITextRenderer renderer = new ITextRenderer(); 
Document resultDoc = (Document) result.getNode(); 
renderer.setDocument(resultDoc, ""); 
renderer.layout(); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
renderer.createPDF(baos); 
baos.close(); 
return Base64.getEncoder().encodeToString(baos.toByteArray()); 
解决方案思路

我之前也碰到过一模一样的问题,大概率是图片路径解析或者加载机制出了问题,给你几个实际可行的排查和解决方向:

  • 补全基准URL,让渲染器找到图片位置
    你调用renderer.setDocument(resultDoc, "")时第二个参数传了空字符串,这会导致ITextRenderer没法正确解析HTML里的相对路径图片。如果你的图片用的是相对路径(比如<img src="images/test.png">),这里必须传入HTML内容对应的基准URL——比如本地资源目录的URI,或者图片所在的服务器地址。举个例子,如果图片放在项目的src/main/resources/static/images下,你可以这么写:

    String baseUrl = getClass().getResource("/static/").toExternalForm();
    renderer.setDocument(resultDoc, baseUrl);
    
  • 先确认图片本身能被读取
    有时候HTML标签看着没问题,但图片文件可能不存在、路径写错了,或者权限不够读不了。你可以先手动验证一下:用代码尝试读取图片的输入流,如果没抛异常,说明图片能正常访问:

    URL imageUrl = new URL(baseUrl + "images/test.png");
    InputStream is = imageUrl.openStream();
    is.close(); // 能走到这一步,图片路径和权限就没问题
    
  • 如果是Base64图片,检查编码格式
    要是你的HTML里用的是Base64内嵌图片(比如<img src="data:image/png;base64,iVBORw0KGgo...">),要确认Base64字符串没截断、格式也没写错。另外旧版本的ITextRenderer对某些Base64格式支持不太好,试试升级依赖版本。

  • 检查依赖是否完整匹配
    确保项目里的iText和Flying Saucer依赖是完整且版本匹配的,比如Maven项目可以用这些依赖:

    <dependency>
        <groupId>org.xhtmlrenderer</groupId>
        <artifactId>flying-saucer-pdf-itext5</artifactId>
        <version>9.1.22</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13.3</version>
    </dependency>
    

    版本不兼容很容易导致图片加载失败。

  • 自定义资源加载逻辑兜底
    如果上面的方法都没用,你可以手动给渲染器加个自定义资源解析器,强制指定图片的加载路径:

    renderer.getSharedContext().getUserAgent().setResourceResolver(new ResourceResolver() {
        @Override
        public InputStream getResource(String uri) throws IOException {
            // 根据实际的uri匹配对应的图片资源
            if ("images/test.png".equals(uri)) {
                return getClass().getResourceAsStream("/static/images/test.png");
            }
            return super.getResource(uri);
        }
    });
    

内容的提问来源于stack exchange,提问作者Karthikeyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:29:32