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

使用iText将HTML转PDF时图片丢失问题求助

问题分析与解决方案

从你提供的日志和代码来看,远程图片无法加载是导致PDF中图片丢失的核心原因,另外的@keyframes错误属于次要问题,不会影响图片渲染,先重点解决图片加载的问题:

关键错误原因

日志里这条错误直接点明了问题:

2019-09-29 10:06:22,944 ERROR c.i.s.r.r.ResourceResolver:146 - Unable to retrieve image with given base URI (file:/Users/jklancic/dev/custom/resume/) and image source path (http://clipartmag.com/image/iron-man-face-drawing-6.png)

iText默认的ResourceResolver只会处理本地文件系统的资源,对于远程HTTP/HTTPS链接的图片,需要额外配置资源获取器才能正确加载。

解决方案:配置远程资源加载器

你需要在调用HtmlConverter.convertToPdf时,传入自定义的ConverterProperties,配置能处理远程URL的ResourceRetriever。具体代码修改如下:

String resumeFilePath = String.format(RESUME_FILE_PATH, userProfileBean.getFirstname(), userProfileBean.getLastname());
Document resumeAsHtml = createHtmlDocument(userProfileBean);

// 1. 创建ConverterProperties并配置资源获取器
ConverterProperties properties = new ConverterProperties();
DefaultResourceRetriever resourceRetriever = new DefaultResourceRetriever();
// 可选:设置网络超时时间,避免请求卡住
resourceRetriever.setConnectTimeout(3000);
resourceRetriever.setReadTimeout(3000);
properties.setResourceRetriever(resourceRetriever);

// 2. 使用带properties参数的convertToPdf方法
HtmlConverter.convertToPdf(resumeAsHtml.html(), new FileOutputStream(resumeFilePath), properties);

File newResume = new File(resumeFilePath);

额外注意事项

  1. 网络连通性检查:确保运行代码的服务器能够正常访问图片的URL(http://clipartmag.com/image/iron-man-face-drawing-6.png),可以通过curl或者浏览器测试。
  2. 代理配置(如果需要):如果你的环境处于企业代理之后,需要给resourceRetriever添加代理配置:
// 示例:配置HTTP代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("你的代理地址", 代理端口));
resourceRetriever.setProxy(proxy);
// 如果代理需要认证
resourceRetriever.setProxyAuthentication(new BasicAuthentication("代理用户名", "代理密码"));
  1. 关于@keyframes错误:这个错误是因为iText不支持CSS的@keyframes动画规则,你可以忽略它,或者如果HTML模板里包含相关规则的话,删除对应的CSS代码即可,不会影响PDF的核心内容渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:45:27