使用base64图像的HTML到PDF会抛出FileNotFoundException

我正在使用itextpdf-5.0.6.jar(Java 8),当我尝试使用base64图像标记导出html代码时,我得到文件未找到exception。

如果我删除图像标记一切都很好!

我发现很少有关于覆盖图像标签处理器的解决方案,但是大多数都是旧的并且与5.0.6版本不兼容。

这是我发送的HTML:

"\n\n\n \n Test PDF\n\n\n\n 
\n\n \n\n\n
\n\n
\n
\nHellow world
\n"

我的代码的一部分:

 fileOutputStream = new FileOutputStream(file); Document document = new Document(); PdfWriter.getInstance(document, fileOutputStream); document.open(); HTMLWorker htmlWorker = new HTMLWorker(document); StringReader stringReader = new StringReader(htmlCode); htmlWorker.parse(stringReader); document.close(); fileOutputStream.close(); 

任何帮助都会被感谢

请停止使用HTMLWorker ,因为在StackOverflow上重复多次, HTMLWorker类很久以前就已经放弃了,转而支持XML Worker。 我们不会投资HTMLWorker进一步开发,因此使用它是一个非常糟糕的选择。 请切换到XML Worker。

同时升级到最新的iText版本,您使用的版本日期为2011年2月4日 ,许多错误已在过去的4年内得到修复。 确保iText jar和XML Worker jar具有相同的版本号。

我还不支持Base64图像,但我已经为您提供了一个非常简单的概念certificate,显示了添加对此类图像的支持是多么容易。 看一下ParseHtml4示例和生成的PDF: html_4.pdf 。

要实现此目的,您需要编写ImageProvider接口的实现。 我通过扩展AbstractImageProvider类完成了这个:

 class Base64ImageProvider extends AbstractImageProvider { @Override public Image retrieve(String src) { int pos = src.indexOf("base64,"); try { if (src.startsWith("data") && pos > 0) { byte[] img = Base64.decode(src.substring(pos + 7)); return Image.getInstance(img); } else { return Image.getInstance(src); } } catch (BadElementException ex) { return null; } catch (IOException ex) { return null; } } @Override public String getImageRootPath() { return null; } } 

正如您所看到的,我通过img标记的src属性检查传入XML Worker的"base64,"是否存在。 如果该String存在,我解码"base64,"任何内容,并返回使用结果字节创建的Image对象。

一旦你有这个ImageProvider实现,它只是将它传递给XML Worker。