绘制形状和水印

绘制形状和水印

Word 文档将 AutoShapes、图片、文本框和 OLE 对象保存在一个单独的绘图层中,与段落/运行文本流分离。Aspose.Words FOSS 用于 .NET 将此层建模为 Shape 类(具体的绘图对象)及其抽象基类 ShapeBase,两者都属于 Aspose.Words.Drawing 命名空间。本指南涵盖形状模型、插入图片和 AutoShapes、定位和环绕、填充与效果、分组以及水印。


形状和 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) 将其插入树中。


使用 DocumentBuilder 插入图片和 AutoShapes

针对图片,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 报告形状是随文本流动(内联)还是独立浮动。


填充、描边和效果

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。


技巧与最佳实践

  • 在编写应同时适用于单个Shape和GroupShape实例的代码时,请使用ShapeBase;当需要图片或AutoShape特定成员(如ImageData或Chart)时,请直接使用Shape。
  • 在将形状设为浮动时,将RelativeHorizontalPosition/RelativeVerticalPosition与WrapType一起设置——内联形状(InsertImage的默认设置)在未设为浮动之前会忽略定位属性。
  • 对于全文统一的水印,建议使用Document.Watermark,而不是手动插入并将Shape放置在文本后面。
  • 使用对象的Remove()方法(ShadowFormat.Remove()、ReflectionFormat.Remove())来清除效果,而不是将各个属性设为零。
  • 在访问ImageData、Chart或特定组成员之前,请检查Shape.HasImage、Shape.HasChart或Shape.IsGroup,因为Shape可能代表多种绘图对象中的任意一种。

常见问题

问题原因解决方案
在形状上设置 Left/Top 没有可见效果形状仍然是内联的(IsInline == true)将 WrapType 设置为浮动值,并设置 RelativeHorizontalPosition/RelativeVerticalPosition 以使定位属性生效
Shape.ImageData 抛出异常或为空该形状不是图片形状在读取 ImageData 之前检查 Shape.HasImage
水印文字与请求的字体不匹配未提供 TextWatermarkOptions传入一个 TextWatermarkOptions 实例,并将 FontFamily 设置为 Watermark.SetText(text, options)
组的子形状不会一起移动子项被直接重新定位,而不是通过组移动或调整 GroupShape 本身,使其坐标变换应用于所有子项

FAQ

Shape 和 ShapeBase 有何区别?

ShapeBase 是 Shape 和 GroupShape 共享的抽象基类。 在需要统一处理两种类型的代码中使用 ShapeBase;当你需要特定于单个绘图对象的成员时(例如 ImageData 或 Chart),请使用 Shape。

如何向文档添加图片?

使用 DocumentBuilder.InsertImage 的其中一个重载 —— 传入 Image、文件路径、Stream 或字节数组,可选地附加 width/height 或完整的定位参数。

如何让形状浮动而不是与文本内联?

将其 WrapType 设置为非内联值,并设置 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配置文本或图片水印的外观。

另请参阅

 中文