ทำงานกับเอกสาร 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 | คำอธิบาย |
|---|---|---|---|
LoadHistory | bool | False | เมื่อ True ประวัติการแก้ไขของหน้า จะถูกรวมอยู่ใน DOM และสามารถเข้าถึงได้ผ่าน Document.GetPageHistory |
DocumentPassword | `str | None` | 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อ็อบเจกต์เมื่อLoadHistoryisFalse(ค่าเริ่มต้น). ตั้งค่าเสมอ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
DetectLayoutChangesbeforeSave: เมื่อสร้างเอกสารโดยโปรแกรมและเพิ่มโหนด, ให้เรียก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 |
FileFormat | Enum: OneNote2010, OneNoteOnline, OneNote2007, Unknown |
SaveFormat.Pdf | รูปแบบการส่งออกที่สนับสนุนเพียงแบบเดียว; ทำให้เกิด ValueError สำหรับรูปแบบอื่น |
PageHistory.Count | จำนวนการแก้ไขของหน้าที่มีอยู่ |
Page.Level | ความลึกของหน้าย่อย (1 = ระดับบนสุด) |
Page.IsConflictPage | True สำหรับสำเนาความขัดแย้งการซิงค์ |
ดูเพิ่มเติม
- การสกัดข้อความ:กำลังสกัดข้อความธรรมดาและรันที่จัดรูปแบบ
- การส่งออก PDF: ตัวเลือกการส่งออก, การเลือกหน้า, และการส่งออกสตรีม
- รูปภาพและไฟล์แนบ: การสกัดภาพฝังตัวและไฟล์ที่แนบมาด้วย
- Tables: การวิเคราะห์โครงสร้างตารางและเนื้อหาเซลล์
- API Reference: เอกสาร
- Aspose.Note — Enterprise Documentation