6

我有兴趣以编程方式填写现有的 PDF 表单。我真正需要做的就是从用户输入中提取信息,然后将适当的文本放在适当位置的现有 PDF 上。我已经可以通过将同一张纸送入打印机两次来使用reportlab 做到这一点,但这真的让我误会了。

在添加用户输入的文本之前,我很想亲自对每个现有的 PDF 进行逆向工程并自己绘制每一行和每个字符,但我想检查是否有一种简单的方法来获取现有的 PDF 并将其设置为一些额外文本的背景。我真的更喜欢使用 python,因为它是我唯一觉得舒服的语言。

我也意识到我可以只扫描文档本身并将生成的光栅图像用作背景,但我更喜欢矢量图的精度。

似乎ReportLab 有一个具有此功能的商业产品,而我正在寻找的特定功能就在其中(copyPages) - 但为非营利用途的单一、简单功能支付 4 位数产品似乎有点过头了.

4

3 回答 3

5

如果 PDF 表单是真正的AcroForms,您可以使用iText来填写它们。我不知道除了iText (java, original) 和iTextSharp (c#) 是否还有其他端口,但如果您不介意开源您的解决方案,它很容易使用和免费。您可以查看此示例代码或(java 片段):

String formFile = "/path/to/myform.pdf"
String newFile = "/path/to/output.pdf"
PdfReader reader = new PdfReader(formFile);
FileOutputStream outStream = new FileOutputStream(newFile);
PdfStamper stamper = new PdfStamper(reader, outStream);
AcroFields fields = stamper.getAcroFields();

// fill the form
fields.setField("name", "Shane");
fields.setField("url", "http://stackoverflow.com");

// PDF infos
HashMap<String, String> infoDoc = new HashMap<String, String>();
infoDoc.put("Title", "your title here");
infoDoc.put("Author", "JRE ;)");
stamper.setMoreInfo(infoDoc);

// Flatten the PDF & cleanup
stamper.setFormFlattening(true);
stamper.close();
reader.close();
outStream.close();
于 2010-04-26T04:31:56.623 回答
2

如果您只想在预印纸上添加一些文本。您可以将其扫描为 jpg,然后将此 jpg 作为背景。请参考reportlab手册的第15页,只需调用drawImage

于 2012-08-08T09:23:18.593 回答
0

听起来您只需将现有 PDF 放置在您正在生成的 Reportlab PDF 的背景中。免费的PDFRW库可以轻松做到这一点。查看示例工具页面,了解该技术的一些具体示例。

于 2011-09-11T23:40:23.353 回答