【发布时间】:2018-10-15 08:05:52
【问题描述】:
我在 primefaces 中有一个 p:editor,用户在其中粘贴具有一些电子邮件模板的 word 文档并将其保存在数据库中。
现在我需要将此内容转换为 pdf。但我从 DB 返回的是该 word 文档的 HTML 转换。
在使用 iText 解析此 HTML 内容时,由于如下所示的无效 xhtml,我遇到了很多错误
<span style="font-family: Arial, Verdana; font-size: 13.3333px;"><img src="9#credit_cards_logos#9"></span>
使用上面的 sn-p,我收到错误 invalid span 标签。预期结束 img 标签。当我删除 img 周围的 span 标签时,它工作正常。
现在这样的错误到处都是。而且不可能手动修复所有这些,因为它是一个巨大的模板(有 100 多个模板。)
这是我用来解析它的函数。
public StreamedContent getFile() throws IOException, DocumentException{
final PortletResponse portletResponse = (PortletResponse) FacesContext.getCurrentInstance().getExternalContext()
.getResponse();
final HttpServletResponse res = PortalUtil.getHttpServletResponse(portletResponse);
res.setContentType("application/pdf");
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
res.setHeader("Content-Disposition", "attachment; filename=" + subject + ".pdf");
res.setHeader("Refresh", "1");
res.flushBuffer();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream out = res.getOutputStream();
Document document = new Document(PageSize.LETTER);
PdfWriter pdfWriter =PdfWriter.getInstance(document, baos);
document.open();
document.addCreationDate();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
//htmlWorker.parse(new StringReader(getMessage()));
worker.parseXHtml(pdfWriter, document, new StringReader(getMessage()));
document.close();
baos.writeTo(out);
out.flush();
out.close();
return null;
}
有解决办法吗?
编辑____________
primefaces 中是否有类似 p:dataExporter(only for datatables) 的东西,可以将内容转换为 pdf 而无需解析 HTML。
【问题讨论】:
-
您正在使用带有 XMLWorker 的旧 iText 5。 XMLWorker 需要 100% 有效的 HTML,因此您需要在将 HTML 提供给 XMLWorker 之前清理它。您可以使用 JSoup 或 JTidy 之类的东西。替代方案是 iText 7 + pdfHTML,它可以更好地处理无效 HTML。
-
同一个问题你问了两次:stackoverflow.com/questions/52809656/…
-
非常感谢阿梅迪。我会检查一下。
-
在我对您的问题stackoverflow.com/questions/52773998/… 的评论中,我已经建议切换到 iText 7 + pdfHTML。
-
视情况而定。您自己的软件是否在 AGPL 许可下开源?那么您已经获得使用 iText 的许可。您的软件是否根据与 AGPL 不兼容的许可(例如商业许可)分发?然后你需要购买 iText 的商业许可。
标签: primefaces itext