Обработка PDF с помощью Python - PullRequest
0 голосов
/ 09 июля 2020

Мне нужно удалить последнюю страницу 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, в read Raise utils.PdfReadError («Не удалось найти таблицу внешних ссылок в указанном месте») PyPDF2.utils.PdfReadError: Не удалось найти таблицу внешних ссылок в указанном месте

Мне удалось исправить это на моем Linux ноутбук, запустив qpdf invoice.pdf invoice-fix . Я не могу установить QPDF на свою работу, где используется Windows.

Я полагаю, эта ошибка вызвана подписью, оставленной нашим поставщиком для каждого файла PDF.

Кто-нибудь знаете, как исправить эту ошибку? Я ищу эффективный метод решения проблемы с поврежденным файлом PDF и его подписью. Должно быть что-то получше, чем открывать каждый файл PDF в Adobe и удалять подпись вручную ...

Было бы неплохо автоматизировать, потому что я ежедневно помещаю несколько счетов в один и тот же каталог.

Спасибо.

1 Ответ

0 голосов
/ 09 июля 2020

Вероятно, проблема в поврежденном файле 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)

Ссылка на документы pikepdf: https://pikepdf.readthedocs.io/en/latest/

Позвольте мне знайте, работает ли это для вас.

...