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

时间:2014-02-18 12:26:38

标签: java pdf itext velocity xdocreport

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

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

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

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

3 个答案:

答案 0 :(得分:5)

是的,你可以。 这一切都取决于你想要PDF的复杂程度。

以下是基本功能的步骤

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

答案 1 :(得分:4)

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

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

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

XDocReport能够通过合并包含一些Velocity / Freemarker语法和Java上下文的docx / odt模板来生成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内容为value。
  2. 为每个必须与Java上下文合并的xml条目循环。例如,使用Velocity将word / document.xml与Java上下文合并,并使用merge的结果替换map的word / document.xml值
  3. 通过压缩地图的每个条目来重建新的docx。
  4. 在此步骤中,我们有一个生成的docx(报告)。

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

    1. 使用Apache POI加载docx
    2. 为POI(XWPFParagraph等)的每个结构循环以创建iText结构(iText段落)。
    3. 请注意,XDocReport是模块化的,您也可以使用其他转换器。

答案 2 :(得分:0)

首先,我们使用freemarker模板生成一个html文件,然后通过IItextRender将html渲染为pdf文件。最后,我们可以在浏览器中查看pdf文件,有一个非常有用的javascript工具叫做pdfjs。也许你可以尝试一下。