Како издвојити текст, везе и слике из ПДФ датотека користећи Питхон

Питхон је веома свестран језик, а програмери Питхон-а често морају да раде са разним датотекама и добијају информације ускладиштене у њима за обраду. Један популаран формат датотеке са којим ћете се сигурно сусрести као Питхон програмер је Портабле Доцумент Формат популарно познат као ПДФ

ПДФ датотеке могу да садрже текст, слике и везе. Када обрађујете податке у Питхон програму, можда ћете морати да издвојите податке ускладиштене у ПДФ документу. За разлику од структура података као што су тупле, листе и речници, добијање информација ускладиштених у ПДФ документу може изгледати као тешка ствар.

Срећом, постоји велики број библиотека које олакшавају рад са ПДФ-овима и издвајање података ускладиштених у ПДФ датотекама. Да бисте сазнали више о овим различитим библиотекама, погледајмо како можете издвојити текстове, везе и слике из ПДФ датотека. Да бисте наставили даље, преузмите следећу ПДФ датотеку и сачувајте је у истом директоријуму као и ваш Питхон програмски фајл.

Да бисмо издвојили текст из ПДФ датотека помоћу Питхон-а, користићемо ПиПДФ2 библиотека. ПиПДФ2 је бесплатна Питхон библиотека отвореног кода која се може користити за спајање, исецање и трансформацију страница ПДФ датотека. Може додати прилагођене податке, опције прегледа и лозинке у ПДФ датотеке. Важно је, међутим, да ПиПДФ2 може да преузме текст из ПДФ датотека.

Да бисте користили ПиПДФ2 за издвајање текста из ПДФ датотека, инсталирајте га користећи пип, који је инсталатер пакета за Питхон. пип вам омогућава да инсталирате различите Питхон пакете на вашу машину:

1. Проверите да ли већ имате инсталиран пип тако што ћете покренути:

pip --version

Ако не добијете назад број верзије, то значи да пип није инсталиран.

2. Да бисте инсталирали пип, кликните на добити пип да бисте преузели његову инсталациону скрипту.

Веза отвара страницу са скриптом за инсталирање пип-а као што је приказано испод:

Кликните десним тастером миша на страницу и кликните на Сачувај као да бисте сачували датотеку. Подразумевано, име датотеке је гет-пип.пи

Отворите терминал и идите до директоријума са датотеком гет-пип.пи коју сте управо преузели, а затим покрените команду:

sudo python3 get-pip.py

Ово би требало да инсталира пип као што је приказано у наставку:

3. Проверите да ли је пип успешно инсталиран тако што ћете покренути:

pip --version

Ако успете, требало би да добијете број верзије:

Са инсталираним пип-ом, сада можемо да почнемо да радимо са ПиПДФ2.

1. Инсталирајте ПиПДФ2 тако што ћете извршити следећу команду у терминалу:

pip install PyPDF2

2. Направите Питхон датотеку и увезите ПдфРеадер из ПиПДФ2 користећи следећи ред:

from PyPDF2 import PdfReader

ПиПДФ2 библиотека пружа разне класе за рад са ПДФ датотекама. Једна таква класа је ПдфРеадер, која се може користити за отварање ПДФ датотека, читање садржаја и издвајање текста из ПДФ датотека, између осталог.

3. Да бисте почели да радите са ПДФ датотеком, прво морате да отворите датотеку. Да бисте то урадили, креирајте инстанцу класе ПдфРеадер и проследите ПДФ датотеку са којом желите да радите:

reader = PdfReader('games.pdf')

Горња линија инстанцира ПдфРеадер и припрема га за приступ садржају ПДФ датотеке коју наведете. Инстанца се чува у променљивој која се зове читач, која ће морати да приступи разним методама и својствима доступним у класи ПдфРеадер.

  Како пронаћи серијски број свог лаптопа за сервис и преузимање драјвера

4. Да бисте видели да ли све функционише добро, одштампајте број страница у ПДФ-у који сте унели користећи следећи код:

print(len(reader.pages))

Излаз:

5

