使用reportlab在现有PDF上添加文本

时间:2010-04-26 04:03:46

标签: python pdf pdf-generation reportlab

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

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

我也意识到我可以直接扫描文档并使用生成的光栅图像作为背景,但我更喜欢矢量图形的精度。

好像是ReportLab has a commercial product with this functionality,而我正在寻找的具体功能就在其中(copyPages) - 但是为一个非营利性使用的单个简单功能支付一个4位数的产品似乎有点过头了。

3 个答案:

答案 0 :(得分:5)

如果PDF表单是真实的AcroForms,您可以使用iText填写它们。我不知道是否还有其他端口而不是iText(java,original)和iTextSharp(c#),但如果您不介意开源解决方案,它很容易使用和免费。您可以查看此sample code或(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();

答案 1 :(得分:2)

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

答案 2 :(得分:0)

听起来您只需将现有PDF放在正在生成的Reportlab PDF的背景中。免费PDFRW库可以轻松完成此操作。有关此技术的一些具体示例,请查看Example Tools page

相关问题