PDFページにベクターグラフィックスを描画する

PDFページにベクターグラフィックスを描画する

PDF ページ上にベクターグラフィックスを描画する

Aspose.PDF FOSS for C++ には、ドキュメント構築中に PDF ページ上に直接形状を描画するための小さなベクターグラフィックス API が含まれています。エントリーポイントは Graph で、ページ上に配置され、Shape オブジェクトのコレクションを保持するコンテナです。具体的な三つの形状 — Circle、Ellipse、Line — は Shape から派生し、各々が異なる方法でジオメトリを表現します。形状ごとのストロークと塗りのスタイリングは GraphInfo から取得され、Graph コンテナ自体はフレーミング用の BorderInfo を持ちます。これは、既存のページコンテンツをラスタ画像形式に変換し、新しいジオメトリを描画するものではないページラスタライズ (BmpDevice、JpegDevice、TiffDevice) とは無関係です。


グラフコンテナとページへの形状追加

Graph は Left()、Top()、Width()、Height() を通じてページ上で位置とサイズを決定し、IsChangePosition() フラグはその位置が他のページコンテンツに対して移動可能かどうかを制御します。描画される形状は Shapes() が返すベクター — std::vector<std::unique_ptr<Shape>> — に格納され、形状を構築し、設定し、そのベクターへ移動させることで満たされます。構築が完了すると、Graph 自体は Page.Paragraphs().Add() を介してページに配置され、他のページレベルのコンテンツで使用される同じコレクションです。

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/drawing/graph.hpp>
#include <aspose/pdf/drawing/circle.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Drawing;

Document doc;
Page page = doc.Pages().Add();

auto graph = std::make_shared<Graph>();
graph->Left(36.0);
graph->Top(36.0);
graph->Width(500.0);
graph->Height(300.0);

auto marker = std::make_unique<Circle>();
marker->PosX(60.0);
marker->PosY(60.0);
marker->Radius(30.0);
graph->Shapes().push_back(std::move(marker));

page.Paragraphs().Add(graph);
doc.Save("shapes.pdf");

円と楕円の描画

Circle と Ellipse は、共有のポイントや矩形型ではなく、単純な数値プロパティとしてジオメトリを表現します。Circle は中心点と半径 — PosX()、PosY()、Radius() — であり、Ellipse はバウンディングボックス — Left()、Bottom()、Width()、Height() — です。両者は Shape から CheckBounds(containerWidth, containerHeight) を継承しており、形状の現在のジオメトリが指定サイズのコンテナ内に収まるかどうかを、形状自体を変更せずに報告します。

#include <aspose/pdf/drawing/circle.hpp>
#include <aspose/pdf/drawing/ellipse.hpp>

using namespace Aspose::Pdf::Drawing;

Circle circle;
circle.PosX(120.0);
circle.PosY(120.0);
circle.Radius(60.0);
bool circleFits = circle.CheckBounds(500.0, 300.0);

Ellipse ellipse;
ellipse.Left(220.0);
ellipse.Bottom(20.0);
ellipse.Width(250.0);
ellipse.Height(100.0);
bool ellipseFits = ellipse.CheckBounds(500.0, 300.0);

PositionArray を使用したラインの描画

Line は Circle と Ellipse とは異なる方法でジオメトリを保持します: PositionArray() は、各点の x, y ペアを保持するフラットな std::vector<float> を返します。固定された名前付きプロパティの集合ではありません。2 点(4 値)で直線セグメントが描かれ、追加のペアは順番にそれらの点を通るマルチセグメントパスを描きます。他の形状と同様に、Line は Shape の CheckBounds(containerWidth, containerHeight) をオーバーライドします。

#include <aspose/pdf/drawing/line.hpp>

using namespace Aspose::Pdf::Drawing;

Line path;
path.PositionArray({0.0f, 0.0f, 250.0f, 0.0f, 125.0f, 200.0f});
bool pathFits = path.CheckBounds(500.0, 300.0);

GraphInfo と BorderInfo を使用したシェイプのスタイリング

各シェイプは Shape.GraphInfo() / GraphInfo(value) を介してストロークとフィルのスタイルを読み書きします。GraphInfo は、空の DashArray() を持つ 1.0f の LineWidth() をデフォルトとし、さらに破線ストローク用の Color()、FillColor()、DashArray()/DashPhase()、二重線用の IsDoubled()、ストローク変形用の SkewAngleX()/SkewAngleY()、ScalingRateX()/ScalingRateY()、および RotationAngle() を公開します。Graph 自体は Border() を通じて設定される BorderInfo を保持しており、エッジごとに一つの GraphInfo(Left()、Right()、Top()、Bottom())と RoundedBorderRadius() をグループ化します。また、BorderSide フラグ(BorderSide::Left | BorderSide::Right、またはすべてのエッジに対しては BorderSide::All)でスタイルを適用するエッジを指定することにより構築できます。

#include <aspose/pdf/graph_info.hpp>
#include <aspose/pdf/border_info.hpp>
#include <aspose/pdf/border_side.hpp>
#include <aspose/pdf/color.hpp>

using namespace Aspose::Pdf;

GraphInfo stroke;
stroke.LineWidth(2.5f);
stroke.Color(Color::FromRgb(1.0, 0.0, 0.0));
stroke.DashArray({3, 2});
stroke.DashPhase(1);
stroke.IsDoubled(true);

