使用iText和apache velocity template(.vm)生成PDF文件

Tec*_*rat 3 java pdf velocity itext xdocreport

在Java中使用iText和Apache Velocity模板文件(.vm)生成PDF的一般工作流程是什么?

我有兴趣知道以下步骤:解析模板文件,将Java对象置于上下文中以及执行生成pdf等的步骤.

我知道这是一个非常基本的问题.但我无法在网上找到这种类型的单一例子.我找到了XDocReport,但我也有兴趣了解其他替代方案.

请帮我一些示例项目链接或至少开始的步骤.

小智 5

是的你可以.这一切都取决于您希望PDF的复杂程度.

以下是基本功能的步骤

  1. 使用Apache Velocity模板文件(.vm)生成HTML文件.
  2. 使用com.itextpdf.text.html.simpleparser.HTMLWorker(不建议使用)将该HTML文件解析/转换为PDF.
  3. 此外,您还可以使用com.itextpdf.text.pdf.PdfCopy.PageStamp向现有PDF添加内容(边框,图章,注释,注释等).

还有com.itextpdf.tool.xml.XMLWorker更高级的HTML转换(添加样式表等)


Ang*_*elo 4

在 Java 中直接使用 iText 和 Apache Velocity 模板文件 (.vm) 生成 PDF 是不可能的,因为:

  • PDF是二进制格式,
  • Velocity 生成纯文本内容。

换句话说,Velocity 无法生成 PDF。

XDocReport 能够通过将包含一些 Velocity/Freemarker 语法的 docx/odt 模板与 Java 上下文合并来生成 docx/odt 报告。生成的 docx/odt 报告可以转换为 pdf/xhtml。

它之所以有效,是因为 docx/odt 是一个包含多个 xml 条目的 zip 文件。如果解压 docx,您将看到 word/document.xml。在此条目中,您将看到使用 MS Word 输入的内容。word/document.xml 是纯文本,因此在这种情况下可以使用 Velocity。

这里是使用 Velocity 从 docx 模板生成 pdf 的 XDocReport 过程:

  1. 加载 docx 模板。此步骤包括解压缩 docx 并将每个 xml 条目存储在映射中(名称条目作为键,字节数组作为值)。例如,map 包含一个带有 word/document.xml 的键,并且该条目的 xml 内容作为值。
  2. 循环每个必须与 Java 上下文合并的 xml 条目。例如,使用 Velocity 将 word/document.xml 与 Java 上下文合并,合并结果替换映射的 word/document.xml 值
  3. 通过压缩地图的每个条目来重建新的 docx。

在此步骤中,我们生成了一个 docx(报告)。

为了将其转换为其他格式,XDocReport 提供了一个基于 Apache POI 和 iText 的 docx-to-pdf 转换器。这里是 XDocReport 将 docx 转换为 pdf 的过程:

  1. 使用 Apache POI 加载 docx
  2. 循环POI的每个结构(XWPFParagraph等)以创建iText结构(iText Paragraph)。

请注意,XDocReport 是模块化的,您也可以使用其他转换器。