Рисование фигур и водяных знаков

Рисование фигур и водяных знаков

Рисование фигур и водяных знаков

В 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Настройте внешний вид текстового или графического водяного знака.

См. также:

 Русский