如何使用 Python 从 PDF 中删除文本

How to erase text from PDF using Python

我正在创建一个 python 脚本来编辑 PDF 中的文本。

我有这个 Python 代码,它允许我将文本添加到 PDF 文件的特定位置。

import PyPDF2
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import sys

packet = io.BytesIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
# Insert code into specific position
can.drawString(300, 115, "Hello world")
can.save()
#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PyPDF2.PdfFileReader(packet)
# read your existing PDF
existing_pdf = PyPDF2.PdfFileReader(open("original.pdf", "rb"))
num_pages = existing_pdf.numPages 
output = PyPDF2.PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(num_pages-1) # get the last page of the original pdf
page.mergePage(new_pdf.getPage(0)) # merges my created text with my PDF.
x = existing_pdf.getNumPages()
#add all pages from original pdf into output pdf
for n in range(x):
    output.addPage(existing_pdf.getPage(n))
# finally, write "output" to a real file
outputStream = open("output.pdf", "wb")
output.write(outputStream)
outputStream.close()

我的问题:我想用自定义文本替换原始 PDF 中特定位置的文本。一种写空白字符的方法可以解决问题,但我找不到任何方法可以做到这一点。

PS.: 它必须是 Python 代码,因为我需要将其部署为 .exe 文件,我只知道如何使用 Python 代码。

用于替换 PDF 中的文本的通用算法是一个难题。我并不是说它永远无法完成,因为我已经用 Adob​​e PDF 库演示了这样做,尽管它使用的是一个非常简单的输入文件,没有任何复杂性,但我不确定 pyPDF2 是否具有执行此操作所需的功能所以。在某种程度上,仅仅找到文本可能是一个挑战。

您(或者更实际地说,您的 PDF 库)必须解析页面内容并跟踪图形状态的变化,特别是在文本位于 Form XObject 中时对当前转换矩阵的更改,以及文本转换矩阵,以及字体的变化;您必须使用字体资源来获取字符宽度,以确定插入字符串后文本光标的位置。您可能需要处理 standard-14 字体,这些字体在其字体资源中不包含该信息(应用程序 - 您的程序 - 应该知道它们的指标)

毕竟,如果您不需要将 Tj 或 TJ(显示文本)指令分解成不同的部分,则删除文本很容易。防止文本 after 移动(如果需要的话)可能需要插入一个新的 Tm 指令以将文本 after 重新定位到它本来应该在的位置。

插入新文本可能具有挑战性。如果你想与正在使用的字体保持一致并且它是嵌入的和子集,它可能不一定包含你插入文本所需的字形。插入后,您必须决定是否需要重排插入文本之后的文本。

最后,您需要您的 PDF 库来保存所有更改。坦率地说,使用 Adob​​e Acrobat 的编辑功能可能比尝试从头开始编程更便宜、更具成本效益。

如果你想用 ReportLab 和 PyPDF2 做一个穷人的编辑, 您将使用 ReportLab 创建替换内容。 给定一个 Canvas,一个表示区域的矩形,一个文本字符串和一个将插入文本字符串的点,然后您将:

#set a fill color to white:
c.setFillColorRGB(1,1,1)
# draw a rectangle
c.rect([your rectangle], fill=1)
# change color
c.setFillColorRGB(0,0,0)
c.drawString([text insert position], [text string])

将您创建的此 PDF 文档保存到一个临时文件中。 使用 PyPDF2 的 PdfFileReader 打开此 PDF 文档和要修改的文档。创建一个 pdfFileWriter 对象,将其命名为 ModifiedDoc。获取临时 PDF 的第 0 页,将其称为 updatePage。获取其他文档的第 n 页,将其调用为 ModifyPage。

toModifyPage.mergePage(updatePage)

完成页面更新后:

modifiedDoc.cloneDocumentFromReader(srcDoc)
modifiedDoc.write(outStream)

同样,如果你走这条路,在原始文本被新内容覆盖之前,用户可能仍会看到原始文本,并且文本提取可能会提取该区域的原始文本和新文本,并且可能将它混合成一些难以理解的东西。