使用Python向现有PDF添加文本
我需要使用Python向现有PDF添加一些额外的文本,最好的方法是什么,需要安装哪些额外的模块 注意:理想情况下,我希望能够在Windows和Linux上运行此功能,但在推送时,只有Linux可以使用Python向现有PDF添加文本,python,pdf,Python,Pdf,我需要使用Python向现有PDF添加一些额外的文本,最好的方法是什么,需要安装哪些额外的模块 注意:理想情况下,我希望能够在Windows和Linux上运行此功能,但在推送时,只有Linux可以 编辑:看起来不错,但两个都不允许我编辑现有的PDF,还有其他选项吗?您可能会更幸运地将问题分解为将PDF转换为可编辑格式,编写更改,然后将其转换回PDF。我不知道有哪一个库可以让你直接编辑PDF,但例如,在文档和PDF之间有很多转换器。如果你在Windows上,这可能会起作用: 还有一份关于Pyth
编辑:看起来不错,但两个都不允许我编辑现有的PDF,还有其他选项吗?您可能会更幸运地将问题分解为将PDF转换为可编辑格式,编写更改,然后将其转换回PDF。我不知道有哪一个库可以让你直接编辑PDF,但例如,在文档和PDF之间有很多转换器。如果你在Windows上,这可能会起作用: 还有一份关于Python中PDF创建和编辑框架的白皮书。虽然有点过时,但也许可以给你一些有用的信息:
我知道这是一篇老文章,但我花了很长时间试图找到解决方案。我发现了一个只使用ReportLab和PyPDF的不错的版本,所以我想与大家分享一下:
PdfFileReader()
读取PDF,我们将调用此输入PdfFileReader()
读取字符串对象,我们将调用此文本PdfFileWriter()
创建一个新的PDF对象,我们将调用此输出.mergePage(*text*.getPage(0))
,然后使用output.addPage()
将修改后的页面添加到新文档中packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)
packet=StringIO.StringIO()
canvas.canvas(数据包,页面大小=字母)
can.save()
包搜索(0)
输入=PdfFileReader(数据包)
从这里,您可以将输入文件的页面与另一个文档合并。例如[Python 2.7]:Python 3.x的示例:
将从命令行执行此任务。但它不是python(afaik): 将允许您从现有PDF读入页面并将其绘制到reportlab画布(类似于绘制图像)。github上的pdfrw子目录中有这样的例子。免责声明:我是pdfrw的作者。在上面的Python 2.7.13中,以下内容适用:
from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger
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(290, 720, "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("original.pdf")
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 = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()
问题是,我只有PDF格式的源文件(来自第三方),PDF->DOC->PDF在转换过程中会丢失很多。我还需要在Linux上运行它,所以DOC可能不是最好的选择。我相信Adobe将PDF编辑功能保持在非常封闭和专有的状态,这样他们就可以为更好的Acrobat版本销售许可证。也许你可以找到一种方法,使用某种宏界面,自动使用Acrobat Pro来编辑它。如果你想写入的部分是表单字段,那么就有XML接口来编辑它们——否则我什么也找不到。不,我只想在每个页面上添加几行文本。白皮书看起来不错,但代码有点轻,而且我自己也没有足够的资源来实现一个完整的PDF框架“使用ReportLab创建一个包含要添加的文本的新pdf,将其另存为字符串对象”您如何做到这一点?这是一个canvas实例。我在上面添加了一些示例代码来回答Lakshman的问题。我建议使用PyPDF2,因为PyPDF2更新了很多,还要检查它们的示例代码:此代码将创建一个新的pdf文件,并将跳过所有元数据。因此,它不是附加到现有的pdf。我想你可以把一个链接放在那里很好的一点!当我发布这些内容时,我并没有做太多的事情,并且担心“最小文本加链接策略”。(我的代表当时只有46岁,IIRC我刚刚收到一个答案为-2,所以我有点担心关于5年前问题的新答案:)旧问题会获得更多视图:)和注意力FWIW,如果您开始以下操作,还有一些reportlab/pdfrw示例。我根据dupe目标中的答案回答了这个问题。对于python3,数据包应该是
io.BytesIO
,并且使用PyPDF2而不是pyPDF(未维护)。回答得好!谢谢分享。它工作得很好。注意:我认为最好使用open
而不是file
。我认为这是一个更容易接受的答案,特别是因为它包含了一个工作示例。小心:新文档只包含原始文档的第一页!将剩余的页面从现有的\u pdf
复制到输出
,很容易,但示例代码并不简单。@alexis:你会如何修改代码以在pdf的第二页添加内容?我有一个表格,用了两页,我卡在了第一页。提前谢谢。这是一个很好的工具。
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(10, 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("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 = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()
cpdf -add-text "Line of text" input.pdf -o output .pdf
from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger
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(290, 720, "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("original.pdf")
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 = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()