在PDF Java中创建表单数据

时间:2015-05-19 12:41:26

标签: java pdf

我想将一个对象的详细信息提取到PDF文件中,并希望在该导出的PDF文件中有一个工具来修改/编辑数据。

例如:尝试以一些非常特定的格式将学生对象详细信息导出为PDF,例如第一行中的显示名称,第二行中的年龄等,一旦导出数据,我也应该能够编辑它(比如更改检索到的内容)年龄)。

最初我想在这个应用程序中创建一个GUI,它显示数据,用户可以在执行打印,邮件等任何操作之前进行编辑,但希望避免这种GUI创建并直接处理导出的PDF。

我对这个领域很新,并尝试使用谷歌搜索,但找不到一个正确的解决方案。

问题中的对象是一个java对象,我试图在PDF文件中查看这个java对象的详细信息。

任何指针都会对我有很大的帮助。

3 个答案:

答案 0 :(得分:1)

您尝试做的事情是将Java对象序列化和反序列化为PDF表单。这很简单,但这不是一件小事。

忽略XFA,在PDF格式中,表单是字段的分层树。树中的节点具有名称,可能也具有将向下投影的值(例如字段类型或默认值)。叶子都由小部件注释表示。

PDF中的主要字段类型是:

  • 文本
  • 按钮
  • 选择
  • 签名

从那里可以直接映射以下类型:

  • 数字
  • 布尔
  • 字符串
  • 枚举
  • EnumSet

可以执行更复杂的类型,例如Date,但是没有本机支持,您需要依赖来自Adobe的未记录的js库。

如果你的类型不超过这个,那么它是可行的。 iTextJoltImage都可以作为后端,但是你需要对PDF有相当好的理解才能使用iText,至少对JoltImage有一个基本的了解。例如,要在JoltImage中创建一组单选按钮,您可以执行以下操作:

    // make a document
    PdfGeneratedDocument doc = new PdfGeneratedDocument();
    // add a form
    doc.setForm(new PdfForm());
    // make a page
    PdfGeneratedPage page = doc.addPage(PdfDefaultPages.letter());
    // create a font resource
    String font = doc.getResources().getFonts().addFromFontName("Arial");

    String[] values = new String[] { "Yes", "No", "Undecided" };
    PdfBounds[] bounds = new PdfBounds[] {
        new PdfBounds(72, 700, 12, 12),
        new PdfBounds(72, 680, 12, 12),
        new PdfBounds(72, 660, 12, 12)
    };
    // a RadioButtonFormField is a hierarchy of a parent field with a child
    // RadioButtonWidgetAnnotation for each choice.
    // This call, in addition to making all the fields will add the
    // annotations to the page supplied.
    RadioButtonFormField ff = RadioButtonFormField.makeRadioSet(doc.getResources(), page, "Choice", values[0], values[0],
        values, bounds);

    // Add the parent field to the form tree
    doc.getForm().getFields().add(ff);

    // add labels onto the page.
    // labels are not typically part of the widget annotation.
    for (int i = 0; i < values.length; i++)
    {
        page.getDrawingList().add(new PdfTextLine(font, 12, values[i], new PdfPoint(bounds[i].getRight() + 4, bounds[i].getBottom())));
    }
    doc.save("radiobuttons.pdf");

答案 1 :(得分:1)

下载Chapter6 of my book并阅读第6.3.5节中有关使用OpenOffice(或LibreOffice)创建表单的部分。这是您为学生"name"'age"等定义字段的模板。

一旦您拥有包含"name""age"字段的此模板,您就可以使用iText填写此表单,如下所示:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader,
            new FileOutputStream(dest));
    AcroFields fields = stamper.getAcroFields();
    fields.setField("student", "Anil Pradhan");
    fields.setField("age", "25");
    stamper.close();
    reader.close();
}

在此示例中,src是空模板的路径,dest是新填写的表单的路径。

如果您有dest,还可以通过编程方式检索字段的内容。例如:

PdfReader reader = new PdfReader(src);
AcroFields fields = reader.getAcroFields();
String name = fields.getField("name");
String age = fields.getField("age");

这很简单。您可以找到更多示例here,并确保下载免费电子书The Best iText Questions on StackOverflow以了解有关其他选项的更多信息。

答案 2 :(得分:0)

你看过Jasper Reports:

Jasper Reports Library

使用此库,您可以定义PDF的模板,您可以决定放置所需信息的位置和位置。我已经使用过了,它可以很好地生成报告。