Рубрики
Без рубрики

Pypdf2: библиотека Python для PDF-файлов манипуляций

PypDF2 – это библиотека Pure-Python для работы с файлами PDF. Мы можем использовать модуль PypDF2 для работы с существующими файлами PDF. Мы не можем создать новый файл PDF

Автор оригинала: 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».

Рекомендации