5. Пошто наша ПДФ датотека има 5 страница, можемо приступити свакој страници доступној у ПДФ-у. Међутим, бројање почиње од 0, баш као и Пајтонова конвенција индексирања. Према томе, прва страница у пдф датотеци ће бити страница број 0. Да бисте преузели прву страницу ПДФ-а, додајте следећи ред свом коду:

page1 = reader.pages[0]

Горња линија преузима прву страницу у ПДФ датотеци и чува је у променљивој под називом паге1.

6. Да бисте издвојили текст на првој страници ПДФ датотеке, додајте следећи ред:

textPage1 = page1.extract_text()

Ово издваја текст на првој страници ПДФ-а и чува садржај у променљивој под називом тектПаге1. Тако имате приступ тексту на првој страници ПДФ датотеке преко променљиве тектПаге1.

7. Да бисте потврдили да је текст успешно извучен, можете одштампати садржај променљиве тектПаге1. Цео наш код, који такође штампа текст на првој страници ПДФ датотеке, приказан је у наставку:

# 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)

Излаз:

Да бисмо издвојили везе из ПДФ датотека, идемо на ПиМуПДФ, што је Питхон библиотека за издвајање, анализу, конвертовање и манипулисање подацима ускладиштеним у документима као што су ПДФ-ови. Да бисте користили ПиМуПДФ, требало би да имате Питхон 3.8 или новији. Започети:

1. Инсталирајте ПиМуПДФ тако што ћете извршити следећи ред у терминалу:

pip install PyMuPDF

2. Увезите ПиМуПДФ у своју Питхон датотеку користећи следећу изјаву:

import fitz

3. Да бисте приступили ПДФ-у из којег желите да издвојите везе, прво морате да га отворите. Да бисте га отворили, унесите следећи ред:

doc = fitz.open("games.pdf")

4. Након отварања ПДФ датотеке, одштампајте број страница у ПДФ-у користећи следећи ред:

print(doc.page_count)

Излаз:

5

4. Да бисмо издвојили везе са странице у ПДФ датотеци, морамо да учитамо страницу са које желимо да издвојимо везе. Да бисте учитали страницу, унесите следећи ред, где уносите број странице коју желите да учитате у функцију која се зове лоад_паге()

page = doc.load_page(0)

Да бисмо издвојили везе са прве странице, преносимо 0(нула). Бројање страница почиње од нуле баш као у структурама података као што су низови и речници.

5. Извуците везе са странице користећи следећи ред:

links = page.get_links()

Све везе на страници коју сте навели, у нашем случају, на страници 1, биће издвојене и сачуване у променљивој која се зове линкови

6. Да бисте видели садржај варијабле линкова, одштампајте га на следећи начин:

print(links)

Излаз:

Из одштампаног излаза приметите да везе променљивих садрже листу речника са паровима кључ/вредност. Свака веза на страници је представљена речником, са стварним линком ускладиштеним под кључем „ури“

  Како тестирати ПСУ помоћу мултиметра

7. Да бисте добили везе са листе објеката ускладиштених под именима променљиве линкови, итерирајте кроз листу користећи фор ин наредбу и одштампајте специфичне везе ускладиштене под кључем ури. Цео код који ово ради је приказан испод:

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. Да бисмо наш код учинили више употребљивим, можемо га рефакторирати тако што ћемо дефинисати функцију за издвајање свих веза у ПДФ-у и функцију за штампање свих веза пронађених у ПДФ-у. На овај начин можете позвати функције са било којим ПДФ-ом и добићете све везе у ПДФ-у. Код који то ради је приказан испод:

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

Из кода изнад, функција ектрацт_линк() прима ПДФ датотеку, понавља све странице у ПДФ-у, издваја све везе и враћа их. Резултат ове функције се чува у променљивој под називом алл_линкс

Функција принт_алл_линкс() узима резултат функције ектрацт_линк(), пролази кроз листу и штампа све стварне везе пронађене у ПДФ-у који сте проследили функцији ектрацт_линк().

Да бисмо издвојили слике из ПДФ-а, и даље ћемо користити ПиМуПДФ. Да бисте издвојили слике из ПДФ датотеке:

