ทำงานกับเอกสาร Note

คู่มือนี้อธิบายวิธีการโหลด, เดินทางผ่าน, และส่งออกไฟล์ Microsoft OneNote .one ใน Python ด้วยการใช้คลาส Document จาก Aspose.Note FOSS. คลาส Document เป็นรากของโมเดลวัตถุเอกสาร (DOM) และการดำเนินการอ่าน, การเดินทางผ่าน, หรือการส่งออกทั้งหมดจะเริ่มต้นด้วยอินสแตนซ์ Document ที่แทนไฟล์ส่วน .one เดียว.


การโหลดเอกสาร

โหลดจากเส้นทางไฟล์

ส่งเส้นทางไปยังไฟล์ .one โดยตรงให้กับคอนสตรัคเตอร์ของ Document:

from aspose.note import Document

doc = Document("MyNotes.one")

โหลดจากสตรีมไบนารี

ใช้วัตถุที่คล้ายไฟล์เมื่อข้อมูลมาจากการตอบสนองของเครือข่าย, blob ของคลาวด์สตอเรจ, หรือบัฟเฟอร์ในหน่วยความจำ:

from pathlib import Path
from aspose.note import Document

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

สร้างเอกสารเปล่า

สร้าง Document โดยไม่มีอาร์กิวเมนต์เพื่อสร้างเอกสาร OneNote ใหม่โดยโปรแกรม:

from aspose.note import Document, Page

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

โหลดพร้อมตัวเลือก

ใช้ LoadOptions เพื่อตั้งค่าพารามิเตอร์ตัวเลือก เช่น การโหลดประวัติในช่วงเวลาการสร้าง:

from aspose.note import Document, LoadOptions

opts = LoadOptions()
opts.LoadHistory = True   # include page revision history in the DOM
doc = Document("MyNotes.one", opts)
คุณสมบัติ LoadOptionsประเภทDefaultคำอธิบาย
LoadHistoryboolFalseเมื่อ True ประวัติการแก้ไขของหน้า จะถูกรวมอยู่ใน DOM และสามารถเข้าถึงได้ผ่าน Document.GetPageHistory
DocumentPassword`strNone`None

การตรวจจับรูปแบบเอกสาร

คุณสมบัติ FileFormat ระบุว่าไฟล์ใช้รูปแบบ OneNote variant ใด:

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 ค่าคำอธิบาย
OneNote2010ไฟล์ .one มาตรฐานที่เขียนโดย OneNote ตั้งแต่ปี 2010 เป็นต้นไป
OneNoteOnlineไฟล์ .one ที่เขียนโดย OneNote Online / Microsoft 365
OneNote2007รูปแบบ .one ดั้งเดิมจาก OneNote ปี 2007
Unknownไม่สามารถระบุรูปแบบได้

การวนซ้ำหน้า

หน้าเป็นลูกโดยตรงของ Document. เนื่องจาก Document ทำหน้าที่เป็น enumerator, คุณสามารถวนซ้ำผ่านมันด้วยลูป for อย่างง่าย:

from aspose.note import Document

doc = Document("MyNotes.one")

for page in doc:
    title_text = (
        page.Title.TitleText
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    print(title_text)

หากคุณต้องการดึงโหนดลูกทั้งหมดของประเภทหนึ่งพร้อมกัน, ใช้วิธีการ GetChildNodes และส่งคลาสโหนดที่ต้องการเป็นอาร์กิวเมนต์:

# Replace DesiredNodeType below with the specific node class you want to collect
nodes = doc.GetChildNodes(DesiredNodeType)
print(f"Total nodes: {len(nodes)}")

การท่องโครงสร้างเอกสาร

Document สืบทอดจาก CompositeNode, ทำให้มันมีเมธอดการท่องต้นไม้แบบเต็ม:

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))

โครงสร้างลำดับชั้นของ 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

เมธอดการท่องสำคัญที่สืบทอดจาก CompositeNode:

วิธีการคำอธิบาย
GetChildNodes(NodeType)คืนรายการที่มีประเภทของทุติยภูมิทั้งหมดที่ตรงกับประเภทที่ระบุ
AppendChildLast(node)เพิ่มโหนดลูกที่ส่วนท้ายของรายการโหนดลูก
AppendChildFirst(node)เพิ่มโหนดลูกที่ส่วนเริ่มต้น
InsertChild(index, node)แทรกโหนดลูกที่ตำแหน่งเฉพาะ
RemoveChild(node)ลบโหนดลูก
GetEnumerator()วนซ้ำโหนดลูกโดยตรง

