【问题标题】:How to add page numbers to PDF file using python and matplotlib?如何使用 python 和 matplotlib 将页码添加到 PDF 文件?
【发布时间】:2014-09-29 15:40:50
【问题描述】:

我正在使用来自matplotlibPdfPages,我可以遍历每个图形对象并将每个图形对象另存为同一 PDF 中的单独页面:

from matplotlib.backends.backend_pdf import PdfPages
pp = PdfPages('output.pdf')
for fig in figs:
    pp.savefig(fig)
pp.close()

这很好用。但是有没有办法为 PDF 中的每一页添加页码?

谢谢。

【问题讨论】:

  • 我不知道有什么直接的方法可以做到这一点,这里简要介绍了另一种可能的解决方案。将绘图保存为图像,将图像插入 word 文档,将页面添加到 word doc,然后将其保存为 pdf。它有点迂回,但如果您认为这可能是一个好方法,请告诉我,我可以将其刷新为实际答案
  • 我需要每天对大量图像执行一次此操作,所以我真的需要一种自动化方式
  • 它可以是自动化的,但也许可以查看this question 直接处理pdf

标签: python pdf matplotlib


【解决方案1】:

使用numbering2pdf 库。

from numbering2pdf import add_numbering_to_pdf

add_numbering_to_pdf("old_file.pdf", "new_file.pdf")

【讨论】:

    【解决方案2】:

    使用reportlib 和PyPDF 的一个很好的解决方案(基于this):

    from reportlab.lib.units import mm
    from reportlab.pdfgen import canvas
    import os
    from PyPDF4.pdf import PdfFileReader, PdfFileWriter
    
    
    def createPagePdf(num, tmp):
        c = canvas.Canvas(tmp)
        for i in range(1, num + 1):
            c.drawString((210 // 2) * mm, (4) * mm, str(i))
            c.showPage()
        c.save()
    
    
    def add_page_numgers(pdf_path):
        """
        Add page numbers to a pdf, save the result as a new pdf
        @param pdf_path: path to pdf
        """
        tmp = "__tmp.pdf"
    
        output = PdfFileWriter()
        with open(pdf_path, 'rb') as f:
            pdf = PdfFileReader(f, strict=False)
            n = pdf.getNumPages()
    
            # create new PDF with page numbers
            createPagePdf(n, tmp)
    
            with open(tmp, 'rb') as ftmp:
                numberPdf = PdfFileReader(ftmp)
                # iterarte pages
                for p in range(n):
                    page = pdf.getPage(p)
                    numberLayer = numberPdf.getPage(p)
                    # merge number page with actual page
                    page.mergePage(numberLayer)
                    output.addPage(page)
    
                # write result
                if output.getNumPages():
                    newpath = pdf_path[:-4] + "_numbered.pdf"
                    with open(newpath, 'wb') as f:
                        output.write(f)
            os.remove(tmp)
    

    【讨论】:

    • 仅供参考,这对我有用,但在我的 pdf 中增加了很多批量大小。像 2-3 倍。
    • 我有一个现有的 pdf,我想在其中添加页面。我可以这样做吗?
    【解决方案3】:

    PyPDF2pdfrw 都可以让您覆盖两个 PDF(例如,您可以生成一个只有页码的 PDF,并使用它为您的图像添加水印)。 pdfrw 有一个使用单个水印页面的watermark example,但可以轻松修改为使用一组水印页面,每个页码一个。

    如果您想变得更高级,可以使用 reportlab 即时生成这些页面。

    pdfrw 还有一个工具,允许您将 PDF 页面导入到 reportlab 中,就像它是图像一样。有几个例子可以动态地做到这一点——here 是一个很好的起点。

    最后,rst2pdf(它维护得不是很好,但适用于简单的情况)还允许您将 PDF 作为图像导入——它在后台使用 pdfrw 和 reportlab——因此你可以轻松地使用 restructuredText 创建文档您的图像嵌入。 AFAIK,与已发布的 rst2pdf 版本一起使用的最佳报告实验室是 2.7。

    (免责声明:我是 pdfrw 作者并为 rst2pdf 做出过贡献。)

    【讨论】:

      【解决方案4】:

      类似这样的:

      from matplotlib.backends.backend_pdf import PdfPages
      pp = PdfPages('output.pdf')
      for n, fig in enumerate(figs):
          fig.text(4.25/8.5, 0.5/11., str(n+1), ha='center', fontsize=8)
          pp.savefig(fig)
      pp.close()
      

      【讨论】:

      • 什么是变量“figures”?
      • figs 只是您创建的图形集合。例如,通过在循环中运行 figs.append(plt.figure())
      猜你喜欢
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多