Làm việc với tài liệu ghi chú

Hướng dẫn này giải thích cách tải, đi qua và xuất Microsoft OneNote .one Tải về Python bằng cách sử dụng Document lớp từ Aspose.Note FOSS.The Document lớp là gốc của mô hình đối tượng tài liệu (DOM), và mỗi hoạt động đọc, xuyên qua hoặc xuất bắt đầu với một Document Một trường hợp đại diện cho một đơn vị .one Phần file.


tải một tài liệu

Tải từ đường dẫn tệp

Đi qua con đường đến A .one file trực tiếp đến Document Nhà xây dựng:

from aspose.note import Document

doc = Document("MyNotes.one")

Tải từ luồng nhị phân

Sử dụng một đối tượng giống như tệp khi dữ liệu đến từ phản ứng mạng, đám mây lưu trữ blob hoặc trong bộ nhớ buffer:

from pathlib import Path
from aspose.note import Document

with Path("MyNotes.one").open("rb") as f:
    doc = Document(f)

Tạo một tài liệu trống rỗng

Xây dựng a Document không có lý do để xây dựng một tài liệu OneNote mới theo chương trình:

from aspose.note import Document, Page

doc = Document()
doc.AppendChildLast(Page())

tải với các tùy chọn

Sử dụng LoadOptions để thiết lập các thông số tùy chọn như lịch sử tải tại thời gian xây dựng:

from aspose.note import Document, LoadOptions

opts = LoadOptions()
opts.LoadHistory = True   # include page revision history in the DOM
doc = Document("MyNotes.one", opts)
LoadOptions Tài sảnTypeDefaultDescription
LoadHistoryboolFalseWhen True, các đánh giá lịch sử trang được bao gồm trong DOM và có thể truy cập qua Document.GetPageHistory
DocumentPassword`strNone`None

Document Format Phát hiện

Các FileFormat thuộc tính xác định loại hình OneNote nào mà tệp sử dụng:

from aspose.note import Document, FileFormat

doc = Document("MyNotes.one")

if doc.FileFormat == FileFormat.OneNote2010:
    print("OneNote 2010 format")
elif doc.FileFormat == FileFormat.OneNoteOnline:
    print("OneNote Online format")
elif doc.FileFormat == FileFormat.OneNote2007:
    print("OneNote 2007 format")
else:
    print("Format:", doc.FileFormat)
FileFormat Giá trịDescription
OneNote2010Standard .one Tệp được viết bởi OneNote 2010 và sau đó
OneNoteOnline.one Tệp được viết bởi OneNote Online / Microsoft 365
OneNote2007Legacy .one Bản mẫu OneNote 2007
UnknownFormat không thể xác định được

Lặp qua Các Trang

Các trang là những đứa trẻ trực tiếp của Document.Sử dụng a for Lời bài hát: Simple Iteration:

doc = Document(“MyNotes.one”)

for page in doc: title_text = ( page.Title.TitleText.Text if page.Title and page.Title.TitleText else “(untitled)” ) author = page.Author or “(unknown)” level = page.Level or 1 indent = " " * (level - 1) print(f"{indent}{title_text} [by {author}]")


Sử dụng `GetChildNodes(Page)` Để có được một danh sách viết của tất cả các trang cùng một lúc:

doc = Document("MyNotes.one")
pages = doc.GetChildNodes(Page)
print(f"Total pages: {len(pages)}")
from aspose.note import Document

doc = Document("MyNotes.one")