// Style only the left and right edges of the container border.
BorderInfo border{BorderSide::Left | BorderSide::Right, 3.0f};
border.RoundedBorderRadius(4.0);

graph->GraphInfo(stroke);
graph->Border(border);

ヒントとベストプラクティス

  • ページ全体のメディアボックスではなく、所有する Graph の自身の Width()/Height() に対して CheckBounds を呼び出してください — このチェックは、渡したコンテナサイズに対してシェイプのジオメトリを検証し、ページを自動的に参照しません。
  • Shapes() にシェイプを追加してから、Page.Paragraphs() に Graph を追加してください — Circle、Ellipse、または Line を構築しても、所有する Graph に追加され、さらにその Graph がページに追加されるまで、視覚的な効果はありません。
  • シェイプごとに Graph を作成するのではなく、単一の Graph の下に関連するシェイプをグループ化してください。Left()/Top()/Width()/Height() はコンテナ全体の位置を一度だけ設定し、Shapes() 内のすべてのシェイプはそれに対して相対的に描画されます。
  • 可視的なフィルまたはデフォルト以外のストロークが必要なシェイプには、Shape.GraphInfo() を明示的に設定してください — デフォルトの GraphInfo は 1.0f の線幅で、フィルがなく、空の DashArray() です。
  • パスが描画される順序で、Line.PositionArray() を x0, y0, x1, y1, … のペアとして構築します — 長さが奇数のベクトルは不完全な点を表します。

よくある問題

問題原因修正
保存されたページに Circle、Ellipse、または Line が表示されませんシェイプは作成されましたが、その Graph の Shapes() に追加されていないか、Graph がページに追加されていませんシェイプを graph->Shapes() にプッシュし、page.Paragraphs().Add(graph) を呼び出す
シェイプはデフォルトの細い黒いストロークで描画されますShape.GraphInfo() が設定されていませんshape->GraphInfo(customGraphInfo) を呼び出してから、シェイプを Shapes() に追加してください。
Line が欠落しているか、単一の点に見えます。PositionArray() の (x, y) ペアが2つ未満、または値の数が奇数です。少なくとも4つの値を x0, y0, x1, y1 として提供してください。
コンテナの境界の一部のエッジだけがスタイル設定されています。BorderInfo は、いくつかのエッジを除外する BorderSide マスクで構築されました。BorderSide::All を使用するか、必要なすべての BorderSide フラグを OR で組み合わせてください。
CheckBounds が予期せず false を返します。CheckBounds に渡された寸法が、シェイプが実際に描画されているコンテナと一致しません所有する Graph の現在の Width()/Height() を渡す

FAQ

Circle と AnnotationType::Circle の違いは何ですか?

Circle(このガイド)は、Graph を介してページコンテンツに直接描画する描画シェイプです。AnnotationType::Circle と CircleAnnotation は別個のアノテーション API に属し、代わりに円形のマークアップアノテーションを表します — 名前が共有されているにもかかわらず、両者は無関係です。

単一の Graph に複数のシェイプを含めることはできますか?

はい。Graph.Shapes() はそのコンテナの完全な std::vector<std::unique_ptr<Shape>> を返し、Graph がページに追加される前に、Circle、Ellipse、Line のインスタンスを任意に組み合わせて追加できます。

Circle と Ellipse は同じジオメトリタイプを共有していますか?

No. Circle は中心点と半径 (PosX, PosY, Radius); Ellipse はバウンディングボックス (Left, Bottom, Width, Height)。両方とも Shape から派生しますが、どちらも共通の点または長方形タイプを共有しません。

Graph で図形を描くことは、ページを画像にレンダリングすることと同じですか?

No. Graph、Shape、Circle、Ellipse、および Line は、ドキュメント生成時にページのコンテンツに新しいベクター幾何を構築します。既存のページをラスタ画像に変換することは別の機能であり、BmpDevice、JpegDevice、および TiffDevice が担当します。

GraphInfo.IsDoubled() は何をしますか?

それはストロークを二重線としてマークし、他のストローク属性は変更しません。これは IsDoubled() / IsDoubled(value) を通じて読み書きされるブールフラグで、他の GraphInfo ストローク属性と共に使用されます。


API Reference の概要

クラス/メソッド説明
Graphページに配置されたシェイプコンテナ;Left()、Top()、Width()、Height() によって自身の位置を決定します
Graph.Shapes()このコンテナによって描画された std::vector<std::unique_ptr<Shape>> を返します
Graph.GraphInfo() / GraphInfo(value)コンテナ自身のストロークと塗りのスタイリングを取得/設定します
Graph.Border() / Border(value)コンテナをフレーミングする BorderInfo を取得/設定します
ShapeCircle、Ellipse、Line の抽象基底クラス;GraphInfo() と CheckBounds() を公開します
Shape.CheckBounds(w, h)指定された幅/高さのコンテナ内にシェイプのジオメトリが収まるかどうかを報告します
Circle円形: PosX(), PosY(), Radius()
Ellipse楕円形: バウンディングボックスは Left(), Bottom(), Width(), Height()
Line線/パス形状: PositionArray(), x, y 座標のフラット std::vector<float>
GraphInfoストローク/塗りスタイリング: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY()
BorderInfoエッジごとのコンテナ境界: Left(), Right(), Top(), Bottom()(それぞれはGraphInfo)、さらにRoundedBorderRadius()
BorderSideBorderInfo を構築するときにエッジを選択する列挙型: None, Left, Top, Right, Bottom, All, Box

参照

 日本語