Рисование фигур и водяных знаков
Рисование фигур и водяных знаков
В Word-документах AutoShapes, изображения, текстовые поля и OLE-объекты хранятся в отдельном слое рисования, отличном от потока текста абзаца/запуска. Aspose.Words FOSS для .NET моделирует этот слой с помощью класса Shape (конкретные объекты рисования) и его абстрактной базовой ShapeBase, обе находятся в пространстве имён Aspose.Words.Drawing. В этом руководстве рассматриваются модель фигур, вставка изображений и AutoShapes, позиционирование и обтекание, заливки и эффекты, группировка и водяные знаки.
Модель Shape и ShapeBase
Shape — sealed, и тип, с которым вы работаете напрямую, — представляет AutoShape, текстовое поле, произвольную форму, OLE-объект, управляющий элемент ActiveX или изображение в слое рисования. Он наследуется от абстрактного ShapeBase, который предоставляет свойства, общие для каждого объекта рисования: позиция (Left, Top, Width, Height, Rotation), значение перечисления ShapeType и под-объекты форматирования, такие как Fill, Stroke, ShadowFormat, Glow и Reflection. GroupShape (также ShapeBase) представляет группу фигур, рассматриваемую как единое целое. Создайте отдельную фигуру напрямую с помощью new Shape(doc, shapeType), где shapeType — значение ShapeType, например Rectangle, Ellipse, Star или TextBox, после чего вставьте её в дерево с помощью DocumentBuilder.InsertNode(node).
Вставка изображений и AutoShapes с помощью DocumentBuilder
Для изображений конкретно, DocumentBuilder.InsertImage — более прямой путь: перегрузки принимают Image, путь к файлу, Stream или массив необработанных байтов, с дополнительными перегрузками, задающими явные width/height или полное позиционирование (horzPos, left, vertPos, top, width, height, wrapType). Полученный Shape открывает данные изображения через свойство ImageData — ImageData.SetImage(...) для замены изображения, плюс CropTop/CropBottom/CropLeft/CropRight, Brightness, Contrast и GrayScale для базовых настроек. Экземпляры GroupShape создаются с помощью DocumentBuilder.InsertGroupShape(shapes).
Позиционирование и обтекание текста
Размещение формы относительно страницы контролируется RelativeHorizontalPosition и RelativeVerticalPosition (каждый относительно Page, Margin, Column или аналогичных привязок), а также свойствами смещения Left/Top. HorizontalAlignment и VerticalAlignment отвечают за простое относительное выравнивание. Как окружающий текст обтекает форму задаётся с помощью WrapType и, для обтекания конкретной стороны, WrapSide. IsInline сообщает, следует ли форма за текстом (inline) или плавает независимо.
Заливки, Обводки и Эффекты
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() для очистки эффекта.
Группировка форм и текстовых блоков
Несколько форм можно объединить в GroupShape, который сам ведёт себя как единый ShapeBase со своими Fill, ShadowFormat, Glow и Reflection. Для формы, содержащей текст, Shape.TextBox (объект TextBox) предоставляет специфичные для текста параметры макета: InternalMarginLeft/Right/Top/Bottom — отступы, FitShapeToText — автоматический размер формы, LayoutFlow — направление текста и VerticalAnchor — вертикальное выравнивание текста внутри формы.
Watermarks
Document.Watermark (объект 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.
Советы и лучшие практики
- Используйте
ShapeBase, когда пишете код, который должен работать как с одиночнымиShape, так и сGroupShapeэкземплярами; используйтеShapeнапрямую, когда нужны специфические для рисунка или AutoShape члены, такие какImageDataилиChart. - Установите
RelativeHorizontalPosition/RelativeVerticalPositionвместе сWrapType, когда плаваете форму — встроенная форма (по умолчанию дляInsertImage) игнорирует свойства позиционирования, пока вы не сделаете её плавающей. - Отдавайте предпочтение
Document.Watermarkдля единого водяного знака на всём документе, а не вручную вставлять и позиционироватьShapeза текстом. - Очистите эффект с помощью метода
Remove()объекта (ShadowFormat.Remove(),ReflectionFormat.Remove()), вместо того чтобы устанавливать отдельные свойства в ноль. - Проверьте
Shape.HasImage,Shape.HasChartилиShape.IsGroupперед доступом кImageData,Chartили членам, специфичным для группы, посколькуShapeможет представлять любой из нескольких типов графических объектов.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
Установка Left/Top на фигуре не оказывает видимого эффекта | Фигура всё ещё встроена (IsInline == true) | Установите WrapType в плавающее значение и задайте RelativeHorizontalPosition/RelativeVerticalPosition, чтобы свойства позиционирования вступили в силу |
Shape.ImageData вызывает исключение или пустой | Фигура не является фигурой изображения | Проверьте Shape.HasImage перед чтением ImageData |
| Текст водяного знака не соответствует запрошенному шрифту | Не было предоставлено TextWatermarkOptions | Передайте экземпляр TextWatermarkOptions с параметром FontFamily, установленным в Watermark.SetText(text, options) |
| Дочерние фигуры группы не перемещаются вместе | Дочерние элементы были перемещены напрямую, а не через группу | Переместите или измените размер самого GroupShape, чтобы его координатное преобразование применялось ко всем дочерним элементам |
FAQ
В чём разница между Shape и ShapeBase?
ShapeBase — это абстрактный базовый класс, общий для Shape и GroupShape. Используйте ShapeBase в коде, который должен обрабатывать оба типа одинаково; используйте Shape, когда нужны члены, специфичные для одного графического объекта, например ImageData или Chart.
Как добавить изображение в документ?
Используйте одну из перегрузок DocumentBuilder.InsertImage — передайте Image, путь к файлу, Stream или массив байтов, при желании с width/height или полными аргументами позиционирования.
Как сделать форму плавающей вместо размещения её в строке текста?
Установите её WrapType в значение, отличное от inline, и задайте RelativeHorizontalPosition / RelativeVerticalPosition, чтобы смещения Left/Top формы интерпретировались относительно страницы, поля или колонки.
Можно ли добавить одновременно текстовый и графический водяной знак?
Document.Watermark.Type отражает текущий тип водяного знака; установка нового водяного знака с помощью SetText или SetImage заменяет предыдущий, поэтому в документе одновременно может быть не более одного активного водяного знака.
Как удалить тень или отражение с фигуры?
Вызовите Remove() на соответствующем объекте форматирования — Shape.ShadowFormat.Remove() или Shape.Reflection.Remove().
API Reference Сводка
| Класс/Метод | Описание: |
|---|---|
Shape | Один объект слоя чертежа — AutoShape, изображение, текстовое поле или OLE-объект. |
ShapeBase | Абстрактный базовый класс, общий для Shape и GroupShape. |
GroupShape | Группа фигур, рассматриваемая как один объект чертежа. |
DocumentBuilder.InsertImage | Вставляет форму изображения в позицию курсора, с необязательными параметрами размера и позиционирования. |
ImageData | Данные изображения и корректировки (обрезка, яркость, контраст) на Shape. |
Fill | Форматирование внутренней заливки — сплошная, градиент, узор или изображение. |
RelativeHorizontalPosition / RelativeVerticalPosition | Относительно чего измеряется позиция плавающей формы. |
WrapType / WrapSide | Как окружающий текст обтекает форму. |
TextBox | Параметры размещения текста для фигуры, содержащей текст. |
Document.Watermark | Управляет текстовым или графическим водяным знаком документа. |
TextWatermarkOptions / ImageWatermarkOptions | Настройте внешний вид текстового или графического водяного знака. |