Как добавить рисованные фигуры в документы Word в .NET
Это руководство показывает, как добавить содержимое в слой рисунков документа Word с помощью Aspose.Words FOSS для .NET: вставка AutoShape, добавление изображения, позиционирование его и обтекание текстом, заполнение и стилизация, группировка нескольких фигур и установка водяного знака. Aspose.Words FOSS для .NET доступен через NuGet или сборкой из исходного кода.
Пошаговое руководство
Шаг 1: Получить библиотеку
Склонируйте репозиторий и соберите Aspose.Words.sln в конфигурации Release, затем добавьте ссылку на проект Aspose.Words.csproj из вашего собственного проекта .NET, как описано в Руководстве по установке. Добавьте using Aspose.Words; and using Aspose.Words.Drawing; в начало любого файла, работающего с фигурами.
Шаг 2: Добавить AutoShape
Создайте форму напрямую с помощью new Shape(doc, shapeType), где shapeType — это значение ShapeType, например Rectangle, Ellipse, Star или TextBox, затем вставьте её в дерево с помощью DocumentBuilder.InsertNode(node). Shape — это конкретный, запечатлённый класс, который вы создаёте и настраиваете; он наследуется от абстрактного ShapeBase, который определяет позицию (Left, Top, Width, Height, Rotation) и под-объекты форматирования (Fill, Stroke, ShadowFormat, Glow, Reflection), общие с GroupShape.
Шаг 3: Добавить изображение
DocumentBuilder.InsertImage — это прямой путь для изображений: перегрузки принимают Image, путь к файлу, Stream или массив необработанных байтов, а также дополнительные перегрузки, принимающие явные width/height или полные аргументы позиционирования (horzPos, left, vertPos, top, width, height, wrapType). Свойство ImageData получившегося Shape хранит данные изображения — вызовите ImageData.SetImage(...), чтобы заменить картинку, и используйте CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast и GrayScale для базовых настроек.
Шаг 4: Позиционировать форму и обтекать текст
Встроенная форма (результат по умолчанию от InsertImage) течёт вместе с окружающим текстом и игнорирует свойства позиционирования, пока не будет плавающей — проверьте IsInline, чтобы убедиться, в каком режиме находится форма. Чтобы сделать форму плавающей, установите WrapType в значение, отличное от inline, и задайте RelativeHorizontalPosition / RelativeVerticalPosition (каждое относительно Page, Margin, Column или аналогичного якоря) вместе с смещениями Left/Top. WrapSide управляет обтеканием по сторонам, а HorizontalAlignment / VerticalAlignment обеспечивают простое относительное выравнивание вместо явных смещений.
Шаг 5: Заполнить и оформить форму
Shape.Fill (объект Fill) закрашивает внутренность формы: Fill.Solid(color) для сплошного цвета, Fill.OneColorGradient(...) / Fill.TwoColorGradient(...) для градиентов, Fill.Patterned(patternType) для узора и Fill.SetImage(...) для заполнения изображением — FillType сообщает, какой из вариантов сейчас активен. Обводка берётся из свойства Stroke. Для эффектов ShadowFormat, Glow (GlowFormat), Reflection (ReflectionFormat) и SoftEdge (SoftEdgeFormat) каждый раскрывает свои настройки и метод Remove(), который очищает эффект, возвращая его к «нет».
Шаг 6: Группировать несколько форм
Объедините несколько форм в один блок с помощью DocumentBuilder.InsertGroupShape(shapes), который возвращает GroupShape. GroupShape сам по себе является ShapeBase, поэтому он имеет свои собственные Fill, ShadowFormat, Glow и Reflection, применимые ко всей группе; перемещайте или изменяйте размер GroupShape, а не отдельных дочерних элементов, чтобы координатное преобразование группы оставалось согласованным. Для формы, содержащей текст, Shape.TextBox (объект TextBox) управляет отступами (InternalMarginLeft/Right/Top/Bottom), автоматическим размером (FitShapeToText), направлением текста (LayoutFlow) и вертикальным выравниванием (VerticalAnchor).
Шаг 7: Добавить водяной знак
Document.Watermark управляет единственным водяным знаком на уровне всего документа, независимым от любой формы, которую вы вставляете вручную. Вызовите Watermark.SetText(text) или SetText(text, options) для текстового водяного знака, или SetImage(...) для изображённого водяного знака; Watermark.Remove() удаляет его, а Watermark.Type сообщает текущий WatermarkType (Text, Image или None). TextWatermarkOptions задаёт FontFamily, FontSize, Color и Layout (WatermarkLayout.Horizontal или Diagonal); ImageWatermarkOptions задаёт Scale и IsWashout.
Распространённые проблемы и решения
Setting Left/Top на фигуре не оказывает видимого эффекта. Фигура всё ещё встроена (IsInline == true). Установить WrapType в плавающее значение и установить RelativeHorizontalPosition/RelativeVerticalPosition чтобы свойства смещения вступили в силу.
Shape.ImageData выбрасывает исключение или ничего не возвращает. Фигура не является фигурой изображения. Проверьте Shape.HasImage перед чтением ImageData.
Дочерние фигуры группы не перемещаются вместе. Дети были перемещены по отдельности вместо перемещения через группу. Переместите или измените размер. GroupShape сам по себе, поэтому его преобразование координат применяется ко всем дочерним элементам.
Текст водяного знака не использует запрошенный шрифт. Нет TextWatermarkOptions был передан. Вызовите Watermark.SetText(text, options) с TextWatermarkOptions экземпляр, у которого FontFamily установлен.
Часто задаваемые вопросы
В чём разница между Shape и ShapeBase?
ShapeBase — это абстрактный базовый класс, общий для Shape и GroupShape. Пишите код относительно ShapeBase, когда необходимо единообразно обрабатывать любой из типов; используйте Shape напрямую для членов, специфичных для одного объекта чертежа, например ImageData.
Как вставить изображение с определённым размером?
Используйте перегрузку DocumentBuilder.InsertImage, принимающую явные аргументы width и height, вместе с источником изображения (это Image, путь к файлу, Stream или массив байтов).
Как заставить форму плавать вместо того, чтобы она находилась в строке с текстом?
Установите её WrapType в значение, отличное от inline, и задайте RelativeHorizontalPosition / RelativeVerticalPosition, чтобы смещения Left/Top интерпретировались относительно страницы, поля или колонки.
Можно ли в документе одновременно иметь как текстовый, так и изображённый водяной знак?
№ Document.Watermark.Type сообщает тип текущего водяного знака; вызов SetText или SetImage заново заменит любой ранее установленный водяной знак.
Как удалить тень или отражение с фигуры?
Вызовите Remove() у соответствующего объекта форматирования — Shape.ShadowFormat.Remove() или Shape.Reflection.Remove().