在 Python 中向现有 PDF 文档添加文本

Posted

技术标签:

【中文标题】在 Python 中向现有 PDF 文档添加文本【英文标题】:Add text to existing PDF document in Python 【发布时间】:2011-10-12 18:10:21 【问题描述】:

我正在尝试将 pdf 转换为与我的 pdf 相同的大小,这是一个 A4 页面。

convert my_pdf.pdf -density 300x300 -page A4 my_png.png

然而,生成的 png 文件是 595px × 842px,这应该是 72 dpi 的分辨率。 我正在考虑使用 PIL 在某些 pdf 字段上写一些文本并将其转换回 PDF。但目前图像显示错误。

编辑:我从错误的角度处理问题。正确的方法根本不包括 imagemagick。

【问题讨论】:

您正在将文本文件转换为图像文件以向其中写入文本以转换回混合图像/文本格式? 没有办法注释.pdf 或填写.pdf 表单的最佳方式。 你可能是对的。我似乎找不到在 python 中修改现有 pdf 的正确方法:/ Add text to Existing PDF using Python的可能重复 【参考方案1】:

经过一番搜索,我终于找到了解决方案: 事实证明,this 毕竟是正确的方法。 然而,我觉得它不够冗长。 看来张贴者可能是从here(相同的变量名等)那里获取的。

想法:使用仅包含文本字符串的 Reportlab 创建新的空白 PDF。 然后使用 pyPdf 将其合并/添加为水印。

from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(100,100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file("mypdf.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("/home/joe/newpdf.pdf", "wb")
output.write(outputStream)
outputStream.close()

希望这对其他人有所帮助。

【讨论】:

此解决方案已过时,需要更正。更正请参考***.com/questions/47573258/…【参考方案2】:

我刚刚尝试了上面的解决方案,但是在 Python3 中运行它时遇到了一些麻烦。所以,我想分享我的修改。修改后的代码如下:

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

packet = io.BytesIO()

# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(100, 100, "Hello world")
can.save()

# move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(open("mypdf.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page2 = new_pdf.getPage(0)
page.mergePage(page2)
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("newpdf.pdf", "wb")
output.write(outputStream)
outputStream.close()

现在 page.mergePage 会引发错误。原来是pypdf2中的移植错误。解决方法请参考这个问题:Porting to Python3: PyPDF2 mergePage() gives TypeError

【讨论】:

【参考方案3】:

您应该查看Add text to Existing PDF using Python 和Python as PDF Editing and Processing Framework。这些将为您指明正确的方向。

如果您按照问题中的建议进行操作,当您导出回.pdf 时,它实际上只是嵌入在.pdf 中的图像文件,而不是文本。

【讨论】:

我接受了您的回答,因为您让我重新阅读了该帖子(第一个链接)并导致了解决方案。谢谢。 我为你 +1 了,因为现在我有一个已知的工作脚本,当我需要自己执行此操作时:)【参考方案4】:

pdfrw 将允许您获取现有的 PDF 并将它们作为表单 XObject(类似于图像)放置在 reportlab 画布上。在 github 上的 pdfrw examples/rl1 子目录中有一些示例。免责声明——我是pdfrw作者。

【讨论】:

以上是关于在 Python 中向现有 PDF 文档添加文本的主要内容,如果未能解决你的问题,请参考以下文章

使用 iText 将命名目的地添加到现有 PDF 文档

在Python中向字典添加新项目[重复]

使用 itextsharp 在现有 pdf 中插入文本

如何在 Spark SQL 中向现有 Dataframe 添加新列

在迁移中向现有表添加新列

如何在 power bi 中向现有数据添加小计行