ประวัติหน้า

เมื่อโหลดด้วย LoadHistory=True, Document.GetPageHistory จะคืนค่าการแก้ไขที่บันทึกทั้งหมดของหน้า, เรียงจากเก่าสุดถึงใหม่ล่าสุด:

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 ส่งคืนค่าว่าง PageHistory อ็อบเจกต์เมื่อ LoadHistory is False (ค่าเริ่มต้น). ตั้งค่าเสมอ opts.LoadHistory = True ก่อนทำการโหลดหากคุณต้องการข้อมูลการแก้ไข.


การบันทึกและการส่งออก

ใช้ Document.Save เพื่อส่งออกเป็น PDF. PDF เป็นรูปแบบการส่งออกที่รองรับเพียงอย่างเดียว.

บันทึกลงไฟล์

เรียก Document.Save() พร้อมเส้นทางไฟล์และ SaveFormat.Pdf เพื่อเขียนการส่งออกโดยตรงลงดิสก์:

from aspose.note import Document, SaveFormat

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

บันทึกลงสตรีมในหน่วยความจำ

ส่งบัฟเฟอร์ io.BytesIO ที่เขียนได้แทนเส้นทางเพื่อจับไบต์ของ PDF ในหน่วยความจำ:

import io
from aspose.note import Document, SaveFormat

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

บันทึกพร้อมตัวเลือก

ใช้ PdfSaveOptions จาก aspose.note.saving เพื่อควบคุมว่าหน้าใดบ้างจะถูกรวมไว้ในผลลัพธ์ PDF ที่ส่งออก:

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 จำเป็นต้องมีการพึ่งพา ReportLab แบบเลือกเพิ่มเติม. ติดตั้ง [pdf] ส่วนเสริมเพื่อเปิดใช้งาน.


การตรวจจับการเปลี่ยนแปลงเค้าโครง

เรียก DetectLayoutChanges หลังจากแก้ไขเอกสารเพื่อคำนวณเมตริกของเค้าโครงใหม่ก่อนบันทึก:

from aspose.note import Document, Page

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

# ... add content to page ...

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

เคล็ดลับและแนวปฏิบัติที่ดีที่สุด

  • โหลดครั้งเดียว, สืบค้นหลายครั้ง: Document โหลดทั้งหมด .one ไฟล์เข้าสู่หน่วยความจำเมื่อสร้าง. เก็บหนึ่ง Document อินสแตนซ์และเรียก GetChildNodes ทำซ้ำแทนการโหลดไฟล์ใหม่สำหรับแต่ละการสืบค้น.
  • Check IsConflictPage: OneNote sync สามารถสร้างหน้าขัดแย้งได้. กรองด้วย [p for p in doc if not p.IsConflictPage] ก่อนการประมวลผลเนื้อหา.
  • ใช้ LoadHistory=False (ค่าเริ่มต้น) เพื่อความเร็ว: ประวัติเพจเพิ่มการใช้หน่วยความจำและภาระการแยกวิเคราะห์อย่างมีนัยสำคัญ. ตั้งค่าเฉพาะเมื่อ LoadHistory=True เมื่อคุณต้องการข้อมูลการแก้ไขอย่างชัดเจน.
  • สตรีมสำหรับไฟล์ขนาดใหญ่: ส่งออบเจ็กต์ไฟล์ที่เปิดอยู่แทนสตริงเส้นทางเมื่ออ่านไฟล์ขนาดใหญ่ .one ไฟล์เพื่อหลีกเลี่ยงการเปิดไฟล์ค้างไว้หลังจากการแยกวิเคราะห์เสร็จสิ้น.
  • Call DetectLayoutChanges before Save: เมื่อสร้างเอกสารโดยโปรแกรมและเพิ่มโหนด, ให้เรียก DetectLayoutChanges() เพื่อให้แน่ใจว่าพิกัดการจัดเรียงสอดคล้องกันก่อนส่งออกเป็น PDF.

ปัญหาทั่วไป