1. Увезите ПиМуПДФ, ио и ПИЛ. Питхон Имагинг Либрари (ПИЛ) пружа алате који олакшавају креирање и чување слика, између осталих функција. ио пружа класе за лако и ефикасно руковање бинарним подацима.

import fitz
from io import BytesIO
from PIL import Image

2. Отворите ПДФ датотеку из које желите да издвојите слике:

doc = fitz.open("games.pdf")

3. Учитајте страницу са које желите да издвојите слике:

page = doc.load_page(0)

4. ПиМуПдф идентификује слике у ПДФ датотеци користећи унакрсни референтни број (креф), који је обично цео број. Свака слика у ПДФ датотеци има јединствени креф. Стога, да бисмо издвојили слику из ПДФ-а, прво морамо да добијемо креф број који је идентификује. Да бисмо добили креф број слика на страници, користимо функцију гет_имагес() на следећи начин:

image_xref = page.get_images()
print(image_xref)

Излаз:

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

гет_имагес() враћа листу торки са информацијама о слици. Пошто имамо само једну слику на првој страници, постоји само једна тупле. Први елемент у тупле представља креф слике на страници. Дакле, креф слике на првој страници је 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. Пошто сада имате креф који идентификује слику у ПДФ-у, можете издвојити слику помоћу функције ектрацт_имаге() на следећи начин:

img_dictionary = doc.extract_image(xref_value)

Ова функција, међутим, не враћа стварну слику. Уместо тога, враћа речник који садржи бинарне податке о слици и метаподатке о слици, између осталог.

  Популарна апликација за управљање пројектима Басецамп сада доступна на Андроиду

7. Из речника који враћа функција ектрацт_имаге(), проверите екстензију датотеке екстраховане слике. Екстензија датотеке се чува под кључем „ект“:

# get file extenstion
img_extension = img_dictionary["ext"]
print(img_extension)

Излаз:

png

8. Извуците бинарне слике из речника ускладиштеног у имг_дицтионари. Бинарне слике се чувају под кључем „имаге“

# get the actual image binary data
img_binary = img_dictionary["image"]

9. Креирајте БитесИО објекат и иницијализујте га са бинарним подацима слике који представљају слику. Ово ствара објекат сличан фајлу који могу да обрађују Питхон библиотеке као што је ПИЛ тако да можете да сачувате слику.

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

10. Отворите и рашчланите податке слике ускладиштене у БитесИО објекту под називом имаге_ио користећи ПИЛ библиотеку. Ово је важно јер омогућава ПИЛ библиотеци да одреди формат слике слике са којом покушавате да радите, у овом случају, ПНГ. Након што открије формат слике, ПИЛ креира објекат слике којим се може манипулисати помоћу ПИЛ функција и метода, као што је метода саве(), да би се слика сачувала у локалној меморији.

# open the image using Pillow
image = Image.open(image_io)

11. Одредите путању где желите да сачувате слику.

output_path = "image_1.png"

Пошто горња путања садржи само име датотеке са њеном екстензијом, извучена слика ће бити сачувана у истом директоријуму као и Питхон датотека која садржи овај програм. Слика ће бити сачувана као имаге_1.пнг. ПНГ екстензија је важна да би одговарала оригиналном проширењу слике.

12. Сачувајте слику и затворите БитеИО објекат.

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

Цео код за издвајање слике из ПДФ датотеке приказан је у наставку:

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()

Покрените код и идите у фасциклу која садржи вашу Питхон датотеку; требало би да видите извучену слику под називом имаге_1.пнг, као што је приказано у наставку:

Закључак

Да бисте добили више праксе са издвајањем веза, слика и текстова из ПДФ-ова, покушајте да рефакторишете код у примерима да бисте их учинили више употребљивим, као што је приказано у примеру веза. На овај начин, мораћете само да проследите ПДФ датотеку, а ваш Питхон програм ће издвојити све везе, слике или текст у целом ПДФ-у. Срећно кодирање!

Такође можете истражити неке најбоље ПДФ АПИ-је за сваку пословну потребу.