Szöveg, hivatkozások és képek kibontása PDF-fájlokból Python használatával

A Python egy nagyon sokoldalú nyelv, és a Python fejlesztőknek gyakran sokféle fájllal kell dolgozniuk, és az azokban tárolt információkat kell beszerezniük a feldolgozáshoz. Az egyik népszerű fájlformátum, amellyel Python fejlesztőként biztosan találkoznia kell, a Portable Document Format, közismertebb nevén PDF

A PDF-fájlok szöveget, képeket és hivatkozásokat tartalmazhatnak. Amikor adatokat dolgoz fel Python programban, előfordulhat, hogy ki kell bontania a PDF-dokumentumban tárolt adatokat. Ellentétben az olyan adatstruktúrákkal, mint a sorok, listák és szótárak, a PDF-dokumentumokban tárolt információk megszerzése nehéz feladatnak tűnhet.

Szerencsére számos olyan könyvtár létezik, amelyek megkönnyítik a PDF-ekkel való munkát és a PDF-fájlokban tárolt adatok kibontását. Ha többet szeretne megtudni ezekről a különböző könyvtárakról, nézze meg, hogyan bonthat ki szövegeket, hivatkozásokat és képeket PDF-fájlokból. A folytatáshoz töltse le a következő PDF-fájlt, és mentse el ugyanabba a könyvtárba, mint a Python-programfájl.

Szöveg kinyeréséhez PDF-fájlokból Python használatával, a PyPDF2 könyvtár. A PyPDF2 egy ingyenes és nyílt forráskódú Python-könyvtár, amely PDF-fájlok oldalainak egyesítésére, vágására és átalakítására használható. Egyéni adatokat, megtekintési beállításokat és jelszavakat adhat a PDF-fájlokhoz. Fontos azonban, hogy a PyPDF2 képes letölteni szöveget PDF-fájlokból.

Ha a PyPDF2-vel szeretne szöveget kivonni PDF-fájlokból, telepítse a pip használatával, amely a Python csomagtelepítője. A pip lehetővé teszi, hogy különböző Python-csomagokat telepítsen a gépére:

1. Ellenőrizze, hogy telepítve van-e már a pip a következő futtatásával:

pip --version

Ha nem kap vissza egy verziószámot, az azt jelenti, hogy a pip nincs telepítve.

2. A pip telepítéséhez kattintson a gombra kap pip telepítőszkriptjének letöltéséhez.

A hivatkozás megnyit egy oldalt a pip telepítéséhez szükséges szkripttel az alábbiak szerint:

Kattintson a jobb gombbal az oldalra, majd kattintson a Mentés másként gombra a fájl mentéséhez. Alapértelmezés szerint a fájl neve get-pip.py

Nyissa meg a terminált, és keresse meg az imént letöltött get-pip.py fájlt tartalmazó könyvtárat, majd futtassa a parancsot:

sudo python3 get-pip.py

Ennek telepítenie kell a pip-et az alábbiak szerint:

3. Ellenőrizze, hogy a pip telepítése sikeresen megtörtént-e a következő futtatásával:

pip --version

Ha sikeres, akkor kap egy verziószámot:

A pip telepítése után elkezdhetjük dolgozni a PyPDF2-vel.

1. Telepítse a PyPDF2-t a következő parancs végrehajtásával a terminálon:

pip install PyPDF2

2. Hozzon létre egy Python-fájlt, és importálja a PdfReader-t a PyPDF2-ből a következő sor segítségével:

from PyPDF2 import PdfReader

A PyPDF2 könyvtár számos osztályt kínál a PDF fájlokkal való munkavégzéshez. Az egyik ilyen osztály a PdfReader, amellyel többek között PDF-fájlokat nyithatunk meg, olvashatjuk a tartalmat, illetve szöveget kinyerhetünk PDF-fájlokból.

3. A PDF-fájllal való munka megkezdéséhez először meg kell nyitnia a fájlt. Ehhez hozzon létre egy példányt a PdfReader osztályból, és adja át a PDF fájlt, amellyel dolgozni szeretne:

reader = PdfReader('games.pdf')

A fenti sor példányosítja a PdfReader-t, és felkészíti az Ön által megadott PDF-fájl tartalmának elérésére. A példány egy olvasó nevű változóban van tárolva, amelynek a PdfReader osztályban elérhető különféle metódusokhoz és tulajdonságokhoz kell hozzáférnie.

4. Annak ellenőrzéséhez, hogy minden rendben működik-e, nyomtassa ki a beküldött PDF oldalainak számát a következő kóddal:

print(len(reader.pages))

Kimenet:

5

