Извлечение страницы PDF с помощью pypdf последовательно создает PDF без всех страниц.

Вопрос или проблема

Я пытаюсь программно разбить PDF-файл, содержащий несколько статей, на PDF-файл для каждой статьи. Чтение и извлечение страниц, кажется, работает, файл создается, но он всего лишь 311 байт и, судя по Adobe Reader, содержит только информацию заголовка PDF без каких-либо страниц PDF.

Я создал новый одностраничный PDF, который весит около 132 КБ, и простую тестовую программу. Длина текста выглядит правильно, но выходной PDF снова составляет всего 311 байт.

from pypdf import PdfReader, PdfWriter
input_pdf = PdfReader('testpdf.pdf')
page = input_pdf.pages[0]
print(len(page.extract_text()))
output = PdfWriter()
output.add_page = page
with open('testpdf_1.pdf', 'wb') as output_stream:
      output.write(output_stream)

Если я запущу код в интерактивной сессии Python, я вижу:

False, <_io.BufferedWriter name="testpdf_1.pdf">) 

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

Я использую pypdf 5.0.1 и python 3.8.0 в venv.

В соответствии с вашими требованиями, я думаю, что “страница” не должна добавляться в объект PdfWriter таким образом, как вы это сделали. Вы должны вызвать метод add_page напрямую с output.add_page(page). Я думаю, что то, как вы присвоили output.add_page, на самом деле не добавляет страницу, а перезаписывает метод объектом страницы. Это и вызывает эту проблему. Пожалуйста, попробуйте следующий код и дайте мне знать, если он сработает… в противном случае мы попробуем другой способ.

 from pypdf import PdfReader, PdfWriter 
input_pdf = PdfReader('testpdf.pdf')
page = input_pdf.pages[0]
print(len(page.extract_text()))  
output = PdfWriter()
output.add_page(page)  
with open('testpdf_1.pdf', 'wb') as output_stream:
    output.write(output_stream)

.

Ответ или решение

Проблема, с которой вы столкнулись при работе с библиотекой pypdf для извлечения страниц из PDF, вполне распространена, и, как правило, связана с неправильным использованием методов библиотеки. Давайте разберем это более детально и предложим корректное решение.

Причины проблемы

Ваш код создает выходной PDF-файл размером всего 311 байтов, что указывает на наличие проблем в структуре создаваемого файла. Это происходит потому, что вы не используете метод add_page() правильно. Вместо вызова метода для добавления страницы, вы фактически переопределяете его, что приводит к тому, что страница не добавляется в PdfWriter.

Решение

Для решения этой проблемы вам необходимо правильно вызывать метод add_page(), как показано в следующем примере кода:

from pypdf import PdfReader, PdfWriter

# Читаем входной PDF
input_pdf = PdfReader('testpdf.pdf')

# Извлекаем первую страницу
page = input_pdf.pages[0]

# Проверяем длину текста на странице
print(len(page.extract_text()))

# Создаем объект PdfWriter
output = PdfWriter()

# Правильный вызов метода добавления страницы
output.add_page(page)

# Записываем новый файл
with open('testpdf_1.pdf', 'wb') as output_stream:
    output.write(output_stream)

Разбор кода

  1. Импорт библиотек: Убедитесь, что вы импортируете правильные классы из библиотеки pypdf.

  2. Чтение PDF: Используется PdfReader для чтения входного PDF-файла.

  3. Извлечение страницы: С помощью input_pdf.pages[0] мы получаем первую страницу PDF.

  4. Печать длины текста: Это помогает удостовериться, что вы правильно получили страницу с данными.

  5. Создание PdfWriter: Объект PdfWriter используется для формирования нового PDF-файла.

  6. Добавление страницы: Важно использовать вызов output.add_page(page), который корректно добавляет страницу в объект PdfWriter.

  7. Запись файла: Окончательно, файл записывается с помощью контекстного менеджера with, что гарантирует закрытие потока правильно.

Заключение

Используя корректный вызов метода add_page, вы сможете создать PDF-файл, содержащий необходимые страницы, без проблем. Если после внесения изменений проблема все еще сохраняется, стоит проверить, нет ли ошибок в исходном файле ‘testpdf.pdf’, который вы пытаетесь обработать.

Также не забудьте протестировать код на других страницах для убедительности в том, что он работает корректно и для сложных случаев, например, для многопараллельных статьей в одном PDF-документе.

Оцените материал
Добавить комментарий

Капча загружается...