Python — очень универсальный язык, и разработчикам Python часто приходится работать с множеством файлов и получать хранящуюся в них информацию для обработки. Один из популярных форматов файлов, с которым вы наверняка столкнетесь как разработчик Python, — это формат переносимых документов, широко известный как PDF.
PDF-файлы могут содержать текст, изображения и ссылки. При обработке данных в программе Python вам может потребоваться извлечь данные, хранящиеся в документе PDF. В отличие от структур данных, таких как кортежи, списки и словари, получение информации, хранящейся в документе PDF, может показаться сложной задачей.
К счастью, существует ряд библиотек, которые упрощают работу с PDF-файлами и извлечение данных, хранящихся в PDF-файлах. Чтобы узнать об этих различных библиотеках, давайте посмотрим, как можно извлекать тексты, ссылки и изображения из файлов PDF. Чтобы продолжить, загрузите следующий PDF-файл и сохраните его в том же каталоге, что и файл программы Python.
Чтобы извлечь текст из PDF-файлов с помощью Python, мы собираемся использовать PyPDF2 библиотека. PyPDF2 — это бесплатная библиотека Python с открытым исходным кодом, которую можно использовать для объединения, обрезки и преобразования страниц PDF-файлов. Он может добавлять пользовательские данные, параметры просмотра и пароли к файлам PDF. Однако важно отметить, что PyPDF2 может извлекать текст из файлов PDF.
Чтобы использовать PyPDF2 для извлечения текста из файлов PDF, установите его с помощью pip — установщика пакетов для Python. pip позволяет вам устанавливать на ваш компьютер различные пакеты Python:
1. Проверьте, установлен ли у вас pip, выполнив:
pip --version
Если вы не получили номер версии, это означает, что pip не установлен.
2. Чтобы установить pip, нажмите получить пункт чтобы загрузить сценарий установки.
Ссылка открывает страницу со скриптом для установки pip, как показано ниже:
Щелкните правой кнопкой мыши страницу и выберите «Сохранить как», чтобы сохранить файл. По умолчанию имя файла — get-pip.py.
Откройте терминал и перейдите в каталог с только что загруженным файлом get-pip.py, затем выполните команду:
sudo python3 get-pip.py
Это должно установить pip, как показано ниже:
3. Убедитесь, что pip успешно установлен, выполнив:
pip --version
В случае успеха вы должны получить номер версии:
Установив pip, мы можем начать работать с PyPDF2.
1. Установите PyPDF2, выполнив в терминале следующую команду:
pip install PyPDF2
2. Создайте файл Python и импортируйте PdfReader из PyPDF2, используя следующую строку:
from PyPDF2 import PdfReader
Библиотека PyPDF2 предоставляет множество классов для работы с файлами PDF. Одним из таких классов является PdfReader, который, среди прочего, можно использовать для открытия PDF-файлов, чтения содержимого и извлечения текста из PDF-файлов.
3. Чтобы начать работу с PDF-файлом, сначала необходимо открыть файл. Для этого создайте экземпляр класса PdfReader и передайте ему PDF-файл, с которым вы хотите работать:
reader = PdfReader('games.pdf')
Строка выше создает экземпляр PdfReader и подготавливает его для доступа к содержимому указанного вами PDF-файла. Экземпляр хранится в переменной под названием reader, которой потребуется доступ к множеству методов и свойств, доступных в классе PdfReader.
4. Чтобы убедиться, что все работает нормально, распечатайте количество страниц в переданном вами PDF-файле, используя следующий код:
print(len(reader.pages))
Выход:
5
5. Поскольку наш PDF-файл состоит из 5 страниц, мы можем получить доступ к каждой странице, доступной в PDF-файле. Однако отсчет начинается с 0, как и в соглашении об индексации Python. Таким образом, первой страницей PDF-файла будет номер страницы 0. Чтобы получить первую страницу PDF-файла, добавьте в свой код следующую строку:
page1 = reader.pages[0]
Строка выше извлекает первую страницу PDF-файла и сохраняет ее в переменной с именем page1.
6. Чтобы извлечь текст на первой странице PDF-файла, добавьте следующую строку:
textPage1 = page1.extract_text()
При этом извлекается текст на первой странице PDF-файла и сохраняется содержимое в переменной с именем textPage1. Таким образом, у вас есть доступ к тексту на первой странице PDF-файла через переменную textPage1.
7. Чтобы убедиться, что текст был успешно извлечен, вы можете распечатать содержимое переменной textPage1. Весь наш код, который также печатает текст на первой странице PDF-файла, показан ниже:
# import the PdfReader class from PyPDF2 from PyPDF2 import PdfReader # create an instance of the PdfReader class reader = PdfReader('games.pdf') # get the number of pages available in the pdf file print(len(reader.pages)) # access the first page in the pdf page1 = reader.pages[0] # extract the text in page 1 of the pdf file textPage1 = page1.extract_text() # print out the extracted text print(textPage1)
Выход:
Чтобы извлечь ссылки из файлов PDF, мы воспользуемся PyMuPDF, библиотекой Python для извлечения, анализа, преобразования и управления данными, хранящимися в документах, таких как PDF-файлы. Чтобы использовать PyMuPDF, у вас должен быть Python 3.8 или новее. Для начала:
1. Установите PyMuPDF, выполнив в терминале следующую строку:
pip install PyMuPDF
2. Импортируйте PyMuPDF в файл Python, используя следующий оператор:
import fitz
3. Чтобы получить доступ к PDF-файлу, из которого вы хотите извлечь ссылки, сначала необходимо его открыть. Чтобы открыть его, введите следующую строку:
doc = fitz.open("games.pdf")
4. Открыв PDF-файл, распечатайте количество страниц в PDF-файле, используя следующую строку:
print(doc.page_count)
Выход:
5
4. Чтобы извлечь ссылки со страницы в PDF-файле, нам нужно загрузить страницу, из которой мы хотим извлечь ссылки. Чтобы загрузить страницу, введите следующую строку, в которой вы передаете номер страницы, которую хотите загрузить, в функцию load_page().
page = doc.load_page(0)
Чтобы извлечь ссылки с первой страницы, мы передаем 0 (ноль). Подсчет страниц начинается с нуля, как и в структурах данных, таких как массивы и словари.
5. Извлеките ссылки со страницы, используя следующую строку:
links = page.get_links()
Все ссылки на указанной вами странице, в нашем случае на странице 1, будут извлечены и сохранены в переменной с именемlinks.
6. Чтобы просмотреть содержимое переменной link, распечатайте ее следующим образом:
print(links)
Выход:
Из распечатанного вывода обратите внимание, что ссылки на переменные содержат список словарей с парами ключ-значение. Каждая ссылка на странице представлена словарем, при этом фактическая ссылка хранится под ключом «uri».
7. Чтобы получить ссылки из списка объектов, хранящихся под именем переменной link, выполните итерацию по списку с помощью оператора for in и распечатайте конкретные ссылки, хранящиеся под ключом uri. Весь код, который это делает, показан ниже:
import fitz # Open the PDF file doc = fitz.open("games.pdf") # Print out the number of pages print(doc.page_count) # load the first page from the PDF page = doc.load_page(0) # extract all links from the page and store it under - links links = page.get_links() # print the links object #print(links) # print the actual links stored under the key "uri" for obj in links: print(obj["uri"])
Выход:
5 https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/ https://sparkian.com/ https://www.codemonkey.com/
8. Чтобы сделать наш код более пригодным для повторного использования, мы можем провести его рефакторинг, определив функцию для извлечения всех ссылок в PDF-файле и функцию для распечатки всех ссылок, найденных в PDF-файле. Таким образом, вы можете вызывать функции с любым PDF-файлом и получать обратно все ссылки в PDF-файле. Код, который это делает, показан ниже:
import fitz # Extract all the links in a PDF document def extract_link(path_to_pdf): links = [] doc = fitz.open(path_to_pdf) for page_num in range(doc.page_count): page = doc.load_page(page_num) page_links = page.get_links() links.extend(page_links) return links # print out all the links returned from the PDF document def print_all_links(links): for link in links: print(link["uri"]) # Call the function to extract all the links in a pdf # all the return links are stored under all_links all_links = extract_link("games.pdf") # call the function to print all links in the PDF print_all_links(all_links)
Выход:
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/ https://sparkian.com/ https://www.codemonkey.com/ https://scratch.mit.edu/ https://www.tynker.com/ https://codecombat.com/ https://lightbot.com/ https://sparkian.com
Из приведенного выше кода функция extract_link() получает PDF-файл, перебирает все страницы PDF-файла, извлекает все ссылки и возвращает их. Результат этой функции сохраняется в переменной с именем all_links.
Функция print_all_links() принимает результат Extract_link(), проходит по списку и печатает все фактические ссылки, найденные в PDF-файле, который вы передали в функцию Extract_link().
Чтобы извлечь изображения из PDF-файла, мы по-прежнему будем использовать PyMuPDF. Чтобы извлечь изображения из файла PDF:
1. Импортируйте PyMuPDF, io и PIL. Библиотека изображений Python (PIL) предоставляет инструменты, которые, помимо других функций, упрощают создание и сохранение изображений. io предоставляет классы для простой и эффективной обработки двоичных данных.
import fitz from io import BytesIO from PIL import Image
2. Откройте PDF-файл, из которого хотите извлечь изображения:
doc = fitz.open("games.pdf")
3. Загрузите страницу, из которой вы хотите извлечь изображения:
page = doc.load_page(0)
4. PyMuPdf идентифицирует изображения в файле PDF с помощью номера перекрестной ссылки (xref), который обычно является целым числом. Каждое изображение в PDF-файле имеет уникальную внешнюю ссылку. Поэтому, чтобы извлечь изображение из PDF-файла, нам сначала нужно получить номер внешней ссылки, который его идентифицирует. Чтобы получить номера внешних ссылок изображений на странице, мы используем функцию get_images() следующим образом:
image_xref = page.get_images() print(image_xref)
Выход:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
get_images() возвращает список кортежей с информацией об изображении. Поскольку на первой странице у нас есть только одно изображение, кортеж будет только один. Первый элемент кортежа представляет внешнюю ссылку на изображение на странице. Следовательно, внешняя ссылка изображения на первой странице равна 7.
5. Чтобы извлечь значение внешней ссылки для изображения из списка кортежей, мы используем приведенный ниже код:
# get xref value of the image xref_value = image_xref[0][0] print(xref_value)
Выход:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')] 7
6. Поскольку теперь у вас есть внешняя ссылка, идентифицирующая изображение в PDF-файле, вы можете извлечь изображение с помощью функции extract_image() следующим образом:
img_dictionary = doc.extract_image(xref_value)
Однако эта функция не возвращает фактическое изображение. Вместо этого он возвращает словарь, содержащий, среди прочего, двоичные данные изображения и метаданные об изображении.
7. В словаре, возвращаемом функцией extract_image(), проверьте расширение файла извлеченного изображения. Расширение файла хранится под ключом «ext»:
# get file extenstion img_extension = img_dictionary["ext"] print(img_extension)
Выход:
png
8. Извлеките двоичные файлы изображений из словаря, хранящегося в img_dictionary. Двоичные файлы изображений хранятся под ключом «image».
# get the actual image binary data img_binary = img_dictionary["image"]
9. Создайте объект BytesIO и инициализируйте его двоичными данными изображения, представляющими изображение. При этом создается файлоподобный объект, который может быть обработан библиотеками Python, такими как PIL, чтобы вы могли сохранить изображение.
# create a BytesIO object to work with the image bytes image_io = BytesIO(img_binary)
10. Откройте и проанализируйте данные изображения, хранящиеся в объекте BytesIO с именем image_io, с помощью библиотеки PIL. Это важно, поскольку позволяет библиотеке PIL определить формат изображения, с которым вы пытаетесь работать, в данном случае PNG. После определения формата изображения PIL создает объект изображения, которым можно манипулировать с помощью функций и методов PIL, таких как метод save(), для сохранения изображения в локальном хранилище.
# open the image using Pillow image = Image.open(image_io)
11. Укажите путь, по которому вы хотите сохранить изображение.
output_path = "image_1.png"
Поскольку указанный выше путь содержит только имя файла с его расширением, извлеченное изображение будет сохранено в том же каталоге, что и файл Python, содержащий эту программу. Изображение будет сохранено как image_1.png. Расширение PNG важно, чтобы оно соответствовало исходному расширению изображения.
12. Сохраните изображение и закройте объект ByteIO.
# save the image image.save(output_path) # Close the BytesIO object image_io.close()
Полный код для извлечения изображения из файла PDF показан ниже:
import fitz from io import BytesIO from PIL import Image doc = fitz.open("games.pdf") page = doc.load_page(0) # get a cross reference(xref) to the image image_xref = page.get_images() # get the actual xref value of the image xref_value = image_xref[0][0] # extract the image img_dictionary = doc.extract_image(xref_value) # get file extenstion img_extension = img_dictionary["ext"] # get the actual image binary data img_binary = img_dictionary["image"] # create a BytesIO object to work with the image bytes image_io = BytesIO(img_binary) # open the image using PIL library image = Image.open(image_io) #specify the path where you want to save the image output_path = "image_1.png" # save the image image.save(output_path) # Close the BytesIO object image_io.close()
Запустите код и перейдите в папку, содержащую ваш файл Python; вы должны увидеть извлеченное изображение с именем image_1.png, как показано ниже:
Заключение
Чтобы попрактиковаться в извлечении ссылок, изображений и текста из PDF-файлов, попробуйте выполнить рефакторинг кода в примерах, чтобы сделать их более пригодными для повторного использования, как показано в примере со ссылками. Таким образом, вам нужно будет передать только PDF-файл, и ваша программа Python извлечет все ссылки, изображения или текст из всего PDF-файла. Приятного кодирования!
Вы также можете изучить некоторые лучшие API-интерфейсы PDF для любых бизнес-задач.