使用 Python 进行 PDF 操作

PDF manipulation with Python

我需要删除 pdf 文件的最后一页。我在同一目录中有多个 pdf 文件。到目前为止,我有下一个代码:

from PyPDF2 import PdfFileWriter, PdfFileReader
import os

def changefile (file):

    infile = PdfFileReader(file, "rb")
    output = PdfFileWriter()
    numpages = infile.getNumPages()

    for i in range (numpages -1):
        p = infile.getPage(i)
        output.addPage(p)

    with open(file, 'wb') as f:
        output.write(f)

for file in os.listdir("C:\Users\Conan\PycharmProjects\untitled"):
    if file.endswith(".pdf") or file.endswith(".PDF"):
        changefile(file)

我的脚本在测试时有效。我的工作需要这个脚本。每天我都需要从我们的主要外部供应商处下载几张电子发票。最后一页总是提到销售条件,没有用。不幸的是我们的供应商留下了签名,导致我的脚本无法正常工作。

当我尝试运行它在发票上时,我收到以下错误:

第 1901 行,已读 raise utils.PdfReadError("无法在指定位置找到外部参照 table") PyPDF2.utils.PdfReadError: 在指定位置找不到外部参照 table

我可以通过 运行ning qpdf invoice.pdf invoice-fix 在我的 Linux 笔记本电脑上修复它。我无法在工作中安装 QPDF,其中使用了 Windows。

我想这个错误是由我们的供应商在每个 PDF 文件上留下的签名触发的。

有谁知道如何解决这个错误?我正在寻找一种有效的方法来解决损坏的 PDF 文件及其签名的问题。肯定有比用 Adob​​e 打开每个 PDF 文件并手动删除签名更好的东西了...

自动化会很好,因为我每天都会将多张发票放在同一个目录中。

谢谢。

问题可能是损坏的 PDF 文件。 QPDF 确实能够解决这个问题。这就是为什么我建议在这种情况下使用 pikepdf 库而不是 PyPDF2。 Pikepdf 基于 QPDF。首先安装 pikepdf(例如使用 pip 或您的包管理器)然后尝试此代码:

import pikepdf
import os

def changefile (file):
    print("Processing {0}".format(file))
    pdf = pikepdf.Pdf.open(file)
    lastPageNum = len(pdf.pages)
    pdf.pages.remove(p = lastPageNum)
    pdf.save(file + '.tmp')
    pdf.close()
    os.unlink(file)
    os.rename(file + '.tmp', file)

for file in os.listdir("C:\Users\Conan\PycharmProjects\untitled"):
    if file.lower().endswith(".pdf"):
        changefile(file)

Link 到 pikepdf 文档:https://pikepdf.readthedocs.io/en/latest/

让我知道这是否适合你。