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

Razumevanje rada sa PDF dokumentima u Pythonu

Python, kao vrlo prilagodljiv programski jezik, često se koristi za rad s različitim vrstama datoteka, uključujući i popularni Portable Document Format, poznatiji kao PDF. Programeri Python-a se neretko susreću s potrebom izdvajanja informacija iz PDF-ova kako bi ih mogli dalje obrađivati.

PDF dokumenti mogu sadržati različite elemente kao što su tekst, slike i hiperveze. Za razliku od uobičajenih struktura podataka u Python-u, poput listi ili rečnika, izvlačenje podataka iz PDF-a može se činiti izazovnim. Međutim, postoje brojne biblioteke koje olakšavaju ovaj proces. U nastavku ćemo istražiti kako možete izvući tekst, linkove i slike iz PDF datoteka koristeći Python.

Pre nego što započnemo, potrebno je preuzeti primer PDF dokumenta i smestiti ga u isti direktorijum u kojem će se nalaziti i vaša Python skripta.

Izvlačenje teksta iz PDF-a

Za izvlačenje teksta iz PDF dokumenata koristićemo biblioteku PyPDF2. To je besplatna Python biblioteka otvorenog koda koja omogućava manipulaciju PDF dokumentima, uključujući spajanje, sečenje i transformaciju stranica. Iako je njena primarna svrha raznolika, PyPDF2 takođe efikasno izvlači tekst iz PDF-ova.

Da biste koristili PyPDF2, potrebno je instalirati je putem pip-a, Python-ovog instalacionog alata:

  1. Prvo, proverite da li je pip već instaliran na vašem sistemu. Otvorite terminal i izvršite komandu:
    pip --version

    Ako pip nije instaliran, nećete dobiti broj verzije.

  2. Za instalaciju pip-a, preuzmite instalacionu skriptu klikom na get-pip. Sačuvajte datoteku pod nazivom get-pip.py.
  3. Otvorite terminal, navigirajte do direktorijuma gde ste sačuvali get-pip.py i izvršite komandu:
    sudo python3 get-pip.py

    Ovo će instalirati pip na vašem sistemu.

  4. Ponovo proverite instalaciju pip-a:
    pip --version

    Sada bi trebalo da dobijete broj verzije.

Nakon instalacije pip-a, možemo instalirati PyPDF2:

  1. U terminalu izvršite:
    pip install PyPDF2
  2. Kreirajte novu Python datoteku i uvezite klasu PdfReader iz biblioteke PyPDF2:
    from PyPDF2 import PdfReader

    PyPDF2 nudi različite klase za rad s PDF-ovima. Jedna od njih je PdfReader, koja omogućava otvaranje PDF-ova, čitanje sadržaja i izdvajanje teksta.

  3. Da biste pristupili PDF-u, kreirajte instancu klase PdfReader:
    reader = PdfReader('games.pdf')

    Ovo priprema instancu za pristup sadržaju PDF datoteke.

  4. Proverite broj stranica u PDF-u:
    print(len(reader.pages))

    Izlaz bi trebalo da bude:

    5
  5. Pristupite određenoj stranici, na primer prvoj (indeks 0):
    page1 = reader.pages[0]
  6. Izdvojite tekst sa te stranice:
    textPage1 = page1.extract_text()
  7. Prikažite izdvojeni tekst:
    print(textPage1)

Kompletan kod za izdvajanje teksta sa prve stranice PDF-a:

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

Izvlačenje hiperveza iz PDF-a

Za izdvajanje hiperveza iz PDF dokumenata koristićemo biblioteku PyMuPDF, koja je Python biblioteka za manipulaciju PDF dokumentima. Da biste koristili ovu biblioteku, preporučuje se Python 3.8 ili noviji. Instalacija se vrši putem pip-a:

  1. U terminalu pokrenite:
    pip install PyMuPDF
  2. Uvezite PyMuPDF u vašu Python datoteku:
    import fitz
  3. Otvorite PDF datoteku:
    doc = fitz.open("games.pdf")
  4. Proverite broj stranica u PDF-u:
    print(doc.page_count)

    Očekivani izlaz:

    5
  5. Učitajte željenu stranicu (npr. prvu):
    page = doc.load_page(0)
  6. Izdvojite sve veze sa te stranice:
    links = page.get_links()
  7. Prikažite sve veze:
    print(links)

    Izlaz će biti lista rečnika, gde se svaka veza nalazi pod ključem „uri“.

  8. Izvucite samo URL adrese:
    for obj in links:
      print(obj["uri"])
    		

Primer koda za izdvajanje linkova sa prve stranice:

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"])

Za lakšu upotrebu, možemo napraviti funkcije za ekstrakciju i ispisivanje linkova:

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)

Izvlačenje slika iz PDF-a

Za izdvajanje slika iz PDF dokumenata, koristićemo PyMuPDF uz pomoć biblioteka io i PIL (Python Imaging Library). io se koristi za rad s binarnim podacima, dok PIL omogućava kreiranje, manipulaciju i čuvanje slika.

  1. Uvezite potrebne biblioteke:
    import fitz
    from io import BytesIO
    from PIL import Image
    		
  2. Otvorite PDF datoteku:
    doc = fitz.open("games.pdf")
  3. Učitajte željenu stranicu (npr. prvu):
    page = doc.load_page(0)
  4. Preuzmite liste svih slika (cross reference – xref):
    image_xref = page.get_images()
    print(image_xref)

    Svaka slika ima jedinstveni xref broj.

  5. Iz liste izvuci prvi xref broj:
    xref_value = image_xref[0][0]
    print(xref_value)
  6. Izdvojite informacije o slici:
    img_dictionary = doc.extract_image(xref_value)
  7. Preuzmite ekstenziju datoteke (npr. png):
    img_extension = img_dictionary["ext"]
    print(img_extension)
  8. Preuzmite binarne podatke slike:
    img_binary = img_dictionary["image"]
  9. Napravite BytesIO objekat od binarnih podataka:
    image_io = BytesIO(img_binary)
  10. Otvorite sliku pomoću PIL biblioteke:
    image = Image.open(image_io)
  11. Odredite putanju gde želite sačuvati sliku (npr. image_1.png):
    output_path = "image_1.png"
  12. Sačuvajte sliku i zatvorite BytesIO objekat:
    image.save(output_path)
    image_io.close()
    		

Kompletan kod za izvlačenje slike sa prve stranice PDF-a:

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

Zaključak

Ovo su osnovne metode za izdvajanje teksta, linkova i slika iz PDF dokumenata. Da biste stekli više iskustva, možete refaktorisati kodove u primerima, tako da budu fleksibilniji i mogu obrađivati više PDF datoteka. Na ovaj način, biće dovoljno proslediti PDF datoteku, a Python program će izdvojiti sve tražene podatke. Srećno kodiranje!

Takođe, možete istražiti razne PDF API-je za specifične poslovne potrebe.