Πώς να εξάγετε κείμενο, συνδέσμους και εικόνες από αρχεία PDF χρησιμοποιώντας Python

Η Python είναι μια πολύ ευέλικτη γλώσσα και οι προγραμματιστές της Python συχνά πρέπει να εργαστούν με μια ποικιλία αρχείων και να λάβουν πληροφορίες που είναι αποθηκευμένες σε αυτά για επεξεργασία. Μια δημοφιλής μορφή αρχείου που πρόκειται να συναντήσετε ως προγραμματιστής Python είναι η φορητή μορφή εγγράφου που είναι ευρέως γνωστή ως 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.
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. Για να δείτε το περιεχόμενο της μεταβλητής συνδέσμων, εκτυπώστε την ως εξής:
print(links)
Παραγωγή:
Από το έντυπο αποτέλεσμα, παρατηρήστε ότι οι σύνδεσμοι μεταβλητών περιέχουν μια λίστα λεξικών με ζεύγη κλειδιών-τιμών. Κάθε σύνδεσμος στη σελίδα αντιπροσωπεύεται από ένα λεξικό, με τον πραγματικό σύνδεσμο να είναι αποθηκευμένος κάτω από το κλειδί “uri”
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)
Αυτή η λειτουργία, ωστόσο, δεν επιστρέφει την πραγματική εικόνα. Αντίθετα, επιστρέφει ένα λεξικό που περιέχει τα δεδομένα δυαδικής εικόνας της εικόνας και μεταδεδομένα για την εικόνα, μεταξύ άλλων.
7. Από το λεξικό που επιστρέφεται από τη συνάρτηση extract_image(), ελέγξτε την επέκταση αρχείου της εξαγόμενης εικόνας. Η επέκταση αρχείου αποθηκεύεται κάτω από το κλειδί “ext”:
# get file extenstion img_extension = img_dictionary["ext"] print(img_extension)
Παραγωγή:
png
8. Εξάγετε τα δυαδικά αρχεία εικόνας από το λεξικό που είναι αποθηκευμένο στο img_dictionary. Τα δυαδικά αρχεία εικόνας αποθηκεύονται κάτω από το κλειδί “εικόνα”
# 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, όπως η μέθοδος αποθήκευση(), για την αποθήκευση της εικόνας στην τοπική αποθήκευση.
# 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. Καλή Κωδικοποίηση!
Μπορείτε επίσης να εξερευνήσετε μερικά καλύτερα API PDF για κάθε επιχειρηματική ανάγκη.