Вопрос или проблема
Я пытаюсь программно разбить 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)
Разбор кода
-
Импорт библиотек: Убедитесь, что вы импортируете правильные классы из библиотеки pypdf.
-
Чтение PDF: Используется
PdfReader
для чтения входного PDF-файла. -
Извлечение страницы: С помощью
input_pdf.pages[0]
мы получаем первую страницу PDF. -
Печать длины текста: Это помогает удостовериться, что вы правильно получили страницу с данными.
-
Создание
PdfWriter
: ОбъектPdfWriter
используется для формирования нового PDF-файла. -
Добавление страницы: Важно использовать вызов
output.add_page(page)
, который корректно добавляет страницу в объектPdfWriter
. -
Запись файла: Окончательно, файл записывается с помощью контекстного менеджера
with
, что гарантирует закрытие потока правильно.
Заключение
Используя корректный вызов метода add_page
, вы сможете создать PDF-файл, содержащий необходимые страницы, без проблем. Если после внесения изменений проблема все еще сохраняется, стоит проверить, нет ли ошибок в исходном файле ‘testpdf.pdf’, который вы пытаетесь обработать.
Также не забудьте протестировать код на других страницах для убедительности в том, что он работает корректно и для сложных случаев, например, для многопараллельных статьей в одном PDF-документе.