Как работать с документами в .NET
Это руководство показывает, как работать с объектной моделью Document в Aspose.Words FOSS для .NET: создание пустого документа, безопасную загрузку существующего, обход его структуры разделов/тела, объединение документов и применение ограничения редактирования. Aspose.Words FOSS для .NET доступен через NuGet или сборкой из исходных кодов.
Пошаговое руководство
Шаг 1: Получить библиотеку
Клонируйте репозиторий и соберите Aspose.Words.sln в конфигурации Release, затем добавьте ссылку на проект Aspose.Words.csproj из вашего собственного проекта .NET. Полные команды клонирования и сборки находятся в руководстве по установке. После добавления ссылки добавьте using Aspose.Words; в начале любого файла, работающего с документами.
Шаг 2: Создать или загрузить документ
Вызовите new Document() для получения пустого документа или передайте путь к файлу или Stream в конструктор Document(fileName) / Document(stream), чтобы открыть существующий. Перегрузка, принимающая аргумент LoadOptions, позволяет указать пароль для зашифрованного файла. Прежде чем загружать файл, формат которого вам ещё не доверен, вызовите FileFormatUtil.DetectFileFormat(fileName) — он возвращает FileFormatInfo, сообщающий обнаруженный LoadFormat и то, является ли файл IsEncrypted, HasDigitalSignature или HasMacros, чтобы вы могли отклонить неожиданный ввод до того, как Document попытается его разобрать.
Шаг 3: Создание контента с помощью DocumentBuilder
DocumentBuilder оборачивает Document курсором, которым вы перемещаетесь по дереву, вставляя контент. Write(text) и Writeln(text) вставляют текст в позицию курсора, а InsertParagraph() начинает новый абзац. Форматирование, установленное в свойствах Font, ParagraphFormat, ListFormat и PageSetup билдера, применяется к всему, что вы напишете дальше. Переместите курсор с помощью MoveToDocumentStart(), MoveToDocumentEnd(), MoveToSection(sectionIndex), MoveToBookmark(bookmarkName) или MoveToParagraph(paragraphIndex, characterIndex), и прочитайте CurrentNode / CurrentParagraph / CurrentSection, чтобы подтвердить, где находится билдер.
Шаг 4: Проверка структуры раздела и тела
Document раскрывает SectionCollection через Document.Sections (плюс FirstSection / LastSection). Каждый Section имеет ровно один Body, основной контент которого доступен через Body.Paragraphs (это ParagraphCollection) и Body.Tables. Чтобы читать или искать текст без ручного обхода узлов, используйте Range, доступный на Document, Section, Paragraph и других узлах — Range.Text возвращает его простой текст, а Range.Replace(pattern, replacement) выполняет поиск и замену, ограниченную только этим диапазоном.
Шаг 5: Объединение двух документов
Чтобы скопировать весь документ, вызовите Document.Clone(). Чтобы перенести конкретный контент из одного экземпляра Document в другой, вызовите ImportNode(srcNode, isImportChildren) в целевом документе или вызовите Document.AppendDocument(srcDoc, importFormatMode), чтобы добавить каждый раздел исходного документа в конец текущего. DocumentBuilder.InsertDocument(srcDoc, importFormatMode) делает то же самое, но вставляет в позицию курсора билдера, а не в конец. Во всех трех случаях сознательно выбирайте значение ImportFormatMode — KeepSourceFormatting, UseDestinationStyles или KeepDifferentStyles, поскольку оно определяет, стили какого документа победят, когда они сталкиваются.
Шаг 6: Применение ограничения редактирования
Вызовите Document.Protect(type, password) со значением ProtectionType — ReadOnly, AllowOnlyComments, AllowOnlyRevisions или AllowOnlyFormFields — чтобы ограничить, какие правки Word принимает для документа. Unprotect() (с паролем или без него) снимает ограничение. Это влияет только на редактирование внутри Word; файл не шифруется. Чтобы требовать пароль только для открытия файла, задайте OoxmlSaveOptions.Password при сохранении.
Распространённые проблемы и их решения
Document(fileName) вызывает исключение для файла, который открывается без проблем в Word. Формат файла не поддерживается загрузчиками этой версии. Вызовите FileFormatUtil.DetectFileFormat(fileName) сначала проверьте возвращённое LoadFormat перед попыткой загрузки.
Содержимое, скопированное между документами, берёт неправильные шрифты или стили. Эта ImportFormatMode передано в AppendDocument or InsertDocument не соответствует тому, что вы ожидали. Передайте KeepSourceFormatting or UseDestinationStyles явно, а не полагаясь на значение по умолчанию.
Unprotect() по-видимому не оказывает влияния. Либо документ не был защищён паролем (вызов Unprotect() без аргументов), либо предоставленный пароль не совпадает с тем, который Protect() был вызван с ним.
Форматирование, применённое через DocumentBuilder не отображается там, где ожидалось. Форматирование уровня Builder (Font, ParagraphFormat) применяется только к контенту, написанному after когда оно установлено. Переместите курсор и задайте форматирование перед вызовом Write/Writeln, не после.
Часто задаваемые вопросы
Как создать новый пустой документ Word?
Вызовите new Document(). Оберните его в DocumentBuilder, чтобы сразу начать вставлять контент.
В чём разница между Document.Clone() и ImportNode?
Clone() копирует весь документ в новый экземпляр Document. ImportNode(srcNode, isImportChildren) переносит один узел — и при желании его дочерние элементы — из дерева одного документа в другой, что используется для объединения конкретного содержимого, а не целых документов.
Как безопасно проверить формат файла перед его загрузкой?
Вызовите FileFormatUtil.DetectFileFormat(fileName) (или перегрузку Stream) и проверьте свойства LoadFormat, IsEncrypted, HasDigitalSignature и HasMacros у возвращённого FileFormatInfo, прежде чем передать файл в Document.
Как прочитать только абзацы внутри тела документа?
Используйте коллекцию Body.Paragraphs в Body раздела, либо Body.GetChildNodes(nodeType, isDeep) для других типов узлов.
Шифрует ли Document.Protect сохраняемый файл?
Нет — это ограничение на редактирование, которое Word применяет при открытии файла. Чтобы требовать пароль для самого открытия файла, установите OoxmlSaveOptions.Password при вызове Document.Save.