使用Python在现有PDF文档中添加文本

时间:2011-07-25 16:30:45

标签: python pdf-generation imagemagick

我正在尝试将pdf转换为与我的pdf(A4页面)相同的大小。

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

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

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

4 个答案:

答案 0 :(得分:28)

在搜索了一些后,我终于找到了解决方案: 事实证明,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()

希望这有助于其他人。

答案 1 :(得分:8)

我刚试过上面的解决方案,但是我在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

答案 2 :(得分:3)

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

如果您执行了问题中的建议,当您导出回.pdf时,它实际上只是嵌入在.pdf中的图像文件,它不会是文本。

答案 3 :(得分:2)

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

相关问题