使用ITextRenderer转换HTML到PDF时图片不显示的问题求助
我尝试把包含文本和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

