PDF 페이지에 벡터 그래픽 그리기

PDF 페이지에 벡터 그래픽 그리기

PDF 페이지에 벡터 그래픽 그리기

Aspose.PDF FOSS for C++에는 문서가 생성되는 동안 PDF 페이지에 직접 도형을 그릴 수 있는 작은 벡터 그래픽 API가 포함되어 있습니다. 진입점은 페이지에 배치되어 Shape 객체 컬렉션을 보유하는 컨테이너인 Graph입니다; 구체적인 세 가지 도형 — 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>를 반환하며, 고정된 명명된 속성 집합을 사용하지 않습니다. 두 점(네 값)은 직선 구간을 그리며, 추가 쌍은 순서대로 해당 점들을 연결하는 다중 구간 경로를 그립니다. 다른 도형들과 마찬가지로, 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는 1.0f인 LineWidth()이며, DashArray()가 비어 있는 기본값을 가집니다. 또한 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를 호출하십시오 — 이 검사는 도형의 기하를 전달한 컨테이너 크기에 대해 검증하며, 페이지를 자동으로 확인하지 않습니다.
  • Page.Paragraphs()에 Graph을 추가하기 전에 Shapes()에 도형을 추가하십시오 — Circle, Ellipse, 또는 Line를 구성해도 해당 도형이 소유 Graph에 추가되고 그 Graph이 페이지에 추가될 때까지는 눈에 보이는 효과가 없습니다.
  • 각 도형마다 Graph을 두는 대신 단일 Graph 아래에 관련 도형을 그룹화하십시오; Left()/Top()/Width()/Height()는 전체 컨테이너를 한 번 위치시키고, Shapes() 안의 모든 도형은 그에 상대적으로 그려집니다.
  • 가시적인 채우기 또는 기본이 아닌 스트로크가 필요한 도형에 대해 Shape.GraphInfo()를 명시적으로 설정하십시오 — 기본 GraphInfo은 1.0f 라인 두께를 가지고, 채우기가 없으며, DashArray()가 비어 있습니다.
  • 경로가 그려져야 하는 순서대로 Line.PositionArray()를 x0, y0, x1, y1, … 쌍으로 구축합니다 — 길이가 홀수인 벡터는 불완전한 점을 나타냅니다.

일반적인 문제

문제원인해결 방법
A Circle, Ellipse, 또는 Line가 저장된 페이지에 나타나지 않습니다.모양이 생성되었지만 Graph의 Shapes()에 추가되지 않았거나, Graph가 페이지에 추가되지 않았습니다.모양을 graph->Shapes()에 푸시하고 page.Paragraphs().Add(graph)를 호출하세요.
모양은 기본 얇은 검은색 스트로크로 그려집니다.Shape.GraphInfo()가 설정되지 않았습니다.형태를 Shapes()에 추가하기 전에 shape->GraphInfo(customGraphInfo)를 호출하십시오.
Line가 없거나 단일 점처럼 보입니다.PositionArray()에 (x, y) 쌍이 두 개 미만이거나 값의 개수가 홀수입니다.최소 네 개의 값을 x0, y0, x1, y1로 제공하십시오.
컨테이너 테두리의 일부 가장자리만 스타일이 지정되었습니다.BorderInfo는 일부 가장지를 제외하는 BorderSide 마스크로 구성되었습니다.필요한 모든 BorderSide 플래그를 OR 연산으로 결합하거나 BorderSide::All를 사용하십시오.
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()
BorderSideEnum: BorderInfo 를 구성할 때 선택되는 가장자리: None, Left, Top, Right, Bottom, All, Box

참조

 한국어