ปัญหาสาเหตุวิธีแก้
IncorrectPasswordException เมื่อโหลดไฟล์ถูกเข้ารหัส; ไม่รองรับเอกสารที่เข้ารหัสรับสำเนาไฟล์ที่ไม่ได้เข้ารหัส
FileCorruptedException เมื่อโหลดไฟล์ถูกตัดหรือมีรูปแบบภายในที่ไม่รองรับตรวจสอบว่าไฟล์เป็นส่วน .one ที่ถูกต้อง (ไม่ใช่สารบัญ .onetoc2)
UnsupportedSaveFormatException เมื่อบันทึกพยายามบันทึกเป็นรูปแบบอื่นนอกจาก PDFรองรับรูปแบบ PDF เท่านั้นสำหรับการส่งออก
ผลลัพธ์ GetPageHistory ว่างLoadOptions.LoadHistory ไม่ได้ตั้งค่าเป็น True ก่อนการโหลดโหลดเอกสารใหม่ด้วย opts.LoadHistory = True
ModuleNotFoundError: reportlabพยายามส่งออก PDF โดยไม่มี PDF extraติดตั้งส่วนเสริม [pdf]

FAQ

รูปแบบ OneNote ใดที่ Aspose.Note สามารถอ่านได้?

รูปแบบส่วนของ OneNote ทั้งสามรูปแบบ: OneNote2007, OneNote2010 และ OneNoteOnline. ใช้ doc.FileFormat เพื่อระบุว่าเวอร์ชันใดถูกโหลด.

ฉันสามารถเขียนกลับไปยังไฟล์ .one หลังจากอ่านแล้วได้ไหม?

Aspose.Note สำหรับ Python เป็นไลบรารีสำหรับอ่านและส่งออก. ใช้ Document.Save เพื่อสร้างผลลัพธ์ PDF. รูปแบบไบนารี OneNote เป็นแบบอ่านอย่างเดียวในรุ่น FOSS นี้.

ฉันจะอ่านหน้าที่กำหนดโดยชื่อเรื่องได้อย่างไร?

วนซ้ำหน้าโดยใช้ generator expression แล้วเปรียบเทียบคุณสมบัติข้อความหัวข้อกับสตริงเป้าหมายของคุณ:

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,
)

ฉันจะนับหน้าย่อยแยกจากหน้าระดับบนได้อย่างไร?

ใช้ page.Level: ระดับ 1 คือระดับบน, ระดับ 2 คือหน้าย่อย, และต่อไป.

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)}")

Aspose.Note รองรับไฟล์สารบัญ .onetoc2 หรือไม่?

ไม่. รองรับเฉพาะไฟล์ส่วน .one เท่านั้น. โน้ตบุ๊ก .onetoc2 จะทำให้เกิด FileCorruptedException.


API Reference สรุป

คลาส / เมธอดคำอธิบาย
Document(path_or_stream, options?)โหลดไฟล์ .one หรือสร้างเอกสารเปล่า
Document.FileFormatตรวจพบรูปแบบไฟล์ (FileFormat enum)
Document.GetChildNodes(NodeType)ดึงโหนดลูกทั้งหมดของประเภทที่กำหนด
Document.GetPageHistory(page)ดึงประวัติการแก้ไขของหน้า (ต้องการ LoadHistory=True)
Document.Save(target, format_or_options)ส่งออกเป็น PDF โดยเส้นทางไฟล์หรือสตรีม
Document.DetectLayoutChanges()คำนวณเมตริกการจัดวางใหม่หลังจากการแก้ไขโดยโปรแกรม
Document.Accept(visitor)เดินผ่าน DOM โดยใช้ subclass ของ DocumentVisitor
LoadOptions.LoadHistoryตั้งค่าเป็น True เพื่อรวมการแก้ไขหน้าใน DOM
LoadOptions.DocumentPasswordสงวนไว้; ไฟล์ที่เข้ารหัสจะทำให้เกิด IncorrectPasswordException
FileFormatEnum: OneNote2010, OneNoteOnline, OneNote2007, Unknown
SaveFormat.Pdfรูปแบบการส่งออกที่สนับสนุนเพียงแบบเดียว; ทำให้เกิด ValueError สำหรับรูปแบบอื่น
PageHistory.Countจำนวนการแก้ไขของหน้าที่มีอยู่
Page.Levelความลึกของหน้าย่อย (1 = ระดับบนสุด)
Page.IsConflictPageTrue สำหรับสำเนาความขัดแย้งการซิงค์

ดูเพิ่มเติม

 ภาษาไทย