Python работа с PDF файлами

Python работа с PDF файлами Статьи

Введение

В статье рассмотрим способы взаимодействия с PDF файлами при помощи языка программирования Python.

Конвертация PDF в txt на Python

Научимся конвертировать PDF файлы в txt формат на Python. Для этого нам понадобится проинсталлировать модуль pdfminer.six, и чтобы его установить нужно перейти в терминал, или же командную строку, прописать pip install pdfminer.six, нажать Enter и ждать установки. После того, как модуль проинсталлировался импортируем pdfminer.high_level:

import pdfminer.high_level

Далее открываем pdf файл в режиме бинарного чтения использую конструкцию with … as. Внутри конструкции мы откроем, или же создадим txt файл в режиме для чтения и дозаписи. С помощью метода extract_text_to_fp() перенесём данные из pdf-файла в txt-файл и закроем его:

import pdfminer.high_level

with open('Test_pdf_file.pdf', 'rb') as file:
    file1 = open(r"Test_pdf_file.txt", "a+")
    pdfminer.high_level.extract_text_to_fp(file, file1)
    file1.close()

Конвертация данных и файлов в PDF на Python

Теперь научимся конвертировать данные и файлы в PDF-формат. Для этого нам понадобится модуль FPDF, и для его установки нужно перейти в терминал, или же командную строку, прописать pip install pdfminer.six, нажать Enter и ждать установки.

Теперь можем приступить к написанию кода, и для начала импортируем сам модуль:

from fpdf import FPDF

Создадим экземпляр класса FPDF:

from fpdf import FPDF

pdf = FPDF()

С помощью метода add_page() создадим страницу:

from fpdf import FPDF

pdf = FPDF()

pdf.add_page()

Так как для работы с кириллицей нужны специальные шрифты, Вы можете скачать их на каком-нибудь сайте со шрифтами, или же в моём телеграм канале. И так, когда шрифты установлены, можем их добавить методом add_font(), указав до них полный путь, у меня же они хранятся в той же папке, что и .py файл, в котором я пишу код, поэтому путь выглядит следующим образом (font/DejaVuSansCondensed.ttf):

from fpdf import FPDF

pdf = FPDF()

pdf.add_page()
pdf.add_font('DejaVu', '', 'font/DejaVuSansCondensed.ttf', uni=True) # Добавление шрифта для работы с русским
pdf.set_font('DejaVu', size=25)  # Шрифт и его размер

Создадим клетку шириной 200 миллиметров и 10 миллиметров:

from fpdf import FPDF

pdf = FPDF()

pdf.add_page()
pdf.add_font('DejaVu', '', 'font/DejaVuSansCondensed.ttf', uni=True) # Добавление шрифта для работы с русским
pdf.set_font('DejaVu', size=25)  # Шрифт и его размер
pdf.cell(200, 10, txt="Изучение Python!", ln=1, align='C')  # Параметр In указывает на то, что нужно сделать разрыв строки, align - выравнивает текст по центру
pdf.cell(200, 10, txt="Добро пожаловать на урок по Python!", ln=2, align='L')

Осталось сохранить итоговый PDF-файл:

from fpdf import FPDF

pdf = FPDF()

pdf.add_page()
pdf.add_font('DejaVu', '', 'font/DejaVuSansCondensed.ttf', uni=True) # Добавление шрифта для работы с русским
pdf.set_font('DejaVu', size=25)  # Шрифт и его размер
pdf.cell(200, 10, txt="Изучение Python!", ln=1, align='C')  # Параметр In указывает на то, что нужно сделать разрыв строки, align - выравнивает текст по центру
pdf.cell(200, 10, txt="Добро пожаловать на урок по Python!", ln=2, align='L')
# Сохранение итогового PDF-файла
pdf.output("Test_pdf_file.pdf")

Так же можно конвертировать целые файлы в PDF-формат, вот пример кода конвертации txt-файла в PDF:

from fpdf import FPDF

pdf = FPDF()