5. Mivel a PDF fájlunk 5 oldalas, a PDF-ben elérhető minden oldalt elérhetjük. A számolás azonban 0-tól kezdődik, akárcsak a Python indexelési konvenciója. Ezért a pdf fájl első oldala a 0 oldalszámú lesz. A PDF első oldalának lekéréséhez adja hozzá a következő sort a kódjához:

page1 = reader.pages[0]

A fenti sor lekéri a PDF-fájl első oldalát, és egy page1 nevű változóban tárolja.

6. A PDF-fájl első oldalán lévő szöveg kibontásához adja hozzá a következő sort:

textPage1 = page1.extract_text()

Ez kivonja a szöveget a PDF első oldalán, és a tartalmat egy textPage1 nevű változóban tárolja. Így hozzáférhet a PDF-fájl első oldalán lévő szöveghez a textPage1 változón keresztül.

7. A szöveg sikeres kibontásának megerősítéséhez kinyomtathatja a textPage1 változó tartalmát. Alább látható a teljes kódunk, amely a PDF fájl első oldalán lévő szöveget is kinyomtatja:

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

Kimenet:

A hivatkozások PDF-fájlokból való kinyeréséhez a PyMuPDF-et használjuk, amely egy Python-könyvtár a dokumentumokban, például a PDF-ekben tárolt adatok kivonására, elemzésére, konvertálására és manipulálására. A PyMuPDF használatához Python 3.8 vagy újabb verzióra van szükség. A kezdéshez:

1. Telepítse a PyMuPDF-et a következő sor végrehajtásával a terminálban:

pip install PyMuPDF

2. Importálja a PyMuPDF-et a Python-fájlba a következő utasítással:

import fitz

3. Ahhoz, hogy hozzáférjen ahhoz a PDF-hez, amelyből hivatkozásokat szeretne kivonni, először meg kell nyitnia azt. Megnyitásához írja be a következő sort:

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

4. A PDF-fájl megnyitása után a következő sor segítségével nyomtassa ki a PDF-ben lévő oldalak számát:

print(doc.page_count)

Kimenet:

5

4. Ahhoz, hogy hivatkozásokat kinyerjünk a PDF-fájl egy oldaláról, be kell töltenünk azt az oldalt, amelyről linkeket szeretnénk kivonni. Oldal betöltéséhez írja be a következő sort, ahol adja meg a betölteni kívánt oldalszámot a load_page() nevű függvénybe.

page = doc.load_page(0)

Az első oldal hivatkozásainak kinyeréséhez 0 (nulla) értéket adunk meg. Az oldalak számlálása nulláról indul, csakúgy, mint az olyan adatstruktúrákban, mint a tömbök és a szótárak.

5. A következő sor segítségével bontsa ki a hivatkozásokat az oldalról:

links = page.get_links()

Az Ön által megadott oldalon, esetünkben az 1. oldalon lévő összes hivatkozás ki lesz bontva és a links nevű változóban tárolódik.

6. A linkek változó tartalmának megtekintéséhez nyomtassa ki a következőképpen:

print(links)

Kimenet:

A nyomtatott kimeneten figyelje meg, hogy a változóhivatkozások kulcs-érték párokat tartalmazó szótárak listáját tartalmazzák. Az oldalon minden hivatkozást egy szótár képvisel, a tényleges hivatkozást az „uri” kulcs alatt tároljuk.

7. Ha a hivatkozásokat a változónév hivatkozások alatt tárolt objektumok listájából szeretné lekérni, ismételje meg a listát a for in utasítás használatával, és nyomtassa ki az uri kulcs alatt tárolt konkrét hivatkozásokat. A teljes kód, amely ezt teszi, az alábbiakban látható:

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

Kimenet:

5
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/

8. A kódunk újrafelhasználhatóbbá tétele érdekében úgy alakíthatjuk át, hogy meghatározunk egy függvényt a PDF-ben található összes hivatkozás kinyerésére, és egy függvényt, amely kinyomtatja a PDF-ben található összes hivatkozást. Így bármelyik PDF-fájlban meghívhatja a függvényeket, és visszakapja a PDF-ben található összes hivatkozást. Az alábbiakban látható az ezt végrehajtó kód:

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)

Kimenet:

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

A fenti kódból az extract_link() függvény fogad egy PDF-fájlt, végigfut a PDF összes oldalán, kibontja az összes hivatkozást, és visszaküldi azokat. Ennek a függvénynek az eredménye egy all_links nevű változóban tárolódik

A print_all_links() függvény beveszi az extract_link() eredményét, végigfut a listán, és kinyomtatja a PDF-ben található összes tényleges hivatkozást az extract_link() függvénybe.

