Cách xuất tệp OneNote sang PDF bằng Python

Cách xuất tệp OneNote sang PDF bằng Python

Aspose.Note FOSS for Python cho phép xuất PDF lập trình của các tệp tin Microsoft OneNote .one mà không cần Microsoft Office hay bất kỳ bộ chuyển đổi tài liệu ở mức hệ điều hành nào. Việc xuất được xử lý bởi phương thức Document.Save() được hỗ trợ bởi bộ render PDF tùy chọn ReportLab.

Lợi ích

  1. Thân thiện với máy chủ: chạy trên bất kỳ hệ điều hành nào, bao gồm cả các máy chủ Linux không giao diện và các container CI/CD
  2. Có khả năng stream: lưu trực tiếp vào một bộ đệm io.BytesIO, không cần tệp tạm thời
  3. Miễn phí và mã nguồn mở: giấy phép MIT

Điều kiện tiên quyết

Xuất PDF yêu cầu phụ thuộc tùy chọn ReportLab. Cài đặt nó qua phần mở rộng [pdf]:

pip install "aspose-note[pdf]"

Nếu bạn đã cài đặt aspose-note mà không có phần mở rộng:

pip install --upgrade "aspose-note[pdf]"

Xác minh rằng ReportLab có sẵn:

python -c "import reportlab; print(reportlab.Version)"

Hướng Dẫn Từng Bước

Bước 1: Cài đặt aspose-note với hỗ trợ PDF

pip install "aspose-note[pdf]"

Xác nhận cài đặt:

from aspose.note import Document, SaveFormat
print("Ready for PDF export.")

Bước 2: Tải tệp OneNote

from aspose.note import Document

doc = Document("MyNotes.one")

Bước 3: Xuất toàn bộ tài liệu sang PDF

Xuất đơn giản nhất, bao phủ tất cả các trang với cài đặt mặc định:

from aspose.note import Document, SaveFormat

doc = Document("MyNotes.one")
doc.Save("output.pdf", SaveFormat.Pdf)
print("PDF saved to output.pdf")

Bước 4: Sử dụng PdfSaveOptions

PdfSaveOptions cho phép bạn cấu hình các cài đặt xuất PDF:

from aspose.note import Document
from aspose.note.saving import PdfSaveOptions

doc = Document("MyNotes.one")

opts = PdfSaveOptions()
doc.Save("output.pdf", opts)

Các tùy chọn PdfSaveOptions khả dụng

OptionTypeDefaultDescription
PageIndexint0Trường tồn tại; không được chuyển tiếp tới bộ xuất PDF trong v26.3.1: không có hiệu lực
PageCountint | NoneNoneTrường tồn tại; không được chuyển tiếp tới bộ xuất PDF trong v26.3.1: không có hiệu lực

Bước 5: Xuất ra một luồng trong bộ nhớ

Document.Save() chấp nhận luồng nhị phân trực tiếp: không cần tệp tạm thời:

import io
from aspose.note import Document, SaveFormat
from aspose.note.saving import PdfSaveOptions

doc = Document("MyNotes.one")

buf = io.BytesIO()
doc.Save(buf, PdfSaveOptions())
pdf_bytes = buf.getvalue()
print(f"PDF size: {len(pdf_bytes)} bytes")

Bước 6: Xuất hàng loạt nhiều tệp

Xử lý tất cả các tệp .one trong một thư mục:

from pathlib import Path
from aspose.note import Document, SaveFormat

input_dir = Path("./onenote_files")
output_dir = Path("./pdf_output")
output_dir.mkdir(exist_ok=True)

for one_file in input_dir.glob("*.one"):
    doc = Document(str(one_file))
    out_path = output_dir / one_file.with_suffix(".pdf").name
    doc.Save(str(out_path), SaveFormat.Pdf)
    print(f"Exported: {one_file.name} -> {out_path.name}")

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

1. ImportError: Không có mô-đun nào có tên ‘reportlab’

Nguyên nhân: Phần mở rộng [pdf] chưa được cài đặt.

Sửa:

pip install "aspose-note[pdf]"

2. UnsupportedSaveFormatException

Nguyên nhân: Đã sử dụng một định dạng khác ngoài SaveFormat.Pdf. Chỉ có SaveFormat.Pdf được triển khai.

Sửa: Luôn sử dụng SaveFormat.Pdf để xuất. Các định dạng khác được khai báo để tương thích API nhưng gây ra UnsupportedSaveFormatException.

3. IncorrectPasswordException

Nguyên nhân: Tệp .one được mã hoá. Các tài liệu được mã hoá không được hỗ trợ.

Fix: Sử dụng tệp không được mã hoá .one. Sản phẩm thương mại Aspose.Note hỗ trợ mã hoá.

4. FileNotFoundError

Nguyên nhân: Đường dẫn tệp .one đầu vào không đúng.

Sửa lỗi: Sử dụng pathlib.Path.exists() để xác thực trước khi tải:

from pathlib import Path
from aspose.note import Document, SaveFormat

path = Path("MyNotes.one")
assert path.exists(), f"File not found: {path.resolve()}"
doc = Document(str(path))
doc.Save("output.pdf", SaveFormat.Pdf)

5. PDF đầu ra là trống hoặc không có nội dung

Nguyên nhân: Tệp .one chứa các trang nhưng không có nội dung văn bản (chỉ có hình ảnh hoặc bảng không có văn bản). Trình render PDF tạo các trang dựa trên những gì ReportLab có thể render từ DOM.

Sửa: Xác minh nội dung trang trước khi xuất:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
text_count = len(doc.GetChildNodes(RichText))
print(f"RichText nodes found: {text_count}")

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

Các định dạng lưu nào được hỗ trợ?

Chỉ SaveFormat.Pdf hiện đang được triển khai. Enum SaveFormat có đúng một thành viên: SaveFormat.Pdf.

Tôi có thể xuất ra một luồng thay vì một tệp không?

Có. Document.Save() chấp nhận bất kỳ luồng nhị phân có thể ghi nào làm đối số đầu tiên của nó:

import io
from aspose.note import Document, PdfSaveOptions, SaveFormat

doc = Document("MyNotes.one")
buf = io.BytesIO()
doc.Save(buf, PdfSaveOptions())
pdf_bytes = buf.getvalue()

Việc xuất có giữ nguyên thứ tự trang không?

Có. Các trang được xuất theo cùng thứ tự chúng xuất hiện trong DOM (thứ tự được trả về khi lặp qua Document).

Xuất PDF có sẵn trên Linux không?

Vâng. ReportLab và Aspose.Note FOSS for Python đều độc lập với hệ điều hành.

Tôi có thể xuất một tập con các trang không?

Các trường PdfSaveOptions.PageIndexPageCount tồn tại nhưng không được chuyển tới bộ xuất PDF trong v26.3.1 và không có tác dụng: toàn bộ tài liệu luôn được xuất.


Tài nguyên liên quan:

 Tiếng Việt