図形と透かしの描画
図形と透かしの描画
Word 文書は AutoShapes、画像、テキスト ボックス、OLE オブジェクトを段落/ラン テキスト フローとは別の独立した描画レイヤーに保持します。Aspose.Words FOSS for .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 でもある)は、1つのユニットとして扱われるシェイプのグループを表します。単独のシェイプは 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 は形状がテキストとともに流れるか(インライン)あるいは独立して浮くかを報告します。
塗り、線、効果
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 に結合でき、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を使用します;Shapeは、ImageDataやChartのような画像またはAutoShape固有のメンバーが必要な場合に直接使用します。 - シェイプをフロートさせるときは、
RelativeHorizontalPosition/RelativeVerticalPositionをWrapTypeと一緒に設定します — インライン シェイプ(InsertImageのデフォルト)は、フロートさせるまで位置プロパティを無視します。 - テキストの背後に
Shapeを手動で挿入して配置するよりも、文書全体にわたる単一の透かしにはDocument.Watermarkを使用する方がよいです。 - 個々のプロパティをゼロに設定するのではなく、オブジェクトの
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が提供されませんでした | FontFamilyがWatermark.SetText(text, options)に設定されたTextWatermarkOptionsインスタンスを渡してください |
| グループの子シェイプは一緒に移動しません | 子要素はグループを介さずに直接再配置されました | 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 で新しい透かしを設定すると、以前の透かしは置き換えられるため、ドキュメントに同時にアクティブな透かしは最大で1つしか存在しません。
シェイプから影や反射を削除するにはどうすればよいですか?
対応するフォーマットオブジェクト上で Remove() を呼び出します — Shape.ShadowFormat.Remove() または Shape.Reflection.Remove()。
API Reference の概要
| クラス/メソッド | 説明 |
|---|---|
Shape | 単一の描画レイヤーオブジェクト — AutoShape、画像、テキストボックス、または OLE オブジェクト。 |
ShapeBase | Shape と GroupShape が共有する抽象基底クラス。 |
GroupShape | 1 つの描画オブジェクトとして扱われるシェイプのグループ。 |
DocumentBuilder.InsertImage | カーソル位置に画像シェイプを挿入し、サイズや位置をオプションで指定できます。 |
ImageData | 画像データと画像調整(切り抜き、明るさ、コントラスト)は Shape 上です。 |
Fill | 内部塗りつぶしの書式設定 — 単色、グラデーション、パターン、または画像。 |
RelativeHorizontalPosition / RelativeVerticalPosition | フローティング シェイプの位置が測定される基準。 |
WrapType / WrapSide | 周囲のテキストが図形に回り込む方法。 |
TextBox | テキストを含む図形のテキストレイアウト設定。 |
Document.Watermark | ドキュメントのテキストまたは画像の透かしを管理します。 |
TextWatermarkOptions / ImageWatermarkOptions | テキストまたは画像の透かしの外観を設定します。 |