Як витягти текст, посилання та зображення з PDF-файлів за допомогою Python

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

Python, як багатофункціональна мова програмування, часто вимагає від розробників взаємодії з різними типами файлів, щоб отримати необхідну для обробки інформацію. Серед них PDF (Portable Document Format) є одним з найпоширеніших форматів, з яким доводиться працювати.

PDF-файли можуть включати текст, ілюстрації та гіперпосилання. У процесі обробки даних у Python може виникнути потреба в отриманні цих даних з PDF-документів. На відміну від, наприклад, кортежів, списків чи словників, видобування даних з PDF може здаватися складним.

На щастя, існує ряд бібліотек, що спрощують цю задачу. Давайте подивимося, як витягувати текст, посилання та зображення з PDF-файлів. Для цього вам знадобиться завантажити приклад PDF-файлу та зберегти його в тій же папці, де знаходиться ваш файл Python.

Видобування тексту з PDF-файлів

Для отримання тексту з PDF-документів за допомогою Python ми скористаємося бібліотекою PyPDF2. Це безкоштовна бібліотека з відкритим кодом, призначена для об’єднання, обрізання та перетворення PDF-сторінок. PyPDF2 також дозволяє додавати власні дані, параметри перегляду та паролі до PDF-файлів, а що найважливіше, видобувати з них текст.

Щоб використовувати PyPDF2, спочатку необхідно її встановити за допомогою pip, пакетного менеджера для Python.

Інструкція з встановлення pip:

  1. Перевірте, чи встановлено pip, виконавши в терміналі команду: pip --version. Якщо версія не відображається, pip не встановлено.
  2. Для встановлення pip перейдіть за посиланням get-pip.py та завантажте скрипт.
  3. Збережіть файл (за замовчуванням “get-pip.py”).
  4. Відкрийте термінал, перейдіть в каталог з завантаженим файлом та виконайте команду: sudo python3 get-pip.py. Це встановить pip.
  5. Щоб перевірити успішність встановлення, виконайте pip --version. Якщо все гаразд, ви побачите номер версії.

Встановлення та використання PyPDF2:

  1. Встановіть PyPDF2, виконавши в терміналі: pip install PyPDF2.
  2. Створіть Python-файл та імпортуйте клас PdfReader: from PyPDF2 import PdfReader.
  3. Клас PdfReader дозволяє відкривати PDF-файли, читати їх вміст і видобувати текст.
  4. Для початку роботи з PDF-файлом, створіть екземпляр класу PdfReader, передавши йому назву PDF-файлу: reader = PdfReader('games.pdf').
  5. Перевірте кількість сторінок у файлі: print(len(reader.pages)).
  6. Вивід:

    5

  7. Отримайте доступ до першої сторінки (індексація починається з 0): page1 = reader.pages[0].
  8. Витягніть текст з першої сторінки: textPage1 = page1.extract_text().
  9. Надрукуйте витягнутий текст: print(textPage1).

Повний код для видобування тексту:

    
# імпорт класу PdfReader з PyPDF2
from PyPDF2 import PdfReader

# створення екземпляра класу PdfReader
reader = PdfReader('games.pdf')

# отримання кількості сторінок у PDF-файлі
print(len(reader.pages))

# доступ до першої сторінки PDF
page1 = reader.pages[0]

# вилучення тексту з першої сторінки PDF-файлу
textPage1 = page1.extract_text()

# друк вилученого тексту
print(textPage1)
    
  

Вивід:

Видобування посилань з PDF-файлів

Для отримання посилань з PDF ми використаємо бібліотеку PyMuPDF. Вона призначена для вилучення, аналізу, перетворення та обробки даних, що зберігаються в документах PDF. PyMuPDF вимагає Python 3.8 або новішої версії.

  1. Встановіть PyMuPDF, виконавши в терміналі: pip install PyMuPDF.
  2. Імпортуйте бібліотеку в файл: import fitz.
  3. Відкрийте PDF-файл: doc = fitz.open("games.pdf").
  4. Виведіть кількість сторінок: print(doc.page_count).
  5. Вивід:

    5

  6. Завантажте сторінку, з якої хочете отримати посилання (знову ж таки, нумерація починається з 0): page = doc.load_page(0).
  7. Витягніть посилання зі сторінки: links = page.get_links().
  8. Подивіться на об’єкт links: print(links).
  9. Вивід:

    Зверніть увагу, що посилання зберігаються як список словників, де ключ ‘uri’ містить саме посилання.

  10. Отримайте всі посилання з об’єкта links:
    
import fitz

# відкриття PDF-файлу
doc = fitz.open("games.pdf")

# виведення кількості сторінок
print(doc.page_count)

# завантаження першої сторінки
page = doc.load_page(0)

# видобування посилань зі сторінки
links = page.get_links()

# виведення списку об'єктів links
#print(links) 

# виведення фактичних посилань, які зберігаються під ключем "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/
    

Для зручності ми можемо об’єднати код у функції:

    
import fitz

# функція вилучення посилань з PDF-документу
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

# функція для виводу посилань, отриманих з PDF-документу
def print_all_links(links):
  for link in links:
    print(link["uri"])

# виклик функції для вилучення всіх посилань
all_links = extract_link("games.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
    

Видобування зображень з PDF-файлів

Для видобування зображень з PDF ми знову скористаємось бібліотекою PyMuPDF, а також бібліотеками io та PIL.

  1. Імпортуйте необхідні бібліотеки: import fitz from io import BytesIO from PIL import Image
  2. Відкрийте PDF-файл: doc = fitz.open("games.pdf").
  3. Завантажте сторінку: page = doc.load_page(0).
  4. Отримайте перехресні посилання (xref) на зображення: image_xref = page.get_images(); print(image_xref).
  5. Вивід:

    [(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]

    Функція get_images() повертає список кортежів, де перший елемент кортежу – це перехресне посилання на зображення.

  6. Отримайте значення xref: xref_value = image_xref[0][0]; print(xref_value).
  7. Вивід:

    [(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
    7

  8. Витягніть зображення: img_dictionary = doc.extract_image(xref_value).
  9. Ця функція повертає словник з бінарними даними зображення та його метаданими.

  10. Отримайте розширення файлу зображення: img_extension = img_dictionary["ext"]; print(img_extension).
  11. Вивід:

    png

  12. Отримайте бінарні файли зображення: img_binary = img_dictionary["image"].
  13. Створіть об’єкт BytesIO та ініціалізуйте його бінарними даними зображення: image_io = BytesIO(img_binary).
  14. Відкрийте зображення за допомогою PIL: image = Image.open(image_io).
  15. Вкажіть шлях збереження зображення: output_path = "image_1.png".
  16. Збережіть зображення та закрийте об’єкт BytesIO: image.save(output_path); image_io.close().

Повний код:

    
import fitz
from io import BytesIO
from PIL import Image

doc = fitz.open("games.pdf")
page = doc.load_page(0)

# отримуємо перехресне посилання на зображення
image_xref = page.get_images()

# отримуємо значення xref
xref_value = image_xref[0][0]

# видобуваємо зображення
img_dictionary = doc.extract_image(xref_value)

# отримуємо розширення файлу
img_extension = img_dictionary["ext"]

# отримуємо бінарні файли зображення
img_binary = img_dictionary["image"]

# створюємо об'єкт BytesIO для роботи з байтами зображення
image_io = BytesIO(img_binary)

# відкриваємо зображення за допомогою PIL
image = Image.open(image_io)

# вказуємо шлях, куди треба зберегти зображення
output_path = "image_1.png"

# зберігаємо зображення
image.save(output_path)

# закриваємо об'єкт BytesIO 
image_io.close()
    
 

Після запуску коду в тій же папці, де і файл Python, ви побачите витягнуте зображення під назвою “image_1.png”.

Висновок

Для поглиблення навичок з видобування посилань, зображень і тексту з PDF-файлів, спробуйте реорганізувати код, щоб зробити його більш універсальним, як показано у прикладі з посиланнями. Завдяки цьому вам потрібно буде лише передати PDF-файл, і ваша програма Python витягне всі посилання, зображення або текст з усього файлу. Щасливого кодування!

Ви також можете ознайомитися з деякими найкращими PDF API для будь-яких бізнес-потреб.