【问题标题】:Android ItextG Image tag is not renderingAndroid ItextG 图像标签未呈现
【发布时间】:2017-12-20 19:31:52
【问题描述】:

我正在使用 iTextPdf(适用于 Android 的 iTextG)库为我的 Android 应用程序将 Html 转换为 PDF 文档。除了收据上的标志外,一切对我来说都很好。我的 html 包含 <img> 标签和图片的源 http url

<img src="http...."></img>

创建的 pdf 没有图像。在我的 Java 应用程序中运行的相同代码和 html 显示带有创建的 PDF 的徽标(这表明访问图像没有问题)。我想知道此功能是否仅与 Java 兼容而与 Android 不兼容? 我正在使用以下依赖项:

compile 'com.itextpdf:itextg:5.5.10'
compile 'com.itextpdf.tool:xmlworker:5.5.10'

HTML代码:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="English">
<head>
    <title>Title</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
</head>

<body>
<img src="https://image.flaticon.com/teams/slug/google.jpg"></img>
<h1>Fischerstube</h1>
</body>
</html>

主要活动中的功能:

 private void htmlToPdf(String html) throws DocumentException, IOException {

    try {

        File file = new File(Environment.getExternalStorageDirectory() + File.separator + "logo.pdf");
        OutputStream fileOutputStream = new FileOutputStream(file);
        Document document = new Document();
        document.setPageSize(new Rectangle(201,720));
        PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream);
        document.open();
        InputStream is = new ByteArrayInputStream(html.getBytes());
        XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
        document.close();
        fileOutputStream.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

它仅呈现&lt;h1&gt; 标签并显示 Fischerstube,但在 ANDROIRD DEVICE 上没有图像。 哪位大神能帮帮我,不胜感激。

【问题讨论】:

  • iTextG 和 XMLWorker 的版本必须相同。
  • @AmedeeVanGasse:我检查了 5.5.10 的 xmlworker 和 itextg 并得到了相同的行为(无图像)。我不应该有问题,因为这种组合在 Java 上运行良好,但在 Android 上运行良好。
  • @AmedeeVanGasse 请检查我刚刚更新了我在 Android 中使用的信息。
  • 您的 Android 设备似乎不允许访问外部资源,或者允许访问,但下载图像超时。另外:如果您向他们提供的应用程序会严重增加他们的数据使用费用,您的客户可能会非常生气。

标签: android itext itextg


【解决方案1】:

查看提供的文档here 为我解决了问题。

确保您在清单中具有 Internet 权限。

创建 Base64ImageProvider 类

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;
    }
}

然后调用 create pdf 方法将你的 HTML 转换为 pdf

public void createPdf() throws IOException, DocumentException {
    String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" +
            "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"English\">\n" +
            "<head>\n" +
            "    <title>Title</title>\n" +
            "    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/>\n" +
            "</head>\n" +
            "\n" +
            "<body>\n" +
            "<img src=\"https://image.flaticon.com/teams/slug/google.jpg\"></img>\n" +
            "<h1>Fischerstube</h1>\n" +
            "</body>\n" +
            "</html>";


    // step 1
    File file = new File(Environment.getExternalStorageDirectory() + File.separator + "logo.pdf");
    OutputStream fileOutputStream = new FileOutputStream(file);
    Document document = new Document();
    // step 2
    PdfWriter writer = PdfWriter.getInstance(document, fileOutputStream);
    // step 3
    document.open();
    // step 4

    // CSS
    CSSResolver cssResolver =
            XMLWorkerHelper.getInstance().getDefaultCssResolver(true);

    // HTML
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
    htmlContext.setImageProvider(new Base64ImageProvider());

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

    // XML Worker
    XMLWorker worker = new XMLWorker(css, true);
    XMLParser p = new XMLParser(worker);
    p.parse(new ByteArrayInputStream(str.getBytes()));

    // step 5
    document.close();
}

确保在后台线程上执行 createPdf 方法。因为您将执行网络操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2012-07-19
    • 2012-05-08
    • 1970-01-01
    • 2020-11-10
    • 2018-04-25
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多