使用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。