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

