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

时间:2017-07-17 12:26:19

标签: python pdf reportlab pypdf2

我正在创建一个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代码执行此操作。

2 个答案:

答案 0 :(得分:2)

用于替换PDF中的文本的通用算法是一个难题。我并不是说它无法完成,因为我已经使用Adobe PDF库进行了演示,尽管输入文件非常简单且没有任何复杂性,但我不确定pyPDF2是否具备所需的设施所以。在某种程度上,只是找到文本可能是一个挑战。

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

毕竟,如果您不需要将Tj或TJ(显示文本)指令分解为不同的部分,则删除文本很容易。在移位后防止文本,如果这是所希望的,可能需要插入新的Tm指令以将文本重新定位到原来的位置。

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

最后,您将需要PDF库来保存所有更改。坦率地说,使用Adobe Acrobat的Redaction功能可能比尝试从头开始编程更便宜,更经济有效。

答案 1 :(得分:1)

如果你想用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,将其调用toModifyPage。

toModifyPage.mergePage(updatePage)
完成页面更新后

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

同样,如果你走这条路线,用户可能在它被新内容掩盖之前仍然可以看到原始文本,文本提取可能会拉出该区域的原始文本和新文本,并可能混合它无法理解的事情。