Введение
В статье рассмотрим способы взаимодействия с 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. Да, мы конечно рассмотрели не всё, но большую часть работы с ними. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