Как экспортировать файл OneNote в PDF с помощью Python
Aspose.Note FOSS for Python позволяет программно экспортировать PDF из файлов разделов Microsoft OneNote .one без необходимости установки Microsoft Office или какого‑либо конвертера документов на уровне операционной системы. Экспорт осуществляется методом Document.Save(), использующим необязательный PDF‑рендерер ReportLab.
Преимущества
- Server-friendly: работает на любой ОС, включая безголовые Linux‑серверы и контейнеры CI/CD
- Stream-capable: сохраняет напрямую в буфер
io.BytesIO, без необходимости во временных файлах - 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
| Option | Type | Default | Description |
|---|---|---|---|
PageIndex | int | 0 | Поле существует; не передаётся в PDF‑экспортер в v26.3.1: не оказывает влияния |
PageCount | int | None | None | Поле существует; не передаётся в 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 и не оказывают влияния: весь документ всегда экспортируется.
Связанные ресурсы: