我正在编写mailmerge软件作为Python Web应用程序的一部分。
我有一个名为letter.pdf
的模板,它是从MS Word文件生成的,包含居住者姓名所在的文本{name}。我还有一份c清单。 100名居民的名字。
我想要做的是阅读letter.pdf
搜索"{name}"
并将其替换为居民姓名(针对每位居民),然后将结果写入另一个pdf。然后我想把所有这些pdf聚集在一起,一个大的pdf(每个字母一页),我的网络应用程序的用户将打印出来创建他们的信件。
是否有任何Python库可以执行此操作?我看了看pdfrw和pdfminer,但我看不出他们能做到的地方。
(注意:我也有MS Word文件,所以如果有另一种使用不通过pdf的方式,那也可以完成这项工作。)
答案 0 :(得分:0)
这可以通过PyPDF2包来完成。该实现可能取决于原始的PDF模板结构。但是,如果模板足够稳定且不经常更改,则替换代码不应是通用的,而应是简单的。
我简要介绍了如何替换PDF file中的文本。它将所有出现的PDF
个令牌替换为DOC
。
import os
import argparse
from PyPDF2 import PdfFileReader, PdfFileWriter
def replace_text(content, replacements = dict()):
lines = content.splitlines()
result = ""
in_text = False
for line in lines:
if line == "BT":
in_text = True
elif line == "ET":
in_text = False
elif in_text:
cmd = line[-2:]
if cmd.lower() == 'tj':
replaced_line = line
for k, v in replacements.items():
replaced_line = replaced_line.replace(k, v)
result += replaced_line + "\n"
else:
result += line + "\n"
continue
result += line + "\n"
return result
def process_data(object, replacements):
data = object.getData()
decoded_data = data.decode('utf-8')
replaced_data = replace_text(decoded_data, replacements)
encoded_data = replaced_data.encode('utf-8')
if object.decodedSelf is not None:
object.decodedSelf.setData(encoded_data)
else:
object.setData(encoded_data)
if __name__ == "__main__":
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required=True, help="path to PDF document")
args = vars(ap.parse_args())
in_file = args["input"]
filename_base = in_file.replace(os.path.splitext(in_file)[1], "")
# Provide replacements list that you need here
replacements = { 'PDF': 'DOC'}
pdf = PdfFileReader(in_file)
writer = PdfFileWriter()
for page_number in range(0, pdf.getNumPages()):
page = pdf.getPage(page_number)
contents = page.getContents()
if len(contents) > 0:
for obj in contents:
streamObj = obj.getObject()
process_data(streamObj, replacements)
else:
process_data(contents, replacements)
writer.addPage(page)
with open(filename_base + ".result.pdf", 'wb') as out_file:
writer.write(out_file)
结果是