pdf.add_page()
pdf.add_font('DejaVu', '', 'font/DejaVuSansCondensed.ttf', uni=True) # Добавление шрифта для работы с русским
pdf.set_font('DejaVu', size=25)  # Шрифт и его размер
# Открываем txt-файл в режиме для чтения
with open("data.txt", "r") as f:
    # Циклом проходимся по данным из txt-файла
    for i in f:
        # Заполняем pdf-файл данными из txt-файла
        pdf.cell(200, 10, txt=i, ln=1, align='C')
# Сохранение итогового PDF-файла
pdf.output("Test_pdf_file.pdf")

Конвертация изображения в PDF на Python

Для конвертации изображения в PDF-формат нам понадобится модуль img2pdf. Для его установки нужно перейти в терминал, или же командную строку, прописать pip install img2pdf, нажать Enter и ждать установки.

Импортируем сам модуль img2pdf:

import img2pdf

Определим размер страницы формата А4 [8,3 х 11,7 дюйма]:

import img2pdf

a4_page_size = [img2pdf.in_to_pt(8.3), img2pdf.in_to_pt(11.7)]

Сохраним в layout_function:

import img2pdf

a4_page_size = [img2pdf.in_to_pt(8.3), img2pdf.in_to_pt(11.7)]
layout_function = img2pdf.get_layout_fun(a4_page_size)

Конвертируем изображение в PDF-формат:

import img2pdf

a4_page_size = [img2pdf.in_to_pt(8.3), img2pdf.in_to_pt(11.7)]
layout_function = img2pdf.get_layout_fun(a4_page_size)

pdf = img2pdf.convert('img.jpg', layout_fun=layout_function)

Откроем PDF-файл в режиме бинарной записи и запишем туда изображение:

import img2pdf

a4_page_size = [img2pdf.in_to_pt(8.3), img2pdf.in_to_pt(11.7)]
layout_function = img2pdf.get_layout_fun(a4_page_size)

pdf = img2pdf.convert('img.jpg', layout_fun=layout_function)
with open('pdfTest.pdf', 'wb') as f:
     f.write(pdf)

Добавление водяного знака в PDF на Python

Для добавления водяного знака в PDF-файл нам понадобится модуль PyPDF2. Для его установки нужно перейти в терминал, или же командную строку, прописать pip install PyPDF2, нажать Enter и ждать установки.

Импортируем модуль PyPDF2:

import PyPDF2

Создадим две переменные, одна из которых будет хранить путь до начального PDF-файла, а вторая — путь сохранения итогового результата:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"

Так же нам нужно само изображение, которое будет вотермаркой, его нужно добавить в пустой PDF-файл. Сделать это можно прочитав предыдущий пункт статьи. И так, в переменную watermark_file сохраним путь до PDF-файла с изображением:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

Откроем PDF-файл в который нужно добавить вотермарку в режиме для бинарного чтения использую конструкцию with … as. Внутри конструкции мы считываем содержимое исходного файла:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)

Далее внутри конструкции with … as создаём ещё одну, но открываем файл с вотермаркой:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:

Внутри вложенной конструкции считываем данные из PDF-файла с вотермаркой:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)

Получаем первую страницу оригинального PDF-файла:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)

Получаем первую страницу оригинального PDF-файла с вотермаркой:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)
        first_page_watermark = watermark.getPage(0)

Объединяем две страницы:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)
        first_page_watermark = watermark.getPage(0)
        first_page.mergePage(first_page_watermark)

Создадим объект записи PDF для выходного файла:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)
        first_page_watermark = watermark.getPage(0)
        first_page.mergePage(first_page_watermark)
        pdf_writer = PyPDF2.PdfFileWriter()

Добавим страницу:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)
        first_page_watermark = watermark.getPage(0)
        first_page.mergePage(first_page_watermark)
        pdf_writer = PyPDF2.PdfFileWriter()
        pdf_writer.addPage(first_page)

Создадим ещё одну конструкцию with … as, в которой создадим PDF-файл с итоговым результатом и запишем его:

import PyPDF2

input_file = "input_pdf_file.pdf"
output_file = "output_pdf_file.pdf"
watermark_file = "logo.pdf"

