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.