ドキュメントとは別に図形をレンダリングする

ドキュメントを処理するときの一般的なタスクは、ドキュメント内にあるすべての画像を抽出し、外部の場所にエクスポートすることです。画像データを抽出して保存する機能がすでに提供されている Aspose.Words API を使用すると、この作業が簡単になります。ただし、段落、矢印の形状、小さな画像を含むテキスト ボックスなど、異なる種類の描画オブジェクトで表される他の種類のグラフィック コンテンツを同様に抽出したい場合があります。このオブジェクトは個々のコンテンツ要素の組み合わせであるため、このオブジェクトをレンダリングする簡単な方法はありません。また、コンテンツが 1 つの画像のように見えるオブジェクトにグループ化されている場合もあります。

Aspose.Words は、図形から単純なイメージをレンダリングされたコンテンツとして抽出するのと同じ方法で、このタイプのコンテンツを抽出する機能を提供します。この記事では、この機能を利用してドキュメントとは独立して図形をレンダリングする方法について説明します。

Aspose.Words の形状タイプ

ドキュメント描画レイヤー内のすべてのコンテンツは、Aspose.Words ドキュメント オブジェクト モジュール (DOM) の Shape または GroupShape ノードによって表されます。このようなコンテンツには、テキスト ボックス、画像、オートシェイプ、OLE オブジェクトなどが含まれます。INCLUDEPICTURE フィールドなど、一部のフィールドは図形としてインポートすることもできます。

単純なイメージはShapeType.IMAGEShapeノードで表されます。このシェイプ ノードには子ノードはありませんが、このシェイプ ノード内に含まれる画像データには Shape.image_data プロパティによってアクセスできます。一方、シェイプは多数の子ノードで構成することもできます。たとえば、ShapeType.TEXT_BOX プロパティで表されるテキスト ボックスの形状は、ParagraphTable などの多くのノードで構成されます。ほとんどのシェイプには、Paragraph および Table ブロックレベルのノードを含めることができます。これらは本体に表示されるノードと同じです。図形は常に何らかの段落の一部であり、直接インラインに含まれるか、Paragraph にアンカーされますが、ドキュメント ページのどこにでも「フローティング」します。

rendering-shapes-separately-from-a-document_1

ドキュメントには、グループ化された図形を含めることもできます。 Microsoft Word で Group を有効にするには、複数のオブジェクトを選択し、右クリック メニューで [Group] をクリックします。

rendering-shapes-separately-from-a-document_2

Aspose.Words では、これらのシェイプのグループは GroupShape ノードによって表されます。これらを同じ方法で呼び出して、グループ全体をイメージにレンダリングすることもできます。

rendering-shapes-separately-from-a-document_3

DOCX 形式には、図やチャートなどの特殊なタイプの画像を含めることができます。これらの形状は、Aspose.Words の Shape ノードを通じても表現され、画像としてレンダリングするための同様の方法も提供されます。設計上、その形状が画像 (ShapeType.IMAGE) でない限り、形状に別の形状を子として含めることはできません。たとえば、Microsoft Word では、テキスト ボックスを別のテキスト ボックスの中に挿入することはできません。

上で説明した形状タイプは、ShapeRenderer クラスを通じて形状をレンダリングするための特別なメソッドを提供します。 ShapeRenderer クラスのインスタンスは、get_shape_renderer メソッドを通じて、または ShapeShapeRenderer クラスのコンストラクターに渡すことによって、Shape または GroupShape として取得されます。このクラスは、次の形状をレンダリングできるメンバーへのアクセスを提供します。

  • ディスク上のファイル
  • ストリーム

ファイルまたはストリームへのレンダリング

save メソッドは、シェイプをファイルまたはストリームに直接レンダリングするオーバーロードを提供します。どちらのオーバーロードも ImageSaveOptions クラスのインスタンスを受け入れ、これにより形状をレンダリングするためのオプションを定義できます。これは Document.save メソッドと同じように機能します。このパラメーターは必須ですが、カスタム オプションがないことを指定して null 値を渡すことができます。

形状は、SaveFormat 列挙で指定された任意の画像形式でエクスポートできます。たとえば、イメージは、SaveFormat.JPEG 列挙を指定することによって JPEG などのラスター イメージとしてレンダリングでき、SaveFormat.EMF を指定することによって EMF などのベクトル イメージとしてレンダリングできます。

以下のコード例は、ドキュメントとは別にシェイプを EMF イメージにレンダリングし、ディスクに保存する方法を示しています。

r = shape.get_shape_renderer()

# Define custom options which control how the image is rendered. Render the shape to the JPEG raster format.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.EMF)
imageOptions.scale = 1.5
        
# Save the rendered image to disk.
r.save(docs_base.artifacts_dir + "TestFile.RenderToDisk_out.emf", imageOptions)

以下のコード例は、ドキュメントとは別にシェイプを JPEG 画像にレンダリングし、ストリームに保存する方法を示しています。

r = shape.get_shape_renderer()

# Define custom options which control how the image is rendered. Render the shape to the vector format EMF.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.JPEG)
        
# Output the image in gray scale
imageOptions.image_color_mode = aw.saving.ImageColorMode.GRAYSCALE

# Reduce the brightness a bit (default is 0.5f).
imageOptions.image_brightness = 0.45
        
stream =  io.FileIO(docs_base.artifacts_dir + "TestFile.RenderToStream_out.jpg", "w+b")

# Save the rendered image to the stream using different options.
r.save(stream, imageOptions)

# Close the stream
stream.close()

ImageSaveOptions クラスを使用すると、イメージのレンダリング方法を制御するさまざまなオプションを指定できます。上で説明した機能は、GroupShape ノードと Shape ノードに同じ方法で適用できます。

シェイプ イメージのレンダリング

Shape クラスは、オートシェイプ、テキスト ボックス、フリーフォーム、OLE オブジェクト、ActiveX コントロール、画像などの描画レイヤー内のオブジェクトを表します。 Shape クラスを使用すると、Microsoft Word ドキュメント内の図形を作成または変更できます。形状の重要なプロパティは shape_type です。 Word 文書では、さまざまな種類の図形にさまざまな機能を持たせることができます。たとえば、内部に画像を含めることができるのは画像と OLE 図形だけですが、ほとんどの図形はテキストのみを含めることができます。

次の例は、Shape イメージをドキュメントとは別に JPEG イメージにレンダリングし、ディスクに保存する方法を示しています。

# Save the rendered image to disk.
shape.get_shape_renderer().save(docs_base.artifacts_dir + "TestFile.RenderShapeImage.jpeg", None)

形状サイズの取得

ShapeRenderer クラスは、get_size_in_pixels メソッドを通じて形状のサイズをピクセル単位で取得する機能も提供します。このメソッドは、スケールと DPI という 2 つの浮動小数点 (単一) パラメータを受け入れます。これらは、シェイプがレンダリングされるときにシェイプ サイズの計算に使用されます。このメソッドは、計算されたサイズの幅と高さを含む Size オブジェクトを返します。これは、レンダリングされた形状のサイズを事前に知る必要がある場合に便利です。 size_in_points プロパティは、シェイプ サイズをポイント単位で返します。結果は、幅と高さを含む SizeF オブジェクトです。また、bounds_in_points プロパティを使用して、形状の実際の境界を取得することもできます。