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

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

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

Aspose.Wordsの図形の種類

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

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-1

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-2

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-3

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

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

  • Saveメソッドオーバーロードを使用してディスク上のファイル
  • Saveメソッドオーバーロードを使用したストリーム
  • RenderToSizeメソッドとRenderToScaleメソッドを使用したGraphicsオブジェクト

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

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

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Define custom options which control how the image is rendered. Render the shape to the JPEG raster format.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Emf);
imageOptions->set_Scale(1.5f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToDisk.emf";
// Save the rendered image to disk.
r->Save(outputPath, imageOptions);

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = System::MakeObject<ShapeRenderer>(shape);
// Define custom options which control how the image is rendered. Render the shape to the vector format EMF.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Jpeg);
imageOptions->set_ImageColorMode(ImageColorMode::Grayscale);
imageOptions->set_ImageBrightness(0.45f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToStream.jpg";
System::SharedPtr<System::IO::FileStream> stream = System::MakeObject<System::IO::FileStream>(outputPath, System::IO::FileMode::Create);
// Save the rendered image to the stream using different options.
r->Save(stream, imageOptions);

ImageSaveOptionsクラスを使用すると、イメージのレンダリング方法を制御するさまざまなオプションを指定できます。 上記の機能は、GroupShapeおよびShapeノードにも同様に適用することができます。

.NETGraphicsオブジェクトへのレンダリング

Graphicsオブジェクトに直接レンダリングすると、独自の設定とGraphicsオブジェクトの状態を定義できます。 一般的なシナリオでは、図形をWindowsフォームまたはビットマップから取得したGraphicsオブジェクトに直接レンダリングします。 Shapeノードがレンダリングされると、設定はシェイプの外観に影響します。 たとえば、Graphicsオブジェクトに対してRotateTransformメソッドまたはScaleTransformメソッドを使用して、図形を回転または拡大縮小できます。

以下の例は、図形をaにレンダリングする方法を示しています。NET Graphicsドキュメントとは別にオブジェクトを作成し、レンダリングされたイメージに回転を適用します:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and resolution.
System::Drawing::Size shapeSizeInPixels = r->GetSizeInPixels(1.0f, 96.0f);
// Rotating the shape may result in clipping as the image canvas is too small. Find the longest side
// And make sure that the graphics canvas is large enough to compensate for this.
int32_t maxSide = System::Math::Max(shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>((int32_t)(maxSide * 1.25), (int32_t)(maxSide * 1.25)));
{
// Rendering to a graphics object means we can specify settings and transformations to be applied to
// The shape that is rendered. In our case we will rotate the rendered shape.
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> grHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Clear the shape with the background color of the document.
grHolder.GetObject()->Clear(shape->get_Document()->get_PageColor());
// Center the rotation using translation method below
grHolder.GetObject()->TranslateTransform((float)imageHolder.GetObject()->get_Width() / 8, (float)imageHolder.GetObject()->get_Height() / 2);
// Rotate the image by 45 degrees.
grHolder.GetObject()->RotateTransform(45.0f);
// Undo the translation.
grHolder.GetObject()->TranslateTransform(-(float)imageHolder.GetObject()->get_Width() / 8, -(float)imageHolder.GetObject()->get_Height() / 2);
// Render the shape onto the graphics object.
r->RenderToSize(grHolder.GetObject(), 0.0f, 0.0f, shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
}
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToGraphics.png";
imageHolder.GetObject()->Save(outputPath, System::Drawing::Imaging::ImageFormat::get_Png());
std::cout << "Shape rendered to graphics successfully." << std::endl << "File saved at " << outputPath.ToUtf8String() << std::endl;
}

同様に、RenderToSizeメソッドと同様に、NodeRendererBaseから継承されたRenderToSize メソッドは、ドキュメントコンテンツのサムネイルを作成するのに便利です。 形状のサイズは、コンストラクタを介して指定されます。 RenderToSizeメソッドは、Graphicsオブジェクト、画像位置のX座標とY座標、およびGraphicsオブジェクトに描画される画像のサイズ(幅と高さ)を受け入れます。

Shapeは、NodeRendererBaseクラスから継承されたShapeRenderer.RenderToScaleメソッドを使用して、特定のスケールにレンダリングできます。 これは、同じ主要なパラメータを受け入れるDocument.RenderToScaleメソッドに似ています。 これらの2つのメソッドの違いは、ShapeRenderer.RenderToScaleメソッドでは、リテラルサイズではなく、レンダリング中にシェイプを拡大縮小するfloat値を選択することです。 Float値が1.0に等しい場合、シェイプは次の場所にレンダリングされます100% 元のサイズの。 Float値0.5を指定すると、イメージサイズが半分に縮小されます。

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

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeImage.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape->GetShapeRenderer()->Save(outputPath, nullptr);

図形サイズの取得

ShapeRendererクラスは、GetSizeInPixelsメソッドを使用して図形のサイズをピクセル単位で取得する機能も提供します。 このメソッドは、図形がレンダリングされるときに図形サイズの計算に使用されるscaleとDPIの2つのfloat型(単一)パラメーターを受け入れます。 このメソッドは、計算されたサイズの幅と高さを含むSizeオブジェクトを返します。 これは、レンダリングされた出力から新しいビットマップを作成する場合など、レンダリングされた図形のサイズを事前に知る必要がある場合に

以下の例は、レンダリングする図形の幅と高さを持つ新しいBitmapオブジェクトとGraphicsオブジェクトを作成する方法を示しています:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::Drawing::SizeF shapeSizeInDocument = shape->GetShapeRenderer()->get_SizeInPoints();
float width = shapeSizeInDocument.get_Width();
// The width of the shape.
float height = shapeSizeInDocument.get_Height();
// The height of the shape.
System::Drawing::Size shapeRenderedSize = shape->GetShapeRenderer()->GetSizeInPixels(1.0f, 96.0f);
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>(shapeRenderedSize.get_Width(), shapeRenderedSize.get_Height()));
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> gHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Render shape onto the graphics object using the RenderToScale or RenderToSize methods of ShapeRenderer class.
}
}

RenderToSizeまたはRenderToScaleメソッドを使用すると、レンダリングされた画像サイズもSizeFオブジェクトに返されます。 これは変数に代入して、必要に応じて使用することができます。

SizeInPointsプロパティは、ポイント単位で測定された形状サイズを返します(ShapeRendererを参照してください。 結果は、幅と高さを含むSizeFオブジェクトになります。