开发环境下Java生成PDF时JPG图片未加载问题求助
排查开发环境下OpenHtmlToPdf加载图片失败的问题
先看你碰到的具体报错:
com.openhtmltopdf.exception WARNING:: IO problem for https://180.151.248.194:20505/resources/logo.jpg
还有你生成图片路径的代码:
path=request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+ request.getContextPath() + "/resources/logo.jpg";
结合本地正常、开发环境异常的情况,我给你梳理几个大概率能解决问题的排查方向:
先查开发环境的网络连通性
本地环境里,应用和图片资源要么在同一机器要么在同一局域网,访问毫无压力,但开发环境可能有各种网络限制:- 服务器的防火墙/安全组没开20505端口,导致OpenHtmlToPdf的渲染引擎连不上这个HTTPS地址;
- 应用所在的服务器根本ping不通
180.151.248.194这个IP(比如内部网络做了隔离)。
最快的验证方式是在开发环境的服务器上跑个命令测试:
curl -k https://180.151.248.194:20505/resources/logo.jpg加
-k是跳过HTTPS证书校验——毕竟用IP地址搭的HTTPS服务,大概率是自签名证书,直接访问会被拒。检查HTTPS证书的信任问题
OpenHtmlToPdf访问HTTPS资源时,会严格校验证书合法性。如果开发环境用的是自签名证书,而JVM的信任库没导入这个证书,必然会触发IO异常。
解决办法有两个:- 把自签名证书导入到开发环境JVM的
cacerts信任库中(步骤网上一搜就有,注意JDK版本对应的路径); - 开发环境临时绕过证书校验(生产绝对不能这么干!),可以自定义OpenHtmlToPdf的
UserAgentCallback来忽略证书错误。
- 把自签名证书导入到开发环境JVM的
确认路径生成逻辑的环境差异
你用request.getServerName()和request.getServerPort()拼路径,得确认开发环境里这些参数拿的对不对:- 比如开发环境有没有配置反向代理(像Nginx),导致
request.getServerPort()拿到的是代理的端口,而不是实际资源服务的20505? - 再检查
request.getContextPath()在开发环境和本地是不是一致,有没有多打或者少打路径片段。
最简单的办法是在开发环境里把生成的path变量打出来,对比一下和你手动能访问的图片URL是不是完全一致。
- 比如开发环境有没有配置反向代理(像Nginx),导致
调整OpenHtmlToPdf的资源加载配置
有时候OpenHtmlToPdf默认的资源加载策略不支持某些HTTPS配置,比如TLS版本太低。你可以试试自定义FSSupplier,或者调整HtmlConverter的配置,指定它支持的TLS版本(比如TLS 1.2)。
内容的提问来源于stack exchange,提问作者pradeep
相关产品推荐
相关产品推荐

