【问题标题】:ColumnText and HTML with Image Base64 tagColumnText 和带有 Image Base64 标签的 HTML
【发布时间】:2023-05-26 21:56:01
【问题描述】:

我正在使用this example 来显示 HTML Header 和 HTML Footer。

但是当html中有图片元素时(base64)就不行了。

我试过another example。但这并没有使用 ColumnText。

我尝试添加

htmlContext.setImageProvider(new Base64ImageProvider());

TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();
htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);
htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(), HTML.Tag.IMG);

但没有一次尝试成功。

【问题讨论】:

    标签: base64 itext html-to-pdf


    【解决方案1】:

    我设法让它工作。但与表。这样base64图像就会出现在PDF文档中

        //CSS
        CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
    
        // HTML
        TagProcessorFactory htmlTagProcessorFactory = Tags.getHtmlTagProcessorFactory();
        //htmlTagProcessorFactory.removeProcessor(HTML.Tag.IMG);
        //htmlTagProcessorFactory.addProcessor(new ImageTagProcessor(), HTML.Tag.IMG);
    
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        htmlContext.setTagFactory(htmlTagProcessorFactory);
        htmlContext.setImageProvider(new Base64ImageProvider());
    
        // Pipelines
        ElementList elements = new ElementList();
        ElementHandlerPipeline end = new ElementHandlerPipeline(elements, (Pipeline) null);
    
        HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, htmlPipeline);
    
        // XML Worker
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser p = new XMLParser(worker);
        p.parse(new ByteArrayInputStream(html.getBytes()));
    
        PdfPTable table = new PdfPTable(1);
    
        PdfPCell cell = new PdfPCell();
        cell.setPadding(0);
        cell.setUseBorderPadding(false);
        cell.setBorder(0);
    
        for (Element e : elements) {
            cell.addElement(e);
        }
    
        table.addCell(cell);
    
        // Adding a table at an absolute position
        table.writeSelectedRows(0, -1, x, y, writer.getDirectContent());
    

    【讨论】:

      【解决方案2】:

      使用您所做的相同示例,我不需要表格,只需要 ColumnText。您只需将每个元素添加到底部显示的 ColumnText 对象。

          // step 3
          document.open();
          // step 4
          PdfContentByte canvas = writer.getDirectContent();
          ColumnText ct = new ColumnText(canvas);
          int side_of_the_page = 0;
          ct.setSimpleColumn(COLUMNS[side_of_the_page]);
          ct.setIgnoreSpacingBefore(false);
      
         // CSS
         CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
      
         // ELEMENT
         ElementList elements = new ElementList();
         ElementHandlerPipeline end = new ElementHandlerPipeline(elements, (Pipeline) null);
      
         // HTML
         HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
         htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
         htmlContext.setImageProvider(new Base64ImageProvider());
      
         // Pipelines
         HtmlPipeline html = new HtmlPipeline(htmlContext, end);
         CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
      
         // XML Worker
         XMLWorker worker = new XMLWorker(css, true);
         XMLParser p = new XMLParser(worker);
         p.parse(new ByteArrayInputStream(HTML.getBytes()));
      
         for (Element element : elements) {
               ct.addElement(element);
         }
      
         // step 5
         document.close();
      

      【讨论】: