当前位置: 首页 > 知识库问答 >
问题:

使用itext从带有图像和css的Html字符串为android生成Pdf

柳飞鸾
2023-03-14

我的html文件和图像在资产文件夹,使用这个库我的pdf生成成功,但没有图像显示和没有css风格的排名。任何人都有一个建议,我应该做什么来解决这个问题,如果任何其他库或任何其他选项生成pdf从html将是有帮助的。

我正在使用这些函数生成PDF:

    public static void generatePdfFromHtlm(String fileName, String htmlString){


    try {
        File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), AppConfig.getContext().getPackageName() + "/" + "Pdf");

        if (!mediaStorageDir.exists()) {
            mediaStorageDir.mkdirs();
        }

        File fileWithinMyDir = new File(mediaStorageDir, fileName);

        FontFactory.registerDirectories();
        Document document = new Document(PageSize.A4);
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream(fileWithinMyDir));
        document.open();
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
        htmlContext.setImageProvider(new AbstractImageProvider() {
            public String getImageRootPath() {

                Uri uri = Uri.parse("file:///android_asset/");

                String newPath = uri.toString();

                return newPath;
            }
        });


        CSSResolver cssResolver =
                XMLWorkerHelper.getInstance().getDefaultCssResolver(false);
        /*Pipeline<?> pipeline =
                new CssResolverPipeline(cssResolver,
                        new HtmlPipeline(htmlContext,
                                new PdfWriterPipeline(document, writer)));*/

        // Pipelines
        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);
        InputStream is = new ByteArrayInputStream(htmlString.getBytes());
        p.parse(is);

        document.close();


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

我的html文件是

<!DOCTYPE html>
<!--[if IE 8]> <html lang="en" class="ie8"> <![endif]-->
<!--[if IE 9]> <html lang="en" class="ie9"> <![endif]-->
<!--[if !IE]><!-->
<html lang="en"> <!--<![endif]-->

<!-- BEGIN HEAD -->
<head>
  <meta charset="utf-8" />
  
  <title>WeighInsheet</title> 
  
  
  <style type="text/css">
  
  body { font-family:Arial; }
      .Wrapper { border:1px solid #cccccc; height:auto; margin:0px 65px;}
      .header { height:105px; margin:5px; float:left;}
      .logo { width:100px; height:100px; float:left; }
  .heading { width:600px;}
  h2{ margin:40px 0px 0px 0px;font-size: 22px; font-weight:bold;}
  h3{ margin:0px; font-weight:normal;font-size: 16px;}
  table { border-collapse: collapse; border-spacing: 0;  width:100%; }
  table td { font-family: arial; font-size: 14px; padding: 10px 5px; border: 1px solid #ddd; }  
  table th { background-color:#000000; color:#ffffff; font-family: arial; font-size: 16px; font-weight: bold;
             border: 1px solid #ddd; }  
  
  </style>


</head>

<!-- END HEAD -->

<!-- BEGIN BODY -->

<body>  
  
<div class="Wrapper">

<div class="header">

<div class="logo"><img src="logo.jpg" class="logo"/></div>

<div class="heading" align="center">
<h2>Description</h2>
<h3>Title Meta</h3>
</div>

</div>
<table>

<thead>
 ##CHANGEHEADER##
</thead>

<tbody>
  ##CHANGEBODY##
</tbody>

</table>

</div>  

</body>

<!-- END BODY -->

</html>

共有1个答案

禹德水
2023-03-14

我已经修复了Xml Worker类Pdf生成问题。

为了克服CSS问题,我创建了外部CSS文件并将其与HTML一起应用。

为了前任。

InputStream is = new ByteArrayInputStream(aHtmlString.getBytes());
                            InputStream css = new ByteArrayInputStream(cssString.getBytes());

                            XMLWorkerHelper.getInstance().parseXHtml(writer, document, is, css);

将give your img标记添加到文件夹图像路径。

为了前任。

<img src="/storage/emulated/0/MyApp/Images/my_logo.jpg"/>

使用此方法将文件从资产复制到文件夹。

 public static void listAssetFiles(String path,Context ctx,String folderPath) {

    String [] list;
    try {
        list = ctx.getAssets().list(path);
        if (list.length > 0) {
            // This is a folder
            for (String file : list) {

                copyIntoFolder(file,ctx,path+"/",folderPath);
            }
        }
    } catch (IOException e) {

    }



}

public static void copyIntoFolder(String fileName, Context ctx, String filePath, String folderPath){
    AssetManager assetManager = ctx.getAssets();
    InputStream in = null;
    OutputStream out = null;
    try {
        in = assetManager.open(filePath+fileName);
        File outFile = new File(folderPath , fileName);
        out = new FileOutputStream(outFile);
        Utility.copyFile(in, out);
        in.close();
        // in = null;
        out.flush();
        out.close();
        //out = null;
    } catch(IOException e) {
        Log.e("IOException", "copyIntoFolder: ",e );

    }
}
 类似资料:
  • 我已经搜索了这些问题,但没有找到解决我的具体问题的方法。我需要做的是将包含图像和CSS样式的HTML文件转换为PDF。我正在使用iText5,并且已经能够将样式包含到生成的PDF中。但是,包括图像在内,我还在挣扎。我在下面包含了我的代码。具有绝对路径的图像包含在生成的PDF中,具有相对路径的图像不包含在生成的PDF中。我知道我需要实现AbstractImageProvider,但我不知道如何实现。

  • 问题内容: 我试图从给定的字符串中获取HTML图像标签的url。应该有一些正则表达式来获取它。但是不知道该怎么做。谁可以帮我这个事。 例如 我只需要字符串中的 _http://xyz.com/par.jpg_ 问题答案: 请参阅此问题以供参考。基本上说使用:

  • 我试图生成一个. docx从超文本标记语言字符串与docx4j在Java,其中包含Base64图像里面。目前,我能够生成Word并下载它(在一个Vaadin项目内),但图像没有正确插入。但是,如果我把超文本标记语言代码放入index.html页面,它们确实显示正确! 我使用的代码是这样的: 有没有什么特别的工作应该做,而我没有做? 编辑: 我现在可以插入图片了!用以下代码替换行下方和行上方的代码:

  • 问题内容: 有机会将图像放置在六边形内吗?我已经习惯了html中的六边形形状的单元格,但是我无法用(背景图像)填充它。 这是我尝试过的: 问题答案: 使用CSS3,几乎一切皆有可能: 在那里,我使用进行了不同的旋转,因此您可以获得跨浏览器(很好,_现代的_跨浏览器)蒙版,该蒙版甚至可以在蒙版区域上覆盖和单击。

  • 问题内容: 我有一个包含HTML标记的字符串变量。该HTML标记基本上表示电子邮件内容。 现在,我想从该字符串内容创建一个图像,该图像实际上包含HTML标记。我不想通过将这些内容写入它们来创建HTML文件。我只想使用此字符串创建图像文件。 这是我所拥有的: 如何从该字符串内容创建图像? 问题答案: 感谢大家的回应。我使用HtmlRenderer外部dll(库)来实现相同目的,并在下面的代码中找到了

  • 我知道如何生成单个超文本标记语言页面。我想知道如何从多个超文本标记语言页面生成的pdf生成单个pdf页面。 例如,有和另一个文件我可以生成单独的pdf文件和分别来自html。我可以将它们写入文件系统,然后像iTextConcatenate示例中那样连接它们。 我只是想知道我是否可以在不将它们写入文件系统的情况下动态地组合此操作。我无法识别丢失的链接