«OSError: [Errno 22] Неверный аргумент» при объединении файлов с использованием PyPDF2

Я просто пытаюсь объединить некоторые PDF-файлы с помощью python, а точнее PyPDF2. Достаточно просто, но у меня почему-то выдает ошибку, которую просто не понять.

В поисках решения я обнаружил, что у других людей тоже была эта проблема. Однако удовлетворительного решения для меня не было опубликовано.

Мой код для слияния файлов:

from PyPDF2 import PdfFileMerger

def merge(self, work_files, destination_file):
    pdf_merger = PdfFileMerger()

    for pdf in work_files:
        pdf_merger.append(pdf)
        #also tried the following with the same results:
        #with open(pdf, 'wb') as fileobj:
            #merger.append(fileobj)

    with open(destination_file, 'wb') as fileobj:
      pdf_merger.write(fileobj)

тогда как work_files — это список путей к PDF-файлам для слияния, а destination_file — это файл, который должен быть сохранен объединенным PDF-файлом.

Это приводит к следующей ошибке (полная трассировка стека предоставляется по запросу):

Traceback (most recent call last):
      File "main.py", line 9, in <module>
         merger.append(fileobj)
      File "/home/user/.local/lib/python3.8/sitepackages/PyPDF2/merger.py",line 203, 
      in append
         self.merge(len(self.pages), fileobj, bookmark, pages, 
      import_bookmarks)
      File "/home/user/.local/lib/python3.8/site- 
      packages/PyPDF2/merger.py",
      line 133, in merge
         pdfr = PdfFileReader(fileobj, strict=self.strict)
      File "/home/user/.local/lib/python3.8/site- 
      packages/PyPDF2/pdf.py", line 1084, 
      in __init__
         self.read(stream)
      File "/home/user/.local/lib/python3.8/site 
      packages/PyPDF2/pdf.py", line 1689, 
      in read
         stream.seek(-1, 2)
    OSError: [Errno 22] Invalid argument

Я пробовал разные способы ввода путей, я пробовал относительные пути, абсолютные пути, а также анализировал их в другой файл, но безуспешно.

Я использую Python 3.8 и работаю с Linux Ubuntu 20.04.

Буду благодарен за любую помощь.


person wittn    schedule 27.05.2020    source источник


Ответы (2)


Если work_files — это только список путей, это означает, что вы передаете только строки в качестве входных данных для метода добавления, по одной за раз. Согласно документации PdfFileMerger, вам необходимо передавать файловые объекты в качестве входных данных для метода append.

fileobj — файловый объект или объект, который поддерживает стандартные методы чтения и поиска, аналогичные файловому объекту. Также может быть строкой, представляющей путь к файлу PDF.

Извините, я пропустил последнюю часть документации, но вы действительно пробовали передавать файловые объекты? Также, возможно, попробуйте получить имена файлов с помощью метода glob.glob(*.pdf). Если бы вы могли опубликовать полную трассировку стека ошибки, это тоже было бы полезно.

person CtrlMj    schedule 27.05.2020
comment
Однако даже в цитируемом вами тексте четко указано, что это также может быть строка, представляющая путь к файлу. Кроме того, если вы внимательно прочитаете мой вопрос, я пробовал несколько разных способов передать файл, в том числе как файловый объект. - person wittn; 28.05.2020
comment
Я добавил запрошенную информацию. Имена файлов, безусловно, правильные и хорошо отформатированы как таковые, поскольку я пробовал это с тестовыми документами, путь к которым я ввел, поэтому они гарантированно верны. - person wittn; 28.05.2020

Попробовав другие способы объединения файлов PDF, я смущенно понял, что мой тестовый файл был на самом деле поврежденным файлом, который даже не мог быть прочитан системой - проблема решена.

person wittn    schedule 28.05.2020