我想将一个对象的详细信息提取到PDF文件中,并希望在该导出的PDF文件中有一个工具来修改/编辑数据。
例如:尝试以一些非常特定的格式将学生对象详细信息导出为PDF,例如第一行中的显示名称,第二行中的年龄等,一旦导出数据,我也应该能够编辑它(比如更改检索到的内容)年龄)。
最初我想在这个应用程序中创建一个GUI,它显示数据,用户可以在执行打印,邮件等任何操作之前进行编辑,但希望避免这种GUI创建并直接处理导出的PDF。
我对这个领域很新,并尝试使用谷歌搜索,但找不到一个正确的解决方案。
问题中的对象是一个java对象,我试图在PDF文件中查看这个java对象的详细信息。
任何指针都会对我有很大的帮助。
答案 0 :(得分:1)
您尝试做的事情是将Java对象序列化和反序列化为PDF表单。这很简单,但这不是一件小事。
忽略XFA,在PDF格式中,表单是字段的分层树。树中的节点具有名称,可能也具有将向下投影的值(例如字段类型或默认值)。叶子都由小部件注释表示。
PDF中的主要字段类型是:
从那里可以直接映射以下类型:
可以执行更复杂的类型,例如Date,但是没有本机支持,您需要依赖来自Adobe的未记录的js库。
如果你的类型不超过这个,那么它是可行的。 iText和JoltImage都可以作为后端,但是你需要对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)