5

我有一个基于 Java/Java EE 的应用程序,其中我需要为将提供给用户的各种服务创建 PDF 证书。我正在寻找一种创建 PDF 的方法(目前不需要数字证书)。

这样做最简单方便的方法是什么?我努力了

  1. XSL 到 pdf 的转换
  2. 使用 itext 将 HTML 转换为 PDF。
  3. 粗略的java方式(使用PDFWriter、PdfPCell等)

摆脱这些的最好方法是什么,或者有没有其他更容易和方便的方法?

4

7 回答 7

11

当您谈论证书时,我会想到对于证书的每个接收者来说看起来都相同的标准表,除了:

  • 收件人姓名
  • 接收者所遵循的课程
  • 一个约会

如果是这种情况,我会使用任何允许您创建精美证书(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 节)。

于 2013-01-04T09:27:30.643 回答
1

尝试使用 Jasper Reports 伴侣。在http://community.jaspersoft.com/上查看

于 2013-01-04T05:08:22.493 回答
1

我推荐第一种方法:XSL到pdf的转换,这是最强大的。我有使用Apache FOP优雅地生成大量 PDF 报告(每个都有数千页)的经验,我认为它已经足够好并且相当容易(但它需要一些xsl-FO知识)。

于 2013-01-04T05:12:04.787 回答
1

Bruno Lowagie 指出了一种生成模板的好方法,该模板对于所有数据基本上都是相同的,并且需要填充。但是,Bruno Lowagie 建议使用 iText 作为库来填充字段。对我来说,就像 Ankit 一样,这个许可证是我不得不选择另一个库的一个问题。在下文中,我有一个分步指南如何使用 Apaches PdfBox 创建模板并用数据填充它

    <dependency>
        <groupId>org.apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.16</version>
    </dependency>
  1. 使用 LibreOffice Writer 创建模板。对于占位符,请使用 TextBoxes(查看 >> 工具栏 >> 表单控件)。这将按照 Bruno Lowagie 的建议使用 AcroForms 创建 PDF

  2. 为每个文本框设置一个名称。将只读设置为 true。

  3. 将文档另存为 PDF。

  4. 使用 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();
    }
    
于 2020-11-07T10:56:56.317 回答
1

尽管这是一个老问题,但我认为它应该被回答。

要创建非常复杂的 pdf,例如证书、报告或付款单等。您绝对可以使用 Dynamic Reports 库。这个库依赖于 jasper 报告(这也是非常流行的老库)。动态报告将为您提供使用 java 代码设计文档的功能,以便您可以根据需要轻松操作或进行更改。

他们的网站上有很多示例,并且很容易从这些示例中学习。

下面是它的链接:

http://www.dynamicreports.org/

于 2017-09-18T12:39:53.500 回答
0

使用 iText pdf 库创建 pdf 您可以轻松地从该 api 生成 pdf。链接在这里

http://itextpdf.com/

Text ® 是一个允许您创建和操作 PDF 文档的库。它使希望通过动态 PDF 文档生成和/或操作来增强 Web 和其他应用程序的开发人员。

开发人员可以使用 iText 来:

将 PDF 提供给浏览器

从 XML 文件或数据库生成动态文档

使用 PDF 的许多交互功能

添加书签、页码、水印等。

拆分、连接和操作 PDF 页面

自动填写 PDF 表单

将数字签名添加到 PDF 文件

于 2013-01-04T05:08:16.917 回答
0

您提到 PDF 可能很复杂。如果这与可变性或布局有关,提供相当复杂的基于模板的布局和控件的一个选项是Docmosis。您为 Docmosis 提供 doc 或 odt 文件作为模板,因此它们很容易更改,并且调用 Docmosis 到邮件合并以创建 pdf 或其他格式。请不要我为创建 Docmosis 的公司工作。

希望有帮助。

于 2013-02-26T00:20:22.337 回答