使用Python向现有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,所以想和大家分享一下:
- 用
PdfFileReader()
读取你的PDF文件,我们称这个为 input - 使用ReportLab创建一个新的PDF,里面包含你想添加的文本,并将其保存为一个字符串对象
- 用
PdfFileReader()
读取这个字符串对象,我们称这个为 text - 使用
PdfFileWriter()
创建一个新的PDF对象,我们称这个为 output - 遍历 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)
从这里你可以将输入文件的页面与另一个文档合并。