java - 使用 XMLWorker 通过 iText ver 5 将 HTML 转换为 PDF 时丢失图像

标签 java itext

我正在尝试使用 itextpdf 5.5.6 将 HTML 转换为 PDF。 并且像下面这样的图像不会导出。

<img alt="" src="http://localhost:8080/images/logo.jpg" style="height:53px; width:161px" /> 

这是我正在使用的源代码。

        InputStream is = new ByteArrayInputStream(bytes);
        InputStream resourceInputStream = servletContext.getResourceAsStream("/css/doc_template.css");
        if (resourceInputStream != null){
            XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, resourceInputStream, Charset.forName("UTF-8"));
        } else {
            throw new Exception("Not available resource:" + servletContext.getResource("/css/doc_template.css").getPath());
        }

最佳答案

已修复。我必须像这里一样扩展 AbstractImageProvider https://developers.itextpdf.com/examples/xml-worker-itext5/html-images

方法如下:

private void createAndSavePdfWithImages(String dest, String content) throws Exception {
        OutputStream file = new FileOutputStream(new File(dest));
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, file);
        document.open();

        byte[] bytes = content.getBytes( Charset.forName("UTF-8"));
        InputStream is = new ByteArrayInputStream(bytes);

        CssFilesImpl cssFiles = new CssFilesImpl();
        InputStream inCssFile = servletContext.getResourceAsStream("/css/doc_template.css");
        CSSResolver cssResolver = null;
        if(inCssFile != null) {
            cssFiles.add(XMLWorkerHelper.getInstance().getCSS(inCssFile));
            cssResolver = new StyleAttrCSSResolver(cssFiles);
        } else {
            cssResolver  = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
        }

        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
        htmlContext.setImageProvider(new ImageProvider());

        PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
        HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);

        XMLWorker worker = new XMLWorker(css, true);
        XMLParser p = new XMLParser(worker);
        p.parse(is, Charset.forName("UTF-8"));

        document.close();
    }

    class ImageProvider extends AbstractImageProvider {

        @Override
        public Image retrieve(String src) {
            try {
                String path = servletContext.getRealPath(src);
                Image img = com.itextpdf.text.Image.getInstance(path);
                return Image.getInstance(img);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public String getImageRootPath() {
            return null;
        }
    }

关于java - 使用 XMLWorker 通过 iText ver 5 将 HTML 转换为 PDF 时丢失图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47808275/

相关文章:

c# - 使用 System.Drawing 绘制文本时出现低分辨率图像

java - 从 URL 添加图像到 PDF?

c# - itext 阅读 pdf 1s 作为向上箭头错误

java - 如何解决java.lang.NoSuchMethodError : org. hibernate.integrator.internal.IntegratorServiceImpl

java - 类型不兼容并且在 twitter4j 中找不到符号?

java - MongoDB 在过滤器中返回指定文档

java - 生成PDF时如何添加外部CSS?

java - BorderLayout - 两个组件中只有一个出现在 SOUTH 中

java - 调整工具栏图标的大小

java - 带有 Itext 的背景图案