with open(input_file, "rb") as file_input:
    pdf = PyPDF2.PdfFileReader(file_input)
    with open(watermark_file, "rb") as file_watermark:
        watermark = PyPDF2.PdfFileReader(file_watermark)
        first_page = pdf.getPage(0)
        first_page_watermark = watermark.getPage(0)
        first_page.mergePage(first_page_watermark)
        pdf_writer = PyPDF2.PdfFileWriter()
        pdf_writer.addPage(first_page)
        with open(output_file, "wb") as filehandle_output:
            pdf_writer.write(filehandle_output)

Поиск заданного текста в PDF на Python

Для поиска заданного текста в PDF-файле нам понадобится модуль fitz, а для его корректной работы ещё и PyMuPDF. Для их установки нужно перейти в терминал, или же командную строку, прописать pip install PyPDF2 PyMuPDF, нажать Enter и ждать установки.

Импортируем модуль fitz:

import fitz

Создадим переменную, хранящую путь/название pdf-файла:

import fitz

filename = "test_pdf_file.pdf"

Добавим искомую строку, допустим мы ищем слово «python» в тексте:

import fitz

filename = "test_pdf_file.pdf"
search_term = "python"

Откроем PDF-файл:

import fitz

filename = "test_pdf_file.pdf"
search_term = "python"
pdf = fitz.open(filename)

Создадим цикл, который проходится по всем страницам PDF-файла:

import fitz

filename = "test_pdf_file.pdf"
search_term = "python"
pdf = fitz.open(filename)
for current_page in range(len(pdf)):

Внутри цикла прогрузим страницу, добавим условие, в котором с помощью метода searchFor() обнаружим все вхождения строки поиска, и если есть совпадение — выведем его:

import fitz

filename = "test_pdf_file.pdf"
search_term = "python"
pdf = fitz.open(filename)
for current_page in range(len(pdf)):
    page = pdf.loadPage(current_page)  # Прогрузка страницы
    if page.searchFor(search_term):  # Метод searchFor() обнаруживает все вхождения строки поиска
        print(f"{search_term} найдено на {current_page} странице")

Извлекаем изображения из PDF-файла на Python

Для извлечения нам понадобятся те же модули, что и в прошлом пункте статьи.

Импортируем модуль fitz:

import fitz

Создадим переменную, в которую сохраним путь до PDF-файла из которого нам нужно извлечь изображения:

import fitz
test_pdf_file = 'test.pdf'

Откроем PDF-файл, и укажем страницу с которой нужно извлечь изображения:

import fitz
test_pdf_file = 'test.pdf'

pdf = fitz.open(test_pdf_file)
image_list = pdf.getPageImageList(0)  # Указываем страницу, с которой нужны изображения

Создадим цикл, в котором будем искать изображения:

import fitz
test_pdf_file = 'test.pdf'

pdf = fitz.open(test_pdf_file)
image_list = pdf.getPageImageList(0)  # Указываем страницу, с которой нужны изображения

for image in image_list:  # Цикл, в котором будет производиться поиск изображений
    xref = image[0]
    pix = fitz.Pixmap(pdf, xref)  # Преобразуем его в пиксели
    if pix.n < 5:  # Если изображение серое, или цветное, то нам нужно его сохранить
        pix.writePNG(f'{xref}.png')
    else:
        pix1 = fitz.open(fitz.csRGB, pix)  # Переконвертируем в другой формат
        pix1.writePNG(f'{xref}.png')  # Сохраняем изображение
        pix1 = None

Если же нужно скачать все изображения из файла, то используем такой код:

import fitz
test_pdf_file = 'test.pdf'

pdf = fitz.open(test_pdf_file)
image_list = pdf.getPageImageList(0)  # Указываем страницу, с которой нужны изображения

for i in range(len(pdf)):
    for image in pdf.getPageImageList(i):
        xref = image[0]
        pix = fitz.Pixmap(pdf, xref)
        if pix.n < 5:
            pix.writePNG(f'{xref}.png')
        else:
            pix1 = fitz.open(fitz.csRGB, pix)
            pix1.writePNG(f'{xref}.png')
            pix1 = None
        pix = None
Работа с PDF файлами на python (сборник)

Заключение

В ходе статьи мы с Вами научились работать с PDF-файлами при помощи Python. Да, мы конечно рассмотрели не всё, но большую часть работы с ними. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin
Admin
IT Start