使用java创建复杂的pdf

时间:2013-01-04 05:03:19

标签: java pdf-generation itext

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

最简单方便的方法是什么?我试过了

  1. XSL转换为pdf
  2. 使用itext进行HTML到PDF的转换。
  3. 粗java方式(使用PDFWriter,PdfPCell等)
  4. 出于这些方法的最佳途径是什么,还是有其他方法更容易和方便?

6 个答案:

答案 0 :(得分:8)

当您谈论证书时,我认为标准表对于证书的每个接收者来说都是相同的,除了:

  • 接收者的姓名
  • 接收者所遵循的课程
  • 约会

如果是这种情况,我会使用任何工具,允许您创建一个花哨的证书(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节)。

答案 1 :(得分:1)

尝试使用Jasper Reports配合。请查看http://community.jaspersoft.com/

答案 2 :(得分:1)

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

答案 3 :(得分:1)

即使这是一个古老的问题,我认为应该回答。

创建非常复杂的pdf,例如证书,报告或付款单等。 您绝对可以使用动态报告库。这个库依赖于jasper报告(这也是非常受欢迎的旧库)。动态报告将使您能够使用Java代码设计文档,以便您可以根据需要轻松地进行操作或进行更改。

在他们的网站上有很多可用的例子,很容易从这些例子中学习。

以下是链接:

http://www.dynamicreports.org/

答案 4 :(得分: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创建模板。供占位符使用 文本框(查看>>工具栏>>表单控件)。根据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();
    }
    

答案 5 :(得分:0)

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

http://itextpdf.com/

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

开发人员可以使用iText:

将PDF投放到浏览器

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

使用PDF的许多互动功能

添加书签,页码,水印等

拆分,连接和操作PDF页面

自动填写PDF表格

将数字签名添加到PDF文件