绘制形状和水印
绘制形状和水印
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 | 配置文本或图片水印的外观。 |