gpt4 book ai didi

python - 在 Python 中搜索和替换 pdf 中的文本

转载 作者:行者123 更新时间:2023-12-03 23:19:18 32 4
gpt4 key购买 nike

我正在编写邮件合并软件作为 Python Web 应用程序的一部分。

我有一个模板叫 letter.pdf它是从 MS Word 文件生成的,包括居民姓名所在的文本 {name}。我也有一个 c 的列表。 100个居民的名字。

我想做的是阅读letter.pdf搜索 "{name}"并将其替换为居民的姓名(对于每个居民),然后将结果写入另一个 pdf。然后我想将所有这些 pdf 收集在一起,而不是一个大的 pdf(每封信一页),我的网络应用程序的用户将打印出来以创建他们的信件。

是否有任何 Python 库可以做到这一点?我已经看过了 pdfrw 和 pdfminer,但我看不出他们在哪里可以做到。

(注意:我也有 MS Word 文件,所以如果有另一种使用方式而不是通过 pdf,那也可以完成这项工作。)

最佳答案

这可以通过 PyPDF2 包来完成。实现可能取决于原始 PDF 模板结构。但是,如果模板足够稳定并且不经常更改,则替换代码不应该是通用的,而应该是简单的。
我做了一个关于如何替换 PDF file 中的文本的小草图。 .它替换所有出现的 PDF token 到 DOC .

import os
import argparse
from PyPDF2 import PdfFileReader, PdfFileWriter
from PyPDF2.generic import DecodedStreamObject, EncodedStreamObject


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 isinstance(contents, DecodedStreamObject) or isinstance(contents, EncodedStreamObject):
process_data(contents, replacements)
elif len(contents) > 0:
for obj in contents:
if isinstance(obj, DecodedStreamObject) or isinstance(obj, EncodedStreamObject):
streamObj = obj.getObject()
process_data(streamObj, replacements)

writer.addPage(page)

with open(filename_base + ".result.pdf", 'wb') as out_file:
writer.write(out_file)
结果是
Original PDF
Replaced PDF
更新 2021-03-21:
更新了代码示例以处理 DecodedStreamObjectEncodedStreamObject它实际上包含要更新的文本的数据流。

关于python - 在 Python 中搜索和替换 pdf 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769120/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com