如何在 .NET 中向 Word 文档添加绘图形状

如何在 .NET 中向 Word 文档添加绘图形状

本指南展示了如何使用 Aspose.Words FOSS for .NET 向 Word 文档的绘图层添加内容:插入 AutoShape、添加图片、定位并对其进行文本环绕、填充与样式设置、对多个形状进行分组以及设置水印。Aspose.Words FOSS for .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)的进一步重载。生成的 Shape 的 ImageData 属性保存图片数据——调用 ImageData.SetImage(...) 可替换图像,并使用 CropTop/CropBottom/CropLeft/CropRight、Brightness、Contrast 和 GrayScale 进行基本调整。


步骤 4:定位形状并环绕文字

内联形状(InsertImage 的默认结果)随周围文字流动,并在未浮动前忽略定位属性——检查 IsInline 以确认形状所处的模式。要使形状浮动,将 WrapType 设置为非内联值,并将 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 编写代码;若要直接使用仅针对单个绘图对象的成员,例如 ImageData,则使用 Shape。

如何插入具有特定尺寸的图片?

使用接受显式 width 和 height 参数的 DocumentBuilder.InsertImage 重载,并提供图像来源(Image、文件路径、Stream 或字节数组)。

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

将其 WrapType 设置为非内联值,并设置 RelativeHorizontalPosition / RelativeVerticalPosition,使 Left/Top 偏移量相对于页面、页边距或栏进行解释。

文档可以同时拥有文字水印和图片水印吗?

No. Document.Watermark.Type 报告当前水印的类型;再次调用 SetText 或 SetImage 将替换之前设置的任何水印。

如何从形状中移除阴影或反射?

在相应的格式化对象上调用 Remove() — Shape.ShadowFormat.Remove() 或 Shape.Reflection.Remove()。

另请参阅

 中文