Skip to content

Tương tác với PDF, XPS, EPUB trong python qua fitz

Spread the love

Thư viện fitz là tên module của PyMuPDF — một thư viện Python mạnh mẽ và hiệu suất cao dùng để xử lý tài liệu PDF, XPS và EPUB. Dưới đây là phần giới thiệu chi tiết:


📘 Giới thiệu về fitz (PyMuPDF)

✅ Tổng quan

  • fitz là tên module nội bộ của PyMuPDF, một thư viện Python chuyên dùng để:
    • Đọc và ghi file PDF.
    • Trích xuất văn bản, hình ảnh, metadata.
    • Chỉnh sửa trang, thêm chú thích, hợp nhất hoặc tách tài liệu.
    • Chuyển đổi PDF sang hình ảnh chất lượng cao.

⚡ Ưu điểm nổi bật

  • Hiệu suất cao: Dựa trên thư viện MuPDF viết bằng C, xử lý nhanh và nhẹ.
  • Đa năng: Hỗ trợ nhiều định dạng (PDF, XPS, EPUB).
  • Dễ dùng: API trực quan, dễ tích hợp vào các ứng dụng Python.

🔧 Cài đặt

pip install PyMuPDF

🧪 Ví dụ sử dụng cơ bản

import fitz  # nhập thư viện

doc = fitz.open("example.pdf")       # mở file PDF
page = doc[0]                         # lấy trang đầu tiên
text = page.get_text()               # trích xuất văn bản
images = page.get_images(full=True)  # lấy danh sách ảnh

🧩 Các tính năng chính

Tính năngMô tả
get_text()Trích xuất văn bản từ trang PDF
get_images()Lấy danh sách ảnh nhúng trong trang
insert_text()Thêm văn bản vào trang PDF
new_page()Tạo trang mới trong tài liệu
save()Lưu tài liệu PDF sau khi chỉnh sửa
search_for()Tìm kiếm văn bản bằng biểu thức chính quy
metadataTruy cập thông tin metadata của tài liệu (tác giả, tiêu đề, số trang)

Ví dụ 1: convert pdf sang jpg và chỉ giữ nửa trái mỗi ảnh

Trong ví dụ này, chúng ta sẽ

  • Mở một file PDF.
  • Trích xuất tất cả hình ảnh từ từng trang.
  • Cắt nửa bên trái của mỗi hình ảnh.
  • Lưu hình ảnh đã cắt vào một thư mục chỉ định.
import fitz  # PyMuPDF: thư viện để xử lý file PDF
from PIL import Image  # Thư viện xử lý ảnh
import io  # Dùng để xử lý dữ liệu dạng byte
import os  # Dùng để thao tác với hệ thống file

🔧 Thiết lập đường dẫn

pdf_path = r"C:\Users\hehe\bbo.pdf"
output_folder = r"C:\Users\hehe\3img"
  • pdf_path: đường dẫn đến file PDF cần xử lý.
  • output_folder: thư mục nơi lưu ảnh sau khi trích xuất.
os.makedirs(output_folder, exist_ok=True)
  • Tạo thư mục lưu ảnh nếu chưa tồn tại (exist_ok=True giúp tránh lỗi nếu thư mục đã có).

📄 Trích xuất ảnh từ PDF

doc = fitz.open(pdf_path)
  • Mở file PDF bằng PyMuPDF.
for page_index in range(len(doc)):
    page = doc[page_index]
    images = page.get_images(full=True)
  • Lặp qua từng trang trong PDF.
  • get_images(full=True) lấy tất cả ảnh trên trang (bao gồm ảnh nhúng).

🖼️ Xử lý từng ảnh

for img_index, img in enumerate(images):
    xref = img[0]
    base_image = doc.extract_image(xref)
    image_bytes = base_image["image"]
  • xref: ID nội bộ của ảnh trong PDF.
  • extract_image(xref): trích xuất ảnh dưới dạng byte.
  • image_bytes: dữ liệu ảnh gốc.
    image = Image.open(io.BytesIO(image_bytes))
    width, height = image.size
    left_half = image.crop((0, 0, width // 2, height))
  • Mở ảnh từ dữ liệu byte.
  • Lấy kích thước ảnh.
  • Cắt nửa bên trái của ảnh (crop với tọa độ từ trái sang giữa).

💾 Lưu ảnh

    filename = f"{page_index+1}.jpg"
    save_path = os.path.join(output_folder, filename)
    left_half.save(save_path, format="JPEG")
  • Đặt tên file theo số trang (ví dụ: 1.jpg, 2.jpg…).
  • Lưu ảnh đã cắt vào thư mục chỉ định.

✅ Thông báo hoàn tất

print(f"✅ Images saved to {output_folder}")
  • In ra thông báo khi hoàn tất xử lý.

Toàn bộ code:

import fitz  # PyMuPDF: thư viện để xử lý file PDF
from PIL import Image  # Thư viện xử lý ảnh
import io  # Dùng để xử lý dữ liệu dạng byte
import os  # Dùng để thao tác với hệ thống file
pdf_path = r"C:\Users\hehe\bbo.pdf"
output_folder = r"C:\Users\hehe\3img"
os.makedirs(output_folder, exist_ok=True)
doc = fitz.open(pdf_path)
for page_index in range(len(doc)):
    page = doc[page_index]
    images = page.get_images(full=True)
    image = Image.open(io.BytesIO(image_bytes))
    width, height = image.size
    left_half = image.crop((0, 0, width // 2, height))
print(f"✅ Images saved to {output_folder}")

Discover more from Cùng Học Cùng Mơ

Subscribe to get the latest posts sent to your email.

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!