for page in doc:
    title_text = (
        page.Title.TitleText.Text
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    author = page.Author or "(unknown)"
    level = page.Level or 1
    indent = "  " * (level - 1)
    print(f"{indent}{title_text}  [by {author}]")
from aspose.note import Document, Page

doc = Document("MyNotes.one")
pages = doc.GetChildNodes(Page)
print(f"Total pages: {len(pages)}")

Trang Metadata

PropertyTypeDescription
Title`TitleNone`
Author`strNone`
CreationTime`datetimeNone`
LastModifiedTime`datetimeNone`
Level`intNone`
IsConflictPageboolTrue Nếu trang là một bản sao xung đột đồng bộ

Đi qua cây tài liệu

Document thừa kế từ CompositeNode, cho nó đầy đủ cây qua phương pháp:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

# Extract all plain text from the entire document
all_text = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
print("\n".join(all_text))

Hiến pháp DOM:

Document
  └── Page (0..n)
        ├── Title
        │     ├── TitleText (RichText)
        │     ├── TitleDate (RichText)
        │     └── TitleTime (RichText)
        └── Outline (0..n)
              └── OutlineElement (0..n)
                    ├── RichText
                    ├── Image
                    ├── Table
                    │     └── TableRow → TableCell → RichText / Image
                    └── AttachedFile

Các phương pháp giao thông chính được thừa hưởng từ CompositeNode:

MethodDescription
GetChildNodes(NodeType)Trả lại danh sách được viết của tất cả các con người phù hợp với loại cụ thể
AppendChildLast(node)Thêm nút trẻ em ở cuối danh sách trẻ Em
AppendChildFirst(node)Thêm một nút trẻ em vào đầu
InsertChild(index, node)Nhập một đứa trẻ vào một chỉ số cụ thể
RemoveChild(node)Xóa một nút trẻ em
GetEnumerator()Tự động trẻ em Iterate

Lịch sử Page

Khi tải với LoadHistory=True, Document.GetPageHistory Gửi lại tất cả các bản sửa đổi được tiết kiệm Từ trang cũ nhất đến mới nhất:

from aspose.note import Document, LoadOptions

opts = LoadOptions()
opts.LoadHistory = True
doc = Document("MyNotes.one")

for page in doc.GetChildNodes(None.__class__.__mro__[0]):  # iterate pages
    pass

# Get revisions for a specific page
import aspose.note as an

doc2 = Document("MyNotes.one", opts)
pages = doc2.GetChildNodes(an.Page)
if pages:
    history = doc2.GetPageHistory(pages[0])
    print(f"Revision count: {history.Count}")
    for rev in history:
        print(f"  Modified: {rev.LastModifiedTime}")

Note: GetPageHistory Lại trở lại một cái trống PageHistory đối tượng khi LoadHistoryFalse (được đặt) Luôn luôn thiết lập opts.LoadHistory = True Trước khi tải nếu cần thiết dữ liệu sửa đổi.


tiết kiệm và xuất khẩu

Sử dụng Document.Save PDF là định dạng xuất khẩu duy nhất được hỗ trợ.

Lưu vào một file

Call Document.Save() Với một file path và SaveFormat.Pdf để viết xuất trực tiếp vào đĩa:

from aspose.note import Document, SaveFormat

doc = Document("MyNotes.one")
doc.Save("output.pdf", SaveFormat.Pdf)

Lưu vào một dòng in-memory

Gửi một viết io.BytesIO buffer thay vì một con đường để chụp các byte PDF trong bộ nhớ:

import io
from aspose.note import Document, SaveFormat

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

Tiết kiệm với các tùy chọn

Sử dụng PdfSaveOptions Từ aspose.note.saving để kiểm tra các trang nào được bao gồm trong xuất PDF xuất khẩu:

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

doc = Document("MyNotes.one")

# Export pages 2 and 3 only (zero-based index)
opts = PdfSaveOptions(PageIndex=1, PageCount=2)
buf = io.BytesIO()
doc.Save(buf, opts)
pdf_bytes = buf.getvalue()

Important: PDF xuất cần tùy chọn ReportLab phụ thuộc. Cài đặt với pip install "aspose-note[pdf]".


Chẩn đoán thay đổi layout

Call DetectLayoutChanges sau khi sửa đổi tài liệu để tính toán lại các phương pháp bố trí Trước khi tiết kiệm:

doc = Document() page = Page() doc.AppendChildLast(page)

… add content to page …

doc.DetectLayoutChanges() doc.Save(“output.pdf”)


---

```python
from aspose.note import Document, Page

doc = Document()
page = Page()
doc.AppendChildLast(page)

# ... add content to page ...

doc.DetectLayoutChanges()
doc.Save("output.pdf")

Mẹo và Thực hành Tốt nhất

  • Lấy một lần, hỏi nhiều lần: Document tải toàn bộ .one file vào memory on Đặt 1 - Hold One Document trường hợp và gọi điện thoại GetChildNodes Thường xuyên hơn là nhiều lần tải lại tệp cho mỗi truy vấn.
  • Check IsConflictPage: OneNote đồng bộ có thể tạo các trang xung đột. [p for p in doc if not p.IsConflictPage] trước khi xử lý nội dung.
  • Sử dụng LoadHistory=False (được mặc định) cho tốc độ: Lịch sử trang thêm bộ nhớ đáng kể và Đặt hàng: Chỉ đặt LoadHistory=True khi bạn cần dữ liệu sửa đổi.
  • Stream cho các tập tin lớn: Đi qua một đối tượng tệp mở thay vì đường dây khi đọc lớn .one file để tránh giữ tệp mở sau khi parse hoàn thành.
  • Call DetectLayoutChanges trước đây Save:Khi xây dựng một tài liệu lập trình và mở các nút, gọi DetectLayoutChanges() Để đảm bảo các coordinates layout là liên tục trước khi xuất sang PDF.

Các vấn đề thường gặp

IssueCauseFix Đặt
IncorrectPasswordException trên tảiFile được mã hóa; tài liệu mã hoá không được hỗ trợNhận một bản sao không mã hóa của tệp
FileCorruptedException trên tảiTệp bị truncate hoặc có định dạng nội bộ không được hỗ trợKiểm tra file là hợp lệ .one Phần (không phải A) .onetoc2 Bảng nội dung (Content)
UnsupportedSaveFormatException trên SaveCố gắng lưu vào định dạng khác ngoài PDFChỉ có định dạng PDF được hỗ trợ cho xuất khẩu
Empty GetPageHistory Kết quảLoadOptions.LoadHistory Không được thiết lập để True Trước khi tảitải lại tài liệu với opts.LoadHistory = True
ModuleNotFoundError: reportlabPDF xuất khẩu cố gắng mà không có thêm PDFchạy pip install "aspose-note[pdf]"

FAQ

Các định dạng OneNote có thể đọc Aspose.Notes?

Tất cả ba định dạng phần OneNote: OneNote2007, OneNote2010, và OneNoteOnline. Sử dụng doc.FileFormat để xác định biến thể nào đã được tải lên.

Có thể viết lại cho A .one file sau khi đọc nó?

Aspose.Note for Python is a read-and-export library. Use Document.Save để viết PDF output. OneNote định dạng nhị phân được đọc chỉ trong phiên bản FOSS này.

Làm thế nào để đọc một trang cụ thể theo tiêu đề?

Tích hợp các trang với một biểu thức máy phát và so sánh tài sản văn bản tiêu đề với dòng mục tiêu của bạn:

doc = Document(“MyNotes.one”) target = next( (p for p in doc if p.Title and p.Title.TitleText and p.Title.TitleText.Text == “My Page”), None, )


#### Làm thế nào để tôi tính toán các trang phụ riêng biệt từ các Trang cấp cao?

Sử dụng `page.Level`: cấp 1 là cấp cao, cấp 2 là một trang phụ, và như vậy.

doc = Document("MyNotes.one")
top_level = [p for p in doc if (p.Level or 1) == 1]
sub_pages  = [p for p in doc if (p.Level or 1) > 1]
print(f"Top-level: {len(top_level)}, Sub-pages: {len(sub_pages)}")

Hỗ trợ Aspose.Note .onetoc2 Tệp bảng của các nội dung?

Không chỉ .one Phần file được hỗ trợ. .onetoc2 Notebook sẽ tăng lên FileCorruptedException.


from aspose.note import Document

doc = Document("MyNotes.one")
target = next(
    (p for p in doc
     if p.Title and p.Title.TitleText and p.Title.TitleText.Text == "My Page"),
    None,
)
from aspose.note import Document

doc = Document("MyNotes.one")
top_level = [p for p in doc if (p.Level or 1) == 1]
sub_pages  = [p for p in doc if (p.Level or 1) > 1]
print(f"Top-level: {len(top_level)}, Sub-pages: {len(sub_pages)}")

Tóm tắt Tham chiếu API

Class / Phương phápDescription
Document(path_or_stream, options?)tải a .one file hoặc tạo một tài liệu trống
Document.FileFormatTính năng khác nhau (FileFormat ĐIỀU)
Document.GetChildNodes(NodeType)Tự hủy tất cả các nút kế thừa của một loại cụ thể
Document.GetPageHistory(page)Nhận lịch sử sửa đổi cho một trang (cần) LoadHistory=True)
Document.Save(target, format_or_options)Xuất sang PDF theo đường file hoặc dòng
Document.DetectLayoutChanges()Tái tính toán các định dạng sau khi chỉnh sửa lập trình
Document.Accept(visitor)Đi bộ DOM bằng cách sử dụng A DocumentVisitor Subclass
LoadOptions.LoadHistorySet cho True Để bao gồm các sửa đổi trang trong DOM
LoadOptions.DocumentPasswordBảo hành; file mã hóa upload IncorrectPasswordException
FileFormatEnum : OneNote2010, OneNoteOnline, OneNote2007, Unknown
SaveFormat.PdfĐịnh dạng xuất khẩu duy nhất được hỗ trợ; tăng ValueError Đối với các định dạng khác
PageHistory.CountSố lượng trang xem xét có sẵn
Page.LevelDung tích trang dưới (1 = cấp cao)
Page.IsConflictPageTrue cho các bản sao xung đột sync

See Also

 Tiếng Việt