A képek PDF-ből való kinyeréséhez továbbra is a PyMuPDF-et fogjuk használni. Képek kinyerése PDF fájlból:

1. Importálja a PyMuPDF, io és PIL fájlokat. A Python Imaging Library (PIL) olyan eszközöket biztosít, amelyek megkönnyítik a képek létrehozását és mentését, többek között. Az io osztályokat biztosít a bináris adatok egyszerű és hatékony kezeléséhez.

import fitz
from io import BytesIO
from PIL import Image

2. Nyissa meg a PDF-fájlt, amelyből a képeket ki szeretné bontani:

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

3. Töltse be azt az oldalt, amelyről képeket szeretne kinyerni:

page = doc.load_page(0)

4. A PyMuPdf egy kereszthivatkozási szám (xref) segítségével azonosítja a PDF-fájlban lévő képeket, amely általában egy egész szám. A PDF-fájl minden képének egyedi xref-je van. Ezért egy kép PDF-ből való kinyeréséhez először meg kell szereznünk az azt azonosító xref számot. Az oldalon lévő képek xref számának meghatározásához a get_images() függvényt használjuk, így:

image_xref = page.get_images()
print(image_xref)

Kimenet:

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

A get_images() a képre vonatkozó információkat tartalmazó sorok listáját adja vissza. Mivel csak egy képünk van az első oldalon, csak egy sor van. A sor első eleme az oldalon lévő kép xref-jét jelenti. Ezért az első oldalon lévő kép xref-je 7.

5. A kép xref értékének kinyeréséhez a sorok listájából az alábbi kódot használjuk:

# get xref value of the image
xref_value = image_xref[0][0]
print(xref_value)

Kimenet:

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

6. Mivel most már megvan az xref, amely egy képet azonosít a PDF-ben, a képet az extract_image() függvény segítségével bonthatja ki, így:

img_dictionary = doc.extract_image(xref_value)

Ez a függvény azonban nem a tényleges képet adja vissza. Ehelyett egy szótárt ad vissza, amely többek között a kép bináris képadatait és a kép metaadatait tartalmazza.

7. Az extract_image() függvény által visszaadott szótárból ellenőrizze a kibontott kép fájlkiterjesztését. A fájl kiterjesztése az „ext“ kulcs alatt található:

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

Kimenet:

png

8. Bontsa ki a kép binárisokat az img_dictionaryban tárolt szótárból. A kép binárisok az „image” kulcs alatt vannak tárolva

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

9. Hozzon létre egy BytesIO objektumot, és inicializálja azt a képet reprezentáló bináris képadatokkal. Ez egy fájlszerű objektumot hoz létre, amelyet a Python-könyvtárak, például a PIL feldolgozhatnak, így elmentheti a képet.

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

10. Nyissa meg és elemezze az image_io nevű BytesIO objektumban tárolt képadatokat a PIL könyvtár segítségével. Ez azért fontos, mert lehetővé teszi a PIL-könyvtár számára, hogy meghatározza annak a képnek a képformátumát, amellyel dolgozni próbál, jelen esetben PNG-vel. A képformátum észlelése után a PIL létrehoz egy képobjektumot, amelyet PIL függvényekkel és módszerekkel lehet manipulálni, például a save() metódussal, hogy a képet a helyi tárhelyre mentse.

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

11. Adja meg az elérési utat, ahová a képet menteni szeretné.

output_path = "image_1.png"

Mivel a fenti elérési út csak a fájl nevét tartalmazza a kiterjesztésével, a kibontott kép ugyanabba a könyvtárba kerül mentésre, mint a programot tartalmazó Python fájl. A kép image_1.png néven kerül mentésre. A PNG kiterjesztés fontos, hogy megfeleljen a kép eredeti kiterjesztésének.

12. Mentse el a képet, és zárja be a ByteIO objektumot.

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

A kép PDF-fájlból való kivonásához szükséges teljes kód az alábbiakban látható:

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

Futtassa a kódot, és lépjen a Python-fájlt tartalmazó mappába; látnia kell az image_1.png nevű kibontott képet, az alábbiak szerint:

Következtetés

Ha többet szeretne gyakorolni a hivatkozások, képek és szövegek PDF-ekből való kinyerésében, próbálja meg a példákban szereplő kódot újra felhasználni, amint az a hivatkozási példában látható. Így csak egy PDF-fájlt kell átadnia, és a Python-programja kibontja az összes hivatkozást, képet vagy szöveget a teljes PDF-ben. Boldog kódolást!

Felfedezheti a legjobb PDF API-kat is minden üzleti igényhez.