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 を取得/設定します |
Shape | Circle、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() |
BorderSide | BorderInfo を構築するときにエッジを選択する列挙型: None, Left, Top, Right, Bottom, All, Box |