【问题标题】:Add HTML to iText document in memory using XHTMLrenderer (FlyingSaucer)使用 XHTMLrenderer (FlyingSaucer) 将 HTML 添加到内存中的 iText 文档
【发布时间】:2023-04-03 11:58:02
【问题描述】:

我正在使用 iText 2.1.7 从数据库生成文档。我需要添加的字段之一是 XHTML 格式。我可以使用 HTMLWorker 类来生成 HTML,但这有点受限。

我使用以下代码将其转换为 XHTML:

String url = chapterDesc.getString("description").toString(); // get the HTML string from the database
org.w3c.dom.Document doc = XMLResource.load(new ByteArrayInputStream(url.getBytes())).getDocument();

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null);
ByteArrayOutputStream os = new ByteArrayOutputStream();
renderer.layout();
renderer.createPDF(os);

我想将此信息添加到内存中的文档中。这可能吗?

我需要使用 PdfStamper 吗?我相信这需要关闭文件?如果可能的话,我想避免使用多次传递来添加这些描述。

【问题讨论】:

    标签: java itext flying-saucer xhtmlrenderer


    【解决方案1】:

    飞碟不能与 2.0.8 以外的任何版本的 iText 一起正常工作。此外,由于您的意思是在内存中创建 pdf,您使用的是 JSF、JSP 还是 servlet?如果您不是,您可以使用类似

    的内容在其中一个页面上发送您的ByteArrayOutputStream作为回复
    response.setContentType("application/pdf");
    response.setContentLength(os.size());
    os.writeTo(response.getOutputStream());
    response.flushBuffer();
    

    【讨论】:

      【解决方案2】:

      我知道你问这个问题已经两年多了,但我也面临同样的问题。我用谷歌搜索了一个解决方案,显然没有任何地方可以找到。所以我必须开发自己的,我想我不妨分享一下。希望它对某人有用。

      我尝试像你一样使用飞碟,但它对我不起作用。我的 HTML 只是一个简单的表格,因此我可以使用 iText HTMLWorker 进行解析。

      所以首先我按照你的建议得到一个 PdfStamper。

      PdfReader template = new PdfReader(templateFileName);
      PdfStamper editablePage = new PdfStamper(template, reportOutStream);
      

      然后我处理文档(填写字段,插入一些图像),然后我需要插入一个 HTML sn-p。

      //getting a 'canvas' to add parsed elements
      final ColumnText page = new ColumnText(editablePage.getOverContent(pageNumber)); 
      //finding out the page sizefinal 
      Rectangle pagesize = editablePage.getReader().getPageSize(pageNumber);     
      //you can define any size here, that will be where your parsed elements will be added
      page.setSimpleColumn(0, 0, pagesize.getWidth(), pagesize.getHeight()); 
      

      如果你需要简单的样式,HTMLWorker 可以做一些

      StyleSheet styles = new StyleSheet();
      styles.loadStyle("h1", "color", "#008080");
      
      //parsing
      List<Element> parsedTags = HTMLWorker.parseToList(new StringReader(htmlSnippet), styles); 
      for (Element tag : parsedTags)
      {       
        page.addElement(tag);
        page.go();
      }
      

      这些只是如何做到这一点的一些基本想法,希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 2012-01-13
        • 1970-01-01
        • 2020-07-28
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多