Как да извлечете текст, връзки и изображения от PDF файлове с помощта на Python

Python е много гъвкав език и разработчиците на Python често трябва да работят с различни файлове и да получават съхранена в тях информация за обработка. Един популярен файлов формат, който непременно ще срещнете като разработчик на Python, е Portable Document Format, известен като 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.

  Как да вградите Google формуляр в имейл

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, ще бъдат извлечени и съхранени в променливата, наречена връзки

6. За да видите съдържанието на променливата links, отпечатайте го така:

print(links)

Изход:

От отпечатания изход забележете, че променливите връзки съдържат списък от речници с двойки ключ-стойност. Всяка връзка на страницата е представена от речник, като действителната връзка се съхранява под ключа „uri“

  Как да пингувате на iPhone

7. За да получите връзките от списъка с обекти, съхранени под връзките на името на променливата, преминете през списъка с помощта на оператор 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 Imaging Library (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 файл има уникална xref. Следователно, за да извлечем изображение от PDF, първо трябва да получим xref номера, който го идентифицира. За да получим xref номера на изображенията на страница, използваме функцията get_images() по следния начин:

image_xref = page.get_images()
print(image_xref)

Изход:

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

get_images() връща списък от кортежи с информация за изображението. Тъй като имаме само едно изображение на първата страница, има само един кортеж. Първият елемент в кортежа представлява xref на изображението на страницата. Следователно xref на изображението на първата страница е 7.

5. За да извлечем xref стойността за изображението от списъка с кортежи, използваме кода по-долу:

# 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. Тъй като вече имате xref, който идентифицира изображение в PDF файла, можете да извлечете изображението с помощта на функцията extract_image() по следния начин:

img_dictionary = doc.extract_image(xref_value)

Тази функция обаче не връща действителното изображение. Вместо това той връща речник, съдържащ двоичните данни за изображението и метаданни за изображението, наред с други неща.

  Как Mac ще премине от Intel към собствените ARM чипове на Apple

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 файл. Честито кодиране!

Можете също така да разгледате някои от най-добрите PDF API за всяка бизнес нужда.