Простое упражнение pyPdf — ошибка атрибута: объект ‘NullObject’ не имеет атрибута ‘get’

#python #pypdf2

#python #pypdf

Вопрос:

Работаю над простым упражнением, связанным с pyPdf — мне в основном нужно взять PDF-файл и применить к нему водяной знак.

Вот мой код:

 # We need to build a program that will watermark all of our PDF files
# Use the wtr.pdf and apply it to all of the pages of our PDF file

import PyPDF2

# Open the file we want to add the watermark to
with open("combined.pdf", mode="rb") as file:
    reader = PyPDF2.PdfFileReader(file)

    # Open the watermark file and get the watermark 
    with open("wtr.pdf", mode="rb") as watermark_file:
        watermark_reader = PyPDF2.PdfFileReader(watermark_file)        

        # Create a writer object for the output file
        writer = PyPDF2.PdfFileWriter()        

        for i in range(reader.numPages):
            page = reader.getPage(i)
            # Merge the watermark page object into our current page
            page.mergePage(watermark_reader.getPage(0))
            # Append this new page into our writer object
            writer.addPage(page)

        with open("watermarked.pdf", mode="wb") as output_file:
            writer.write(output_file)
  

Мне неясно, почему я получаю эту ошибку:

 $ python watermark.py
Traceback (most recent call last):
  File "watermark.py", line 20, in <module>
    page.mergePage(watermark_reader.getPage(0))
  File "C:Python38libsite-packagesPyPDF2pdf.py", line 2239, in mergePage
    self._mergePage(page2)
  File "C:Python38libsite-packagesPyPDF2pdf.py", line 2260, in _mergePage
    new, newrename = PageObject._mergeResources(originalResources, page2Resources, res)
  File "C:Python38libsite-packagesPyPDF2pdf.py", line 2170, in _mergeResources
    newRes.update(res1.get(resource, DictionaryObject()).getObject())
AttributeError: 'NullObject' object has no attribute 'get'
  

Я был бы признателен за любую информацию. Я некоторое время смотрел на это.

Комментарии:

1. Убедитесь, что pdf-файл находится в том же каталоге, что и ваш код.

2. Спасибо за предложение. Они находятся в одном каталоге.

Ответ №1:

По какой-то причине ваш PDF-файл не содержит «/ Resources». PyPDF2 пытается получить его в строке 2314 в https://github.com/mstamy2/PyPDF2/blob/master/PyPDF2/pdf.py#L2314

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

Еще одна вещь, которую я заметил, это то, что номера строк в главной ветке библиотеки не совпадают с номерами строк в вашей трассировке стека, поэтому, возможно, вам нужно получить более свежую версию библиотеки и надеяться, что проблема там устранена.


При кратком просмотре структуры файла pdf кажется, что /Resources являются необязательными. Если это так, то PyPDF2 не обрабатывает этот случай, и, вероятно, об этом следует сообщать как об ошибке в https://github.com/mstamy2/PyPDF2/issues

Комментарии:

1. Обновить. Я попытался обновить до PyPDF3, но получил ту же ошибку. Спасибо за ваше предложение.

2. Похоже, что PyPDF3 — это просто старая ветка PyPDF2 и не является разумной версией для обновления.