วิธีส่งออกไฟล์ OneNote เป็น PDF ด้วย Python

วิธีส่งออกไฟล์ OneNote เป็น PDF ด้วย Python

Aspose.Note FOSS for Python ทำให้สามารถส่งออก PDF ของไฟล์ส่วน .one ของ Microsoft OneNote อย่างโปรแกรมได้โดยไม่ต้องใช้ Microsoft Office หรือโปรแกรมแปลงเอกสารระดับระบบปฏิบัติการ การส่งออกจะดำเนินการโดยวิธี Document.Save() ที่สนับสนุนโดยตัวเรนเดอร์ PDF ทางเลือก ReportLab

ประโยชน์

  1. Server-friendly: ทำงานบนระบบปฏิบัติการใดก็ได้ รวมถึงเซิร์ฟเวอร์ Linux แบบไม่มีหน้าจอและคอนเทนเนอร์ CI/CD
  2. Stream-capable: บันทึกโดยตรงไปยังบัฟเฟอร์ io.BytesIO, ไม่ต้องใช้ไฟล์ชั่วคราว
  3. Free and open-source: ไลเซนส์ MIT

ข้อกำหนดเบื้องต้น

การส่งออก PDF ต้องการการพึ่งพา ReportLab ที่เป็นตัวเลือก. ติดตั้งผ่าน extra [pdf]:

pip install "aspose-note[pdf]"

หากคุณได้ติดตั้ง aspose-note ไว้แล้วโดยไม่มีส่วนเสริม:

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

ตรวจสอบว่า ReportLab พร้อมใช้งาน:

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

คู่มือแบบขั้นตอนต่อขั้นตอน

ขั้นตอนที่ 1: ติดตั้ง aspose-note พร้อมการสนับสนุน PDF

pip install "aspose-note[pdf]"

ยืนยันการติดตั้ง:

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

ขั้นตอนที่ 2: โหลดไฟล์ OneNote

from aspose.note import Document

doc = Document("MyNotes.one")

ขั้นตอนที่ 3: ส่งออกเอกสารทั้งหมดเป็น PDF

การส่งออกที่ง่ายที่สุด ครอบคลุมทุกหน้าโดยใช้การตั้งค่าเริ่มต้น:

from aspose.note import Document, SaveFormat

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

ขั้นตอนที่ 4: ใช้ PdfSaveOptions

PdfSaveOptions ให้คุณกำหนดค่าการส่งออก PDF:

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

doc = Document("MyNotes.one")

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

ตัวเลือก PdfSaveOptions ที่พร้อมใช้งาน

ตัวเลือกประเภทค่าเริ่มต้นคำอธิบาย
PageIndexint0ฟิลด์มีอยู่; ไม่ส่งต่อไปยังตัวส่งออก PDF ในเวอร์ชัน 26.3.1: ไม่มีผล
PageCountint | NoneNoneฟิลด์มีอยู่; ไม่ส่งต่อไปยังตัวส่งออก PDF ในเวอร์ชัน 26.3.1: ไม่มีผล

ขั้นตอนที่ 5: ส่งออกไปยังสตรีมในหน่วยความจำ

Document.Save() ยอมรับสตรีมไบนารีโดยตรง: ไม่ต้องใช้ไฟล์ชั่วคราว:

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

ขั้นตอนที่ 6: ส่งออกหลายไฟล์เป็นชุด

ประมวลผลไฟล์ .one ทั้งหมดในไดเรกทอรี:

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

ปัญหาทั่วไปและการแก้ไข

1. ImportError: ไม่มีโมดูลชื่อ ‘reportlab’

สาเหตุ: ส่วนเสริม [pdf] ไม่ได้ถูกติดตั้ง.

แก้ไข:

pip install "aspose-note[pdf]"

2. UnsupportedSaveFormatException

Cause: รูปแบบที่ใช้ไม่ใช่ SaveFormat.Pdf. มีเพียง SaveFormat.Pdf เท่านั้นที่ได้ถูกนำมาใช้.

Fix: ใช้ SaveFormat.Pdf สำหรับการส่งออกเสมอ. รูปแบบอื่น ๆ ถูกประกาศเพื่อความเข้ากันได้ของ API แต่จะทำให้เกิด UnsupportedSaveFormatException.

3. IncorrectPasswordException

สาเหตุ: ไฟล์ .one ถูกเข้ารหัส. เอกสารที่เข้ารหัสไม่รองรับ.

Fix: ใช้ไฟล์ที่ไม่ได้เข้ารหัส .one. ผลิตภัณฑ์เชิงพาณิชย์ Aspose.Note รองรับการเข้ารหัส.

4. FileNotFoundError

สาเหตุ: เส้นทางไฟล์อินพุต .one ไม่ถูกต้อง.

แก้ไข: ใช้ pathlib.Path.exists() เพื่อตรวจสอบก่อนโหลด:

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 ที่ส่งออกเป็นไฟล์เปล่าหรือว่างเปล่า

สาเหตุ: ไฟล์ .one มีหน้าแต่ไม่มีเนื้อหาข้อความ (มีเฉพาะรูปภาพหรือ ตารางที่ไม่มีข้อความ) ตัวเรนเดอร์ PDF สร้างหน้าตามสิ่งที่ ReportLab สามารถเรนเดอร์จาก DOM ได้.

Fix: ตรวจสอบเนื้อหาหน้าก่อนส่งออก:

from aspose.note import Document, RichText

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

คำถามที่พบบ่อย

รูปแบบการบันทึกที่รองรับมีอะไรบ้าง?

ขณะนี้มีการใช้งานเฉพาะ SaveFormat.Pdf เท่านั้น. enum SaveFormat มีสมาชิกเพียงหนึ่งเดียว: SaveFormat.Pdf.

ฉันสามารถส่งออกเป็นสตรีมแทนไฟล์ได้หรือไม่?

ใช่. Document.Save() ยอมรับสตรีมไบนารีที่เขียนได้ใด ๆ เป็นอาร์กิวเมนต์แรกของมัน:

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

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

การส่งออกรักษาลำดับหน้าไว้หรือไม่?

ใช่. หน้าเหล่านั้นจะถูกส่งออกตามลำดับเดียวกับที่ปรากฏใน DOM (ลำดับที่ได้จากการวนซ้ำ Document).

การส่งออก PDF มีให้ใช้งานบน Linux หรือไม่?

ใช่. ReportLab และ Aspose.Note FOSS for Python ทั้งสองเป็นแบบไม่ขึ้นกับระบบปฏิบัติการ.

ฉันสามารถส่งออกส่วนย่อยของหน้าได้หรือไม่?

ฟิลด์ PdfSaveOptions.PageIndex และ PageCount มีอยู่แต่ไม่ได้ส่งต่อไปยังตัวส่งออก PDF ในเวอร์ชัน 26.3.1 และไม่มีผลกระทบ: เอกสารทั้งหมดจะถูกส่งออกเสมอ


แหล่งข้อมูลที่เกี่ยวข้อง:

 ภาษาไทย