Автор оригинала: Pankaj Kumar.
PypDF2 – это библиотека Pure-Python для работы с файлами PDF. Мы можем использовать модуль PypDF2 для работы с существующими файлами PDF. Мы не можем создать новый файл PDF, используя этот модуль.
PypDF2 особенности
Некоторые из захватывающих функций модуля PYPDF2 являются:
- PDF файлы метаданных, таких как количество страниц, автор, создатель, созданные и последнее обновление времени.
- Извлечение содержимого PDF-файла страницы по странице.
- Объединить несколько файлов PDF.
- Поверните страницы файла PDF под углом.
- Масштабирование PDF страниц.
- Извлечение изображений с PDF-страниц и сохранение в качестве изображения с помощью библиотеки подушки.
Установка модуля PYPDF2
Мы можем использовать PIP для установки модуля PYPDF2.
$ pip install PyPDF2
ПРИМЕРЫ PYPDF2
Давайте посмотрим на некоторые примеры для работы с файлами PDF с помощью модуля PYPDF2.
1. Извлечение метаданных PDF
Мы можем получить количество страниц в файле PDF. Мы также можем получить информацию о автор PDF, приложение для создания и даты создания.
import PyPDF2 with open('Python_Tutorial.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) print(f'Number of Pages in PDF File is {pdf_reader.getNumPages()}') print(f'PDF Metadata is {pdf_reader.documentInfo}') print(f'PDF File Author is {pdf_reader.documentInfo["/Author"]}') print(f'PDF File Creator is {pdf_reader.documentInfo["/Creator"]}')
Образец вывода:
Number of Pages in PDF File is 2 PDF Metadata is {'/Author': 'Microsoft Office User', '/Creator': 'Microsoft Word', '/CreationDate': "D:20191009091859+00'00'", '/ModDate': "D:20191009091859+00'00'"} PDF File Author is Microsoft Office User PDF File Creator is Microsoft Word
- Файл PDF должен быть открыт в двоичном режиме. Это, почему режим открытия файла передается как «RB».
- Класс PDFFILEREADER используется для чтения файла PDF.
- DocumentInfo – это Словарь который содержит метаданные файла PDF.
- Мы можем получить количество страниц в файле PDF, используя функцию GetНет (). Альтернативный способ – использовать
numpages
атрибут.
2. Извлечение текста PDF страниц
import PyPDF2 with open('Python_Tutorial.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) # printing first page contents pdf_page = pdf_reader.getPage(0) print(pdf_page.extractText()) # reading all the pages content one by one for page_num in range(pdf_reader.numPages): pdf_page = pdf_reader.getPage(page_num) print(pdf_page.extractText())
- Метод pdffilereader (int) возвращает
Pypdf2.pdf.pageObject
пример. - Мы можем вызвать метод ExtractText () на объекте страницы, чтобы получить текстовое содержимое страницы.
- Экстрактныйтекст () не будет возвращать какие-либо двоичные данные, такие как изображения.
3. Поверните PDF файловые страницы
PYPDF2 позволяет много типов манипуляций, которые могут быть сделаны на странице. Мы можем повернуть страницу по часовой стрелке или против часовой стрелки под углом.
import PyPDF2 with open('Python_Tutorial.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) pdf_writer = PyPDF2.PdfFileWriter() for page_num in range(pdf_reader.numPages): pdf_page = pdf_reader.getPage(page_num) pdf_page.rotateClockwise(90) # rotateCounterClockwise() pdf_writer.addPage(pdf_page) with open('Python_Tutorial_rotated.pdf', 'wb') as pdf_file_rotated: pdf_writer.write(pdf_file_rotated)
- PDFHILEWRITER используется для записи файла PDF из исходного PDF.
- Мы используем метод ROTATECHALLOWSOWS (90), чтобы повернуть страницу по часовой стрелке на 90 градусов.
- Мы добавляем повернутые страницы в экземпляр PDFFILEWRITER.
- Наконец, метод записи () PDFFILEWRITER используется для создания поворота файла PDF.
4. Слияние файлов PDF
import PyPDF2 pdf_merger = PyPDF2.PdfFileMerger() pdf_files_list = ['Python_Tutorial.pdf', 'Python_Tutorial_rotated.pdf'] for pdf_file_name in pdf_files_list: with open(pdf_file_name, 'rb') as pdf_file: pdf_merger.append(pdf_file) with open('Python_Tutorial_merged.pdf', 'wb') as pdf_file_merged: pdf_merger.write(pdf_file_merged)
Приведенный выше код выглядит хорошо, чтобы объединить файлы PDF. Но он создал пустой файл PDF. Причина в том, что исходные файлы PDF были закрыты до того, как фактическое письмо произошло для создания объединенного файла PDF.
Это ошибка в последней версии PYPDF2. Вы можете прочитать об этом Этот выпуск Github Отказ
Есть альтернативный подход к использованию Contextlib
Модуль, чтобы сохранить исходные файлы открыть, пока операция записи не закончится.
import contextlib import PyPDF2 pdf_files_list = ['Python_Tutorial.pdf', 'Python_Tutorial_rotated.pdf'] with contextlib.ExitStack() as stack: pdf_merger = PyPDF2.PdfFileMerger() files = [stack.enter_context(open(pdf, 'rb')) for pdf in pdf_files_list] for f in files: pdf_merger.append(f) with open('Python_Tutorial_merged_contextlib.pdf', 'wb') as f: pdf_merger.write(f)
Вы можете прочитать больше об этом в этом Stackoverflow вопрос Отказ
5. Разделите файлы PDF в файлы с одним страницами
import PyPDF2 with open('Python_Tutorial.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) for i in range(pdf_reader.numPages): pdf_writer = PyPDF2.PdfFileWriter() pdf_writer.addPage(pdf_reader.getPage(i)) output_file_name = f'Python_Tutorial_{i}.pdf' with open(output_file_name, 'wb') as output_file: pdf_writer.write(output_file)
Python_Tutorial.pdf имеет 2 страницы. Выходные файлы называются python_tutorial_0.pdf и python_tutorial_1.pdf.
6. Извлечение изображений из файлов PDF
Мы можем использовать PYPDF2 вместе с подушкой (библиотека Python Imaging) для извлечения изображений с страниц PDF и сохранить их в виде файлов изображений.
Прежде всего, вам придется установить модуль подушки, используя следующую команду.
$ pip install Pillow
Вот простая программа для извлечения изображений с первой страницы файла PDF. Мы можем легко расширить его, чтобы извлечь все изображения из файла PDF.
import PyPDF2 from PIL import Image with open('Python_Tutorial.pdf', 'rb') as pdf_file: pdf_reader = PyPDF2.PdfFileReader(pdf_file) # extracting images from the 1st page page0 = pdf_reader.getPage(0) if '/XObject' in page0['/Resources']: xObject = page0['/Resources']['/XObject'].getObject() for obj in xObject: if xObject[obj]['/Subtype'] == '/Image': size = (xObject[obj]['/Width'], xObject[obj]['/Height']) data = xObject[obj].getData() if xObject[obj]['/ColorSpace'] == '/DeviceRGB': mode = "RGB" else: mode = "P" if '/Filter' in xObject[obj]: if xObject[obj]['/Filter'] == '/FlateDecode': img = Image.frombytes(mode, size, data) img.save(obj[1:] + ".png") elif xObject[obj]['/Filter'] == '/DCTDecode': img = open(obj[1:] + ".jpg", "wb") img.write(data) img.close() elif xObject[obj]['/Filter'] == '/JPXDecode': img = open(obj[1:] + ".jp2", "wb") img.write(data) img.close() elif xObject[obj]['/Filter'] == '/CCITTFaxDecode': img = open(obj[1:] + ".tiff", "wb") img.write(data) img.close() else: img = Image.frombytes(mode, size, data) img.save(obj[1:] + ".png") else: print("No image found.")
Мой образец файла PDF имеет изображение PNG на первой странице, и программа сохранила ее с именем файла «Image20.PNG».