Cách tải tài liệu trong Python

Cách tải tài liệu trong Python

Aspose.PDF FOSS cho Python tải một PDF từ đường dẫn tệp, dữ liệu thô, hoặc luồng nhị phân vào một đối tượng Document mà bạn có thể kiểm tra và thao tác. Thư viện này thuần Python và cài đặt bằng một lệnh duy nhất.

Hướng dẫn từng bước

Bước 2: Nhập các lớp cần thiết

Nhập Document để tải và giữ một PDF, cùng với các lớp ngoại lệ bạn sẽ xử lý khi việc tải gặp lỗi:

from aspose_pdf import (
    Document,
    InvalidPasswordException,
    InvalidPdfFileFormatException,
    PdfCorruptedError,
    PdfParseException,
)

Bước 3: Tải PDF từ đường dẫn tệp

Truyền một đường dẫn tệp trực tiếp vào hàm khởi tạo Document, hoặc gọi load_from một cách rõ ràng trên một thể hiện hiện có — cả hai đều chấp nhận một đường dẫn, bytes, hoặc một luồng nhị phân. Sử dụng Document như một trình quản lý ngữ cảnh để các bộ xử lý tệp nền được giải phóng tự động:

from aspose_pdf import Document

with Document("report.pdf") as document:
    print(f"Loaded {document.page_count} page(s)")

Dạng khởi tạo Document(source) tương đương với Document().load_from(source):

document = Document()
document.load_from("report.pdf")
print(f"Loaded {document.page_count} page(s)")
document.close()

Bước 4: Tải PDF được bảo vệ bằng mật khẩu

Cả Document(source, password=...) và Document.load_from(source, password, limits) đều chấp nhận đối số password cho các PDF được mã hóa bằng mật khẩu người dùng:

from aspose_pdf import Document

with Document("locked.pdf", password="secret") as document:
    print(f"Opened encrypted document: {document.page_count} page(s)")
    print(f"Encrypted: {document.is_encrypted}")

Nếu nguồn không được bảo vệ bằng mật khẩu, bỏ qua đối số — việc truyền password=None (mặc định) cũng hoạt động cho các PDF thông thường.


Bước 5: Xử lý các ngoại lệ khi tải

Một tệp tin bị thiếu, dữ liệu không phải PDF, mật khẩu bị thiếu hoặc sai, hoặc PDF bị hỏng sẽ không trả về một Document trống im lặng — mà sẽ ném ra ngoại lệ. Hãy bắt các lớp ngoại lệ cụ thể để phản hồi một cách thích hợp:

from aspose_pdf import (
    Document,
    InvalidPasswordException,
    InvalidPdfFileFormatException,
    PdfCorruptedError,
    PdfParseException,
)

try:
    document = Document("report.pdf", password="maybe-wrong")
except InvalidPasswordException:
    print("The PDF is encrypted; supply the correct password.")
except InvalidPdfFileFormatException:
    print("The file is not a valid PDF.")
except PdfCorruptedError as error:
    print(f"Unrecoverable corruption at offset {error.offset}: {error.message}")
except PdfParseException as error:
    print(f"Could not parse the PDF: {error}")
else:
    print(f"Loaded {document.page_count} page(s)")
    document.close()

PdfCorruptedError và thành phần đồng hành PdfMalformedError đều chứa các thuộc tính message, offset và recoverable, điều này hữu ích cho việc ghi nhật ký chính xác vị trí mà tệp bị hỏng không thể phân tích. Khi xử lý dữ liệu không đáng tin cậy, cũng hãy bắt PdfResourceLimitException, ngoại lệ này được ném ra khi một tài liệu vượt quá chính sách an toàn mặc định PdfLoadLimits (kích thước đầu vào, số lượng đối tượng, kích thước luồng đã giải mã và các giới hạn tương tự).


Bước 7: Giải phóng tài nguyên tài liệu

Sử dụng Document như một trình quản lý ngữ cảnh (with Document(...) as document:) sẽ tự động đóng tài liệu khi khối kết thúc. Khi bạn tạo một Document bên ngoài khối with, hãy gọi close() hoặc dispose() một cách rõ ràng sau khi bạn đã xong việc với nó:

document = Document()
document.load_from("report.pdf")
try:
    print(document.page_count)
finally:
    document.close()

Các vấn đề thường gặp và cách khắc phục

InvalidPasswordException được sinh ra ngay cả khi tôi không nghĩ tệp đã được mã hoá

Tệp PDF nguồn có đặt mật khẩu người dùng. Xác nhận điều này với nguồn gốc của tệp, sau đó truyền giá trị đúng làm đối số password cho Document(...) hoặc load_from(...).

InvalidPdfFileFormatException trên một tệp trông ổn

Tệp không phải là PDF hợp lệ — có thể nó là một trang lỗi HTML, một tải xuống bị cắt ngắn, hoặc một định dạng khác được lưu với phần mở rộng .pdf. Mở tệp trong trình soạn thảo văn bản và xác nhận nó bắt đầu bằng %PDF-.

PdfCorruptedError trên một tệp mở được trong các trình xem khác

Một số trình đọc PDF sửa chữa cấu trúc bị hỏng một cách im lặng. Document ném PdfCorruptedError cho sự hỏng không thể khôi phục và PdfMalformedError cho các vấn đề cấu trúc có thể khôi phục — kiểm tra thuộc tính offset trên ngoại lệ để xác định vùng vấn đề trong luồng byte.

PdfResourceLimitException trên PDF lớn hoặc phức tạp

Tài liệu đã vượt quá giới hạn PdfLoadLimits mặc định (kích thước đầu vào, số lượng đối tượng, kích thước luồng đã giải mã và các giới hạn tương tự được thiết kế để bảo vệ trước đầu vào không đáng tin cậy). Tạo một PdfLoadLimits tùy chỉnh và truyền nó như limits= cho Document(...) hoặc load_from(...) nếu tệp tin được tin cậy và các giới hạn lớn hơn là phù hợp.

Quên đóng một Document được mở bên ngoài một with block

Gọi document.close() (hoặc document.dispose()) khi bạn đã xong, hoặc tải tệp với with Document(source) as document: để việc dọn dẹp diễn ra tự động ngay cả khi có ngoại lệ xảy ra bên trong khối.

Câu hỏi thường gặp

Tôi có thể truyền gì làm đối số source khi tải PDF?

Document(source) và Document.load_from(source, password, limits) chấp nhận một đường dẫn tệp, bytes thô, hoặc bất kỳ luồng nhị phân nào.

Làm thế nào để tải một PDF đã có trong bộ nhớ thay vì trên đĩa?

Truyền trực tiếp đối tượng bytes: Document(pdf_bytes), hoặc gọi document.load_from(pdf_bytes) trên một thể hiện Document hiện có.

Việc tải PDF có yêu cầu mật khẩu đúng ngay từ đầu, hay tôi có thể kiểm tra trước?

is_encrypted chỉ khả dụng sau khi tải thành công, vì vậy một PDF được mã hoá phải được mở bằng đối số password đúng trong cùng một lần gọi. Bắt InvalidPasswordException nếu bạn cần yêu cầu mật khẩu một cách tương tác.

Xem thêm

 Tiếng Việt