Как экспортировать файл OneNote в PDF с помощью Python

Как экспортировать файл OneNote в PDF с помощью Python

Aspose.Note FOSS for Python позволяет программно экспортировать PDF из файлов разделов Microsoft OneNote .one без необходимости установки 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. Установите её через дополнительный пакет [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

OptionTypeDefaultDescription
PageIndexint0Поле существует; не передаётся в PDF‑экспортер в v26.3.1: не оказывает влияния
PageCountint | NoneNoneПоле существует; не передаётся в PDF‑экспортер в v26.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

Причина: Был использован формат, отличный от SaveFormat.Pdf. Реализован только SaveFormat.Pdf.

Fix: Всегда используйте SaveFormat.Pdf для экспорта. Другие форматы объявлены для совместимости API, но вызывают UnsupportedSaveFormatException.

3. IncorrectPasswordException

Cause: Файл .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. Перечисление 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 и не оказывают влияния: весь документ всегда экспортируется.


Связанные ресурсы:

 Русский