使用reportlab在现有PDF上添加文本
我想要通过编程的方式填写现有的PDF表单。其实我只需要从用户输入中提取信息,然后把相应的文字放到现有PDF的合适位置上。我现在已经可以用reportlab做到这一点,就是把同一张纸放进打印机打印两次,但这样做让我感觉不太舒服。
我有点想要自己反向工程每个现有的PDF,自己画每一条线和每一个字符,然后再加上用户输入的文字,但我想先看看有没有更简单的方法,可以把现有的PDF设为背景,然后在上面加一些额外的文字。我更希望使用Python,因为这是我最熟悉的语言。
我也意识到我可以直接扫描文档,然后用生成的位图作为背景,但我更喜欢矢量图的精确度。
看起来 ReportLab有一个商业产品可以实现这个功能,而我想要的具体功能(copyPages)也在里面,但为了一个简单的功能而花费四位数的费用,感觉有点过于奢侈,尤其是我是在非营利的情况下使用。
3 个回答
2
如果你只是想在已经打印好的纸上添加一些文字, 你可以先把它扫描成一个jpg格式的图片,然后把这个jpg作为背景使用。 具体的做法可以参考reportlab手册的第15页,只需要调用drawImage这个函数就可以了。
5
如果你的PDF表单是真正的AcroForms,那么你可以使用iText来填写它们。我不确定除了iText(Java版,原版)和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();