Создание лёгкой модели документа с DocumentReader
Создание Light Document Model с DocumentReader
DocumentReader является точкой входа для чтения файлов DOCX в Aspose.Words FOSS. Он принимает ввод в виде пути к файлу, I/O-потока или необработанных байтов, затем предоставляет документ в виде light_document_model.Document (LDM) — структурированного дерева объектов Python, которое легко просматривать и преобразовывать.
Предварительные требования
| Требование | Подробность |
|---|---|
| Python | 3.9 или новее |
| Package | aspose-words-foss (лицензия MIT) |
| Input | Файл .docx, поток или bytes |
pip install aspose-words-fossЗагрузка из пути к файлу
DocumentReader.load_file(filepath) читает файл DOCX по пути. Затем вызовите to_light_document(), чтобы получить представление LDM.
from aspose.words_foss import DocumentReader
reader = DocumentReader()
reader.load_file("data/report.docx")
doc = reader.to_light_document()
print("Page count:", doc.page_count)
print("Sections:", len(doc.sections))Загрузка из потока
DocumentReader.load_stream(stream) принимает любой объект, подобный файлу, с методом read(). Это полезно для данных, поступающих из ответов HTTP, архивов ZIP или буферов в памяти.
from aspose.words_foss import DocumentReader
reader = DocumentReader()
with open("data/report.docx", "rb") as fh:
reader.load_stream(fh)
doc = reader.to_light_document()
print("Paragraphs:", len(doc.all_paragraphs))Загрузка из байтов
DocumentReader.load_bytes(data) принимает объект bytes или bytearray. Используйте это, когда содержимое DOCX уже находится в памяти (например, получено из базы данных или построено программно).
from aspose.words_foss import DocumentReader
with open("data/report.docx", "rb") as fh:
data = fh.read()
reader = DocumentReader()
reader.load_bytes(data)
doc = reader.to_light_document()
print("Text preview:", doc.text[:200])Навигация по структуре LDM
После вызова to_light_document() возвращаемый объект Document раскрывает полное дерево документа:
from aspose.words_foss import DocumentReader
reader = DocumentReader()
reader.load_file("data/report.docx")
doc = reader.to_light_document()
# Sections
for section in doc.sections:
print("Section paragraphs:", len(section.paragraphs))
# All paragraphs (flat list across all sections)
for para in doc.all_paragraphs:
if para.text.strip():
print(" -", para.text[:80])
# Headings
for heading in doc.headings(max_level=2):
print("H:", heading.text)Чтение полного текста документа
Document.text возвращает полный текстовый контент документа, объединяя весь текст абзацев из всех разделов:
reader = DocumentReader()
reader.load_file("data/report.docx")
doc = reader.to_light_document()
print(doc.text[:500])Советы и лучшие практики
- Всегда вызывайте
load_file(),load_stream()илиload_bytes()перед вызовомto_light_document()— вызовto_light_document()на незагруженном ридере может вызвать ошибку или вернуть пустой документ. - Используйте
load_bytes(), когда вы контролируете жизненный цикл документа в памяти; это избегает открытия файловых дескрипторов. - Используйте
doc.all_paragraphsдля плоской итерации по всем абзацам; используйтеdoc.sections, когда нужно работать раздел за разделом. DocumentReaderреализуетLdmBuilderMixin, что означает, чтоto_light_document()доступен как метод-миксин — тот же интерфейс используется другими классами-ридерами в библиотеке.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
Пустой doc.sections после загрузки | Файл не является действительным DOCX | Убедитесь, что файл открывается в Word; проверьте, что он не защищён паролем |
doc.all_paragraphs пустой | В документе нет основного текста (например, только заголовки/нижние колонтитулы) | Проверьте вместо этого doc.header_paragraphs и doc.footer_paragraphs |
AttributeError на to_light_document() | Метод загрузки не был вызван перед конвертацией | Сначала вызовите один из load_file(), load_stream() или load_bytes() first |
FAQ
Что такое LDM?
Лёгкая модель документа (light_document_model.Document) — это абстрагированное, Python-нативное дерево объектов, представляющее документ Word. Она отделяет логику документа от двоичного формата DOCX и разработана для простого программного манипулирования.
Могу ли я изменить LDM и записать его обратно в DOCX?
Да. После изменения the doc объект, передайте его в LdmDocxWriter.write(doc, path) для создания обновлённого файла DOCX. См. the руководство LdmDocxWriter для подробностей.
Что добавляет LdmBuilderMixin?
LdmBuilderMixin предоставляет метод to_light_document(). DocumentReader наследуется от него, поэтому вы всегда обращаетесь к этому методу через экземпляр reader.
API Reference Сводка
| Класс / Метод | Описание: |
|---|---|
DocumentReader | Читает ввод DOCX и создает представление LDM. |
DocumentReader.load_file(filepath) | Загружает файл DOCX по пути |
DocumentReader.load_stream(stream) | Загружает из потока, похожего на файл |
DocumentReader.load_bytes(data) | Загружает из объекта bytes |
DocumentReader.to_light_document() | Возвращает загруженный документ в виде LDM Document |
LdmBuilderMixin | Mixin, предоставляющий to_light_document() |
Document.sections | Список разделов в документе |
Document.all_paragraphs | Плоский список всех абзацев |
Document.text | Полное содержимое документа в виде простого текста |
Document.page_count | Количество страниц |
Document.headings(max_level) | Список абзацев заголовков до max_level |