使用Python向现有PDF添加文本

使用Python向现有PDF添加文本,python,pdf,Python,Pdf,我需要使用Python向现有PDF添加一些额外的文本,最好的方法是什么,需要安装哪些额外的模块 注意:理想情况下,我希望能够在Windows和Linux上运行此功能,但在推送时,只有Linux可以 编辑:看起来不错,但两个都不允许我编辑现有的PDF,还有其他选项吗?您可能会更幸运地将问题分解为将PDF转换为可编辑格式,编写更改,然后将其转换回PDF。我不知道有哪一个库可以让你直接编辑PDF,但例如,在文档和PDF之间有很多转换器。如果你在Windows上,这可能会起作用: 还有一份关于Pyth

我需要使用Python向现有PDF添加一些额外的文本,最好的方法是什么,需要安装哪些额外的模块

注意:理想情况下,我希望能够在Windows和Linux上运行此功能,但在推送时,只有Linux可以


编辑:看起来不错,但两个都不允许我编辑现有的PDF,还有其他选项吗?

您可能会更幸运地将问题分解为将PDF转换为可编辑格式,编写更改,然后将其转换回PDF。我不知道有哪一个库可以让你直接编辑PDF,但例如,在文档和PDF之间有很多转换器。

如果你在Windows上,这可能会起作用:

还有一份关于Python中PDF创建和编辑框架的白皮书。虽然有点过时,但也许可以给你一些有用的信息:


我知道这是一篇老文章,但我花了很长时间试图找到解决方案。我发现了一个只使用ReportLab和PyPDF的不错的版本,所以我想与大家分享一下:

  • 使用
    PdfFileReader()
    读取PDF,我们将调用此输入

  • 创建包含要使用ReportLab添加的文本的新pdf,并将其另存为字符串对象
  • 使用
    PdfFileReader()
    读取字符串对象,我们将调用此文本
  • 使用
    PdfFileWriter()
    创建一个新的PDF对象,我们将调用此输出
  • 迭代输入并对每个要添加文本的页面应用
    .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)
    
    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()