Cách trích xuất văn bản, liên kết và hình ảnh từ tệp PDF bằng Python

Python là một ngôn ngữ rất linh hoạt và các nhà phát triển Python thường phải làm việc với nhiều loại tệp khác nhau và lấy thông tin được lưu trữ trong đó để xử lý. Một định dạng tệp phổ biến mà bạn nhất định gặp phải với tư cách là nhà phát triển Python là Định dạng Tài liệu Di động, thường được gọi là PDF.
Tệp PDF có thể chứa văn bản, hình ảnh và liên kết. Khi xử lý dữ liệu trong chương trình Python, bạn có thể thấy mình cần trích xuất dữ liệu được lưu trữ trong tài liệu PDF. Không giống như các cấu trúc dữ liệu như bộ dữ liệu, danh sách và từ điển, việc lấy thông tin được lưu trữ trong tài liệu PDF có vẻ là một điều khó thực hiện.
May mắn thay, có một số thư viện giúp bạn dễ dàng làm việc với tệp PDF và trích xuất dữ liệu được lưu trữ trong tệp PDF. Để tìm hiểu về các thư viện khác nhau này, chúng ta hãy xem cách bạn có thể trích xuất văn bản, liên kết và hình ảnh từ tệp PDF. Để làm theo, hãy tải xuống tệp PDF sau và lưu nó vào cùng thư mục với tệp chương trình Python của bạn.
Để trích xuất văn bản từ tệp PDF bằng Python, chúng tôi sẽ sử dụng PyPDF2 thư viện. PyPDF2 là thư viện Python mã nguồn mở và miễn phí, có thể được sử dụng để hợp nhất, cắt và chuyển đổi các trang của tệp PDF. Nó có thể thêm dữ liệu tùy chỉnh, tùy chọn xem và mật khẩu vào tệp PDF. Tuy nhiên, điều quan trọng là PyPDF2 có thể truy xuất văn bản từ các tệp PDF.
Để sử dụng PyPDF2 nhằm trích xuất văn bản từ tệp PDF, hãy cài đặt nó bằng pip, đây là trình cài đặt gói cho Python. pip cho phép bạn cài đặt các gói Python khác nhau trên máy của mình:
1. Kiểm tra xem bạn đã cài đặt pip chưa bằng cách chạy:
pip --version
Nếu bạn không lấy lại số phiên bản, điều đó có nghĩa là pip chưa được cài đặt.
2. Để cài đặt pip, nhấp vào nhận được pip để tải xuống tập lệnh cài đặt của nó.
Link mở ra một trang có script cài đặt pip như hình dưới đây:
Nhấp chuột phải vào trang và nhấp vào Lưu dưới dạng để lưu tệp. Theo mặc định, tên của tệp là get-pip.py
Mở terminal và điều hướng đến thư mục chứa tệp get-pip.py bạn vừa tải xuống rồi chạy lệnh:
sudo python3 get-pip.py
Điều này sẽ cài đặt pip như hình dưới đây:
3. Kiểm tra xem pip đã được cài đặt thành công chưa bằng cách chạy:
pip --version
Nếu thành công, bạn sẽ nhận được số phiên bản:
Sau khi cài đặt pip, giờ đây chúng ta có thể bắt đầu làm việc với PyPDF2.
1. Cài đặt PyPDF2 bằng cách thực hiện lệnh sau trong terminal:
pip install PyPDF2
2. Tạo tệp Python và nhập PdfReader từ PyPDF2 bằng dòng sau:
from PyPDF2 import PdfReader
Thư viện PyPDF2 cung cấp nhiều lớp khác nhau để làm việc với các tệp PDF. Một lớp như vậy là PdfReader, có thể được sử dụng để mở Tệp PDF, đọc nội dung và trích xuất văn bản từ tệp PDF, cùng nhiều thứ khác.
3. Để bắt đầu làm việc với tệp PDF, trước tiên bạn cần mở tệp. Để thực hiện việc này, hãy tạo một phiên bản của lớp PdfReader và chuyển vào tệp PDF bạn muốn làm việc:
reader = PdfReader('games.pdf')
Dòng trên khởi tạo PdfReader và chuẩn bị cho nó truy cập nội dung của tệp PDF mà bạn chỉ định. Phiên bản này được lưu trữ trong một biến có tên là reader, biến này sẽ phải truy cập vào nhiều phương thức và thuộc tính khác nhau có sẵn trong lớp PdfReader.
4. Để xem mọi thứ có hoạt động tốt hay không, hãy in ra số trang trong tệp PDF bạn đã chuyển vào bằng mã sau:
print(len(reader.pages))
Đầu ra:
5
5. Vì tệp PDF của chúng tôi có 5 trang nên chúng tôi có thể truy cập từng trang có sẵn trong tệp PDF. Tuy nhiên, việc đếm bắt đầu từ 0, giống như quy ước lập chỉ mục của Python. Do đó, trang đầu tiên trong tệp pdf sẽ là trang số 0. Để truy xuất trang đầu tiên của tệp PDF, hãy thêm dòng sau vào mã của bạn:
page1 = reader.pages[0]
Dòng trên lấy trang đầu tiên trong tệp PDF và lưu trữ nó trong một biến có tên page1.
6. Để trích xuất văn bản trên trang đầu tiên của tệp PDF, hãy thêm dòng sau:
textPage1 = page1.extract_text()
Thao tác này sẽ trích xuất văn bản trên trang đầu tiên của tệp PDF và lưu trữ nội dung trong một biến có tên là textPage1. Do đó, bạn có quyền truy cập vào văn bản trên trang đầu tiên của tệp PDF thông qua biến textPage1.
7. Để xác nhận văn bản đã được trích xuất thành công, bạn có thể in nội dung của biến textPage1. Toàn bộ mã của chúng tôi, cũng in văn bản trên trang đầu tiên của tệp PDF, được hiển thị bên dưới:
# 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)
Đầu ra:
Để trích xuất các liên kết từ tệp PDF, chúng ta sẽ truy cập PyMuPDF, một thư viện Python để trích xuất, phân tích, chuyển đổi và thao tác dữ liệu được lưu trữ trong các tài liệu như PDF. Để sử dụng PyMuPDF, bạn phải có Python 3.8 trở lên. Để bắt đầu:
1. Cài đặt PyMuPDF bằng cách thực hiện dòng sau trong terminal:
pip install PyMuPDF
2. Nhập PyMuPDF vào tệp Python của bạn bằng câu lệnh sau:
import fitz
3. Để truy cập tệp PDF mà bạn muốn trích xuất các liên kết từ đó, trước tiên bạn cần mở nó. Để mở nó, nhập dòng sau:
doc = fitz.open("games.pdf")
4. Sau khi mở tệp PDF, hãy in số trang trong tệp PDF bằng dòng sau:
print(doc.page_count)
Đầu ra:
5
4. Để trích xuất liên kết từ một trang trong tệp PDF, chúng ta cần tải trang mà chúng ta muốn trích xuất liên kết từ đó. Để tải một trang, hãy nhập dòng sau, trong đó bạn chuyển số trang bạn muốn tải vào một hàm có tên là Load_page()
page = doc.load_page(0)
Để trích xuất các liên kết từ trang đầu tiên, chúng tôi chuyển vào 0 (không). Việc đếm các trang bắt đầu từ số 0 giống như trong các cấu trúc dữ liệu như mảng và từ điển.
5. Trích xuất các liên kết từ trang bằng dòng sau:
links = page.get_links()
Tất cả các liên kết trong trang bạn chỉ định, trong trường hợp của chúng tôi là trang 1, sẽ được trích xuất và lưu trữ trong biến có tên links
6. Để xem nội dung của biến links, hãy in nó ra như sau:
print(links)
Đầu ra:
Từ kết quả được in ra, hãy lưu ý rằng các liên kết biến chứa danh sách các từ điển có cặp khóa-giá trị. Mỗi liên kết trên trang được thể hiện bằng một từ điển, với liên kết thực tế được lưu trữ dưới khóa “uri“
7. Để lấy các liên kết từ danh sách các đối tượng được lưu trữ dưới các liên kết tên biến, hãy lặp qua danh sách bằng cách sử dụng câu lệnh for in và in ra các liên kết cụ thể được lưu trữ dưới khóa uri. Toàn bộ mã thực hiện điều này được hiển thị bên dưới:
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"])
Đầu ra:
5 https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/ https://sparkian.com/ https://www.codemonkey.com/
8. Để làm cho mã của chúng tôi có thể tái sử dụng nhiều hơn, chúng tôi có thể cấu trúc lại mã bằng cách xác định hàm trích xuất tất cả các liên kết trong tệp PDF và hàm in ra tất cả các liên kết có trong tệp PDF. Bằng cách này, bạn có thể gọi các hàm bằng bất kỳ tệp PDF nào và bạn sẽ lấy lại được tất cả các liên kết trong tệp PDF. Mã thực hiện điều này được hiển thị bên dưới:
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)
Đầu ra:
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
Từ đoạn mã trên, hàm extract_link() nhận một tệp PDF, lặp qua tất cả các trang trong tệp PDF, trích xuất tất cả các liên kết và trả về chúng. Kết quả của hàm này được lưu trữ trong một biến có tên all_links
Hàm print_all_links() lấy kết quả của extract_link(), lặp qua danh sách và in tất cả các liên kết thực tế được tìm thấy trong tệp PDF mà bạn đã chuyển vào hàm extract_link().
Để trích xuất Hình ảnh từ PDF, chúng tôi vẫn sẽ sử dụng PyMuPDF. Để trích xuất hình ảnh từ tệp PDF:
1. Nhập PyMuPDF, io và PIL. Thư viện hình ảnh Python (PIL) cung cấp các công cụ giúp bạn dễ dàng tạo và lưu hình ảnh cùng với các chức năng khác. io cung cấp các lớp để xử lý dữ liệu nhị phân dễ dàng và hiệu quả.
import fitz from io import BytesIO from PIL import Image
2. Mở tệp PDF bạn muốn trích xuất hình ảnh từ:
doc = fitz.open("games.pdf")
3. Tải trang bạn muốn trích xuất hình ảnh từ:
page = doc.load_page(0)
4. PyMuPdf xác định hình ảnh trên tệp PDF bằng cách sử dụng số tham chiếu chéo (xref), thường là số nguyên. Mỗi hình ảnh trên tệp PDF đều có một xref duy nhất. Do đó, để trích xuất hình ảnh từ PDF, trước tiên chúng ta phải lấy số xref xác định nó. Để lấy số xref của hình ảnh trên một trang, chúng ta sử dụng hàm get_images() như sau:
image_xref = page.get_images() print(image_xref)
Đầu ra:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
get_images() trả về danh sách các bộ dữ liệu có thông tin về hình ảnh. Vì chúng tôi chỉ có một hình ảnh trên trang đầu tiên nên chỉ có một bộ dữ liệu. Phần tử đầu tiên trong bộ dữ liệu đại diện cho xref của hình ảnh trên trang. Do đó, xref của hình ảnh ở trang đầu tiên là 7.
5. Để trích xuất giá trị xref cho hình ảnh từ danh sách các bộ dữ liệu, chúng tôi sử dụng đoạn mã dưới đây:
# get xref value of the image xref_value = image_xref[0][0] print(xref_value)
Đầu ra:
[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')] 7
6. Vì bây giờ bạn đã có xref xác định hình ảnh trên PDF nên bạn có thể trích xuất hình ảnh bằng hàm extract_image() như sau:
img_dictionary = doc.extract_image(xref_value)
Tuy nhiên, chức năng này không trả về hình ảnh thực tế. Thay vào đó, nó trả về một từ điển chứa dữ liệu hình ảnh nhị phân của hình ảnh và siêu dữ liệu về hình ảnh, cùng những thứ khác.
7. Từ từ điển được trả về bởi hàm extract_image(), hãy kiểm tra phần mở rộng tệp của hình ảnh được trích xuất. Phần mở rộng của file được lưu trữ dưới key “ext“:
# get file extenstion img_extension = img_dictionary["ext"] print(img_extension)
Đầu ra:
png
8. Trích xuất các tệp nhị phân hình ảnh từ từ điển được lưu trữ trong img_dictionary. Các tệp nhị phân hình ảnh được lưu trữ dưới khóa “hình ảnh“
# get the actual image binary data img_binary = img_dictionary["image"]
9. Tạo một đối tượng BytesIO và khởi tạo nó bằng dữ liệu hình ảnh nhị phân đại diện cho hình ảnh. Điều này tạo ra một đối tượng giống như tệp có thể được xử lý bởi các thư viện Python như PIL để bạn có thể lưu hình ảnh.
# create a BytesIO object to work with the image bytes image_io = BytesIO(img_binary)
10. Mở và phân tích dữ liệu hình ảnh được lưu trữ trong đối tượng BytesIO có tên image_io bằng thư viện PIL. Điều này rất quan trọng vì nó cho phép thư viện PIL xác định định dạng hình ảnh của hình ảnh mà bạn đang cố gắng xử lý, trong trường hợp này là PNG. Sau khi phát hiện định dạng hình ảnh, PIL tạo một đối tượng hình ảnh có thể được thao tác bằng các hàm và phương thức PIL, chẳng hạn như phương thức save(), để lưu hình ảnh vào bộ nhớ cục bộ.
# open the image using Pillow image = Image.open(image_io)
11. Chỉ định đường dẫn bạn muốn lưu hình ảnh.
output_path = "image_1.png"
Vì đường dẫn trên chỉ chứa tên của tệp có phần mở rộng nên hình ảnh được trích xuất sẽ được lưu trong cùng thư mục với tệp Python chứa chương trình này. Hình ảnh sẽ được lưu dưới dạng image_1.png. Phần mở rộng PNG rất quan trọng để nó phù hợp với phần mở rộng ban đầu của hình ảnh.
12. Lưu hình ảnh và đóng đối tượng ByteIO.
# save the image image.save(output_path) # Close the BytesIO object image_io.close()
Toàn bộ mã để trích xuất hình ảnh từ tệp PDF được hiển thị bên dưới:
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()
Chạy mã và đi tới thư mục chứa tệp Python của bạn; bạn sẽ thấy hình ảnh được trích xuất có tên image_1.png, như hiển thị bên dưới:
Phần kết luận
Để thực hành nhiều hơn về cách trích xuất liên kết, hình ảnh và văn bản từ tệp PDF, hãy thử cấu trúc lại mã trong các ví dụ để làm cho chúng dễ sử dụng hơn, như trong ví dụ về liên kết. Bằng cách này, bạn chỉ cần chuyển một tệp PDF và chương trình Python của bạn sẽ trích xuất tất cả các liên kết, hình ảnh hoặc văn bản trong toàn bộ tệp PDF. Chúc mừng mã hóa!
Bạn cũng có thể khám phá một số API PDF tốt nhất cho mọi nhu cầu kinh doanh.