我有一个基于 Java/Java EE 的应用程序,其中我需要为将提供给用户的各种服务创建 PDF 证书。我正在寻找一种创建 PDF 的方法(目前不需要数字证书)。
这样做最简单方便的方法是什么?我努力了
- XSL 到 pdf 的转换
- 使用 itext 将 HTML 转换为 PDF。
- 粗略的java方式(使用PDFWriter、PdfPCell等)
摆脱这些的最好方法是什么,或者有没有其他更容易和方便的方法?
我有一个基于 Java/Java EE 的应用程序,其中我需要为将提供给用户的各种服务创建 PDF 证书。我正在寻找一种创建 PDF 的方法(目前不需要数字证书)。
这样做最简单方便的方法是什么?我努力了
摆脱这些的最好方法是什么,或者有没有其他更容易和方便的方法?
当您谈论证书时,我会想到对于证书的每个接收者来说看起来都相同的标准表,除了:
如果是这种情况,我会使用任何允许您创建精美证书(Acrobat、Open Office、Adobe InDesign 等)并创建包含三个字段的静态表单(有时称为 AcroForm)的工具:名称, 当然, 日期。
然后,我将使用 iText 填写如下字段:
PdfReader reader = new PdfReader(pathToCertificateTemplate);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(pathToCertificate));
AcroFields form = stamper.getAcroFields();
form.setField("name", name);
form.setField("course", course);
form.setField("date", date);
stamper.setFormFlattening(true);
stamper.close();
reader.close();
从代码创建这样的证书是“艰难的方式”;从 XML 创建这样的证书是“痛苦的”(因为 XML 不太适合定义布局),使用 iText 的 XML Worker 可以从(HTML + CSS)创建证书,但所有这些解决方案都有缺点很难正确定位每个项目,以确保所有内容都适合同一页面,等等......
维护具有固定字段的模板要容易得多。这样,您只需编写一次代码。如果由于某种原因您想将字段移动到另一个地方,您只需更改模板,您不必担心代码、XML、HTML 或 CSS 乱七八糟。
有关更多信息,请参阅http://www.manning.com/lowagie2/samplechapter6.pdf (第 6.3.5 节)。
尝试使用 Jasper Reports 伴侣。在http://community.jaspersoft.com/上查看
我推荐第一种方法:XSL到pdf的转换,这是最强大的。我有使用Apache FOP优雅地生成大量 PDF 报告(每个都有数千页)的经验,我认为它已经足够好并且相当容易(但它需要一些xsl-FO知识)。
Bruno Lowagie 指出了一种生成模板的好方法,该模板对于所有数据基本上都是相同的,并且需要填充。但是,Bruno Lowagie 建议使用 iText 作为库来填充字段。对我来说,就像 Ankit 一样,这个许可证是我不得不选择另一个库的一个问题。在下文中,我有一个分步指南如何使用 Apaches PdfBox 创建模板并用数据填充它
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.16</version>
</dependency>
使用 LibreOffice Writer 创建模板。对于占位符,请使用 TextBoxes(查看 >> 工具栏 >> 表单控件)。这将按照 Bruno Lowagie 的建议使用 AcroForms 创建 PDF
为每个文本框设置一个名称。将只读设置为 true。
将文档另存为 PDF。
使用 PdfBox 阅读 PDF 模板并设置文本框的值。
InputStream is = getClass().getClassLoader().getResourceAsStream("Template.pdf");
try {
PDDocument pDDocument = PDDocument.load(is);
PDAcroForm pDAcroForm = pDDocument.getDocumentCatalog().getAcroForm();
PDField fieldName = pDAcroForm.getField("name");
fieldName.setValue("FirstName Surname"); // <-- Replacement
pDDocument.save(outStream);
pDDocument.close();
} catch (IOException e) {
e.printStackTrace();
}
尽管这是一个老问题,但我认为它应该被回答。
要创建非常复杂的 pdf,例如证书、报告或付款单等。您绝对可以使用 Dynamic Reports 库。这个库依赖于 jasper 报告(这也是非常流行的老库)。动态报告将为您提供使用 java 代码设计文档的功能,以便您可以根据需要轻松操作或进行更改。
他们的网站上有很多示例,并且很容易从这些示例中学习。
下面是它的链接:
使用 iText pdf 库创建 pdf 您可以轻松地从该 api 生成 pdf。链接在这里
Text ® 是一个允许您创建和操作 PDF 文档的库。它使希望通过动态 PDF 文档生成和/或操作来增强 Web 和其他应用程序的开发人员。
开发人员可以使用 iText 来:
将 PDF 提供给浏览器
从 XML 文件或数据库生成动态文档
使用 PDF 的许多交互功能
添加书签、页码、水印等。
拆分、连接和操作 PDF 页面
自动填写 PDF 表单
将数字签名添加到 PDF 文件
您提到 PDF 可能很复杂。如果这与可变性或布局有关,提供相当复杂的基于模板的布局和控件的一个选项是Docmosis。您为 Docmosis 提供 doc 或 odt 文件作为模板,因此它们很容易更改,并且调用 Docmosis 到邮件合并以创建 pdf 或其他格式。请不要我为创建 Docmosis 的公司工作。
希望有帮助。