使用Python向现有PDF添加文本

168 投票
9 回答
204306 浏览
提问于 2025-04-15 13:08

我想用Python在一个已有的PDF文件上添加一些额外的文字,最好的方法是什么?我需要安装哪些额外的模块呢?

注意:我希望这个方法能在Windows和Linux上都能运行,不过如果只能在Linux上也可以。

编辑:pypdfReportLab看起来不错,但这两个都不支持编辑已有的PDF,还有其他选择吗?

9 个回答

19

pdfrw 这个工具可以让你从已有的PDF文件中读取页面,然后把这些页面绘制到一个reportlab的画布上(就像在画布上画图像一样)。在pdfrw的examples/rl1子目录里,有一些相关的示例可以参考。需要说明的是:我是pdfrw的作者。

185

Python 2.7 的示例:


from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)

# create a new PDF with Reportlab
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = file("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

Python 3.x 的示例:


from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)

# create a new PDF with Reportlab
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(open("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.pages[0]
page.merge_page(new_pdf.pages[0])
output.add_page(page)
# finally, write "output" to a real file
output_stream = open("destination.pdf", "wb")
output.write(output_stream)
output_stream.close()
107

我知道这是一篇比较旧的帖子,但我花了很长时间寻找解决方案。最近我找到了一种不错的方法,只用到了ReportLab和PyPDF,所以想和大家分享一下:

  1. PdfFileReader() 读取你的PDF文件,我们称这个为 input
  2. 使用ReportLab创建一个新的PDF,里面包含你想添加的文本,并将其保存为一个字符串对象
  3. PdfFileReader() 读取这个字符串对象,我们称这个为 text
  4. 使用 PdfFileWriter() 创建一个新的PDF对象,我们称这个为 output
  5. 遍历 input,对每一页你想添加文本的页面使用 .mergePage(*text*.getPage(0)),然后用 output.addPage() 将修改后的页面添加到新的文档中

这个方法对于简单的文本添加效果很好。你可以查看PyPDF的示例,了解如何给文档添加水印。

下面是一些代码,来回答下面的问题:

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)

从这里你可以将输入文件的页面与另一个文档合并。

撰写回答