PDF Sayfasına Vektör Grafik Çizme

PDF Sayfasına Vektör Grafik Çizme

PDF Sayfasında Vektör Grafik Çizimi

Aspose.PDF FOSS for C++ küçük bir vektör-grafik API içerir ve bu, bir belge oluşturulurken şekilleri doğrudan PDF sayfasına çizmeye olanak tanır. Giriş noktası Graph, sayfada yer alan ve bir Shape nesne koleksiyonunu tutan bir kapsayıcıdır; üç somut şekil — Circle, Ellipse ve Line — Shape‘ten türetilir ve her biri geometrisini farklı şekilde ifade eder. Şekil başına çizgi ve dolgu stilleri GraphInfo‘dan gelir ve Graph kapsayıcısı kendisi bir BorderInfo taşır çerçeveleme için. Bu, sayfa rasterleştirmesi (BmpDevice, JpegDevice, TiffDevice) ile ilgili değildir; bu işlem mevcut sayfa içeriğini yeni geometri çizmeyecek şekilde raster görüntü formatlarına dönüştürür.


Grafik Kapsayıcısı ve Sayfaya Şekil Ekleme

Graph kendisini sayfada Left(), Top(), Width() ve Height() aracılığıyla konumlandırır ve boyutlandırır; ve IsChangePosition() bayrağı, bu konumun diğer sayfa içeriğine göre kayıp kaymayacağını kontrol eder. Çizdiği şekiller, Shapes() — std::vector<std::unique_ptr<Shape>> — tarafından döndürülen vektörde yaşar; bu vektör bir şekil oluşturularak, yapılandırılarak ve o vektöre taşınarak doldurulur. Oluşturulduktan sonra, Graph kendisi Page.Paragraphs().Add() aracılığıyla sayfaya yerleştirilir; bu, diğer sayfa düzeyindeki içerikler için kullanılan aynı koleksiyondur.

#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");

Daireler ve Elipsler Çizme

Circle ve Ellipse her biri geometrisini ortak bir nokta ya da dikdörtgen türü yerine düz sayısal özellikler olarak ifade eder. Circle bir merkez nokta ve yarıçap — PosX(), PosY(), Radius() — iken Ellipse bir sınırlayıcı kutudur — Left(), Bottom(), Width(), Height(). İkisi de Shape‘den CheckBounds(containerWidth, containerHeight) miras alır; bu, şeklin mevcut geometrisinin, şekli değiştirmeden verilen boyuttaki bir kapsayıcı içinde olup olmadığını rapor eder.

#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);

Çizgileri PositionArray ile Çizme

Line, Circle ve Ellipse‘den farklı bir şekilde geometrisini saklar: PositionArray(), her bir nokta için bir x, y çifti tutan düz bir std::vector<float> döndürür, sabit adlandırılmış özellikler kümesi yerine. İki nokta (dört değer) düz bir segment çizer; ek çiftler bu noktalardan sırayla geçen çok segmentli bir yol çizer. Diğer şekiller gibi, Line, Shape‘den CheckBounds(containerWidth, containerHeight)‘yi geçersiz kılar.

#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 ve BorderInfo ile Şekillere Stil Verme

Her şekil, Shape.GraphInfo() / GraphInfo(value) aracılığıyla çizgi ve dolgu stilini okur ve yazar. GraphInfo, boş bir DashArray() içeren 1.0f tipinde bir LineWidth() olarak varsayılan ayara sahiptir ve ayrıca kesikli çizgiler için Color(), FillColor(), DashArray()/DashPhase(), çift çizgi için IsDoubled(), ve çizgiyi dönüştürmek için SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() ve RotationAngle() öğelerini sunar. Graph ise Border() aracılığıyla ayarlanan bir BorderInfo taşır; bu, kenar başına bir GraphInfo — Left(), Right(), Top(), Bottom() — ve ayrıca bir RoundedBorderRadius() gruplar ve hangi kenarların stil verileceği bir BorderSide bayrağı (BorderSide::Left | BorderSide::Right ya da her kenar için BorderSide::All) ile adlandırılarak oluşturulabilir.

#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);

İpuçları ve En İyi Uygulamalar

  • CheckBounds‘ı, sayfanın tam medya kutusuna değil, sahip Graph‘in kendi Width()/Height()‘üne karşı çağırın — bu kontrol, bir şeklin geometrisini gönderdiğiniz konteyner boyutuna göre doğrular, sayfayı otomatik olarak incelemez.
  • Shapes()‘a şekilleri ekleyin, Graph‘i Page.Paragraphs()‘ye eklemeden önce — bir Circle, Ellipse veya Line oluşturmak, hem sahip Graph‘a eklenene hem de o Graph bir sayfaya eklenene kadar görünür bir etki yaratmaz.
  • İlgili şekilleri, şekil başına bir Graph yerine tek bir Graph altında gruplayın; Left()/Top()/Width()/Height() tüm konteyneri bir kez konumlandırır ve Shapes() içindeki her şekil ona göre çizilir.
  • Görünür bir dolgu veya varsayılan olmayan bir çizgi gerektiren şekiller için Shape.GraphInfo()‘ı açıkça ayarlayın — varsayılan GraphInfo, 1.0f genişliğinde bir çizgiye, doldurma olmadan ve boş bir DashArray()‘e sahiptir.
  • Yolu çizilmesi gereken sırada Line.PositionArray()‘ı x0, y0, x1, y1, … çiftleri olarak oluşturun — tek sayı uzunluğundaki bir vektör eksik bir noktayı tanımlar.

Sık Karşılaşılan Sorunlar

SorunNedenÇözüm
Bir Circle, Ellipse veya Line kaydedilen sayfada hiç görünmezŞekil oluşturuldu ancak Graph‘ın Shapes()‘ine hiç eklenmedi, ya da Graph sayfaya hiç eklenmediŞekli graph->Shapes()‘a it ve page.Paragraphs().Add(graph)‘i çağır
Şekil, varsayılan ince siyah bir çizgiyle çizilirShape.GraphInfo() hiç ayarlanmadıŞekli Shapes()‘e eklemeden önce shape->GraphInfo(customGraphInfo)‘ı çağırın
Line eksik ya da tek bir nokta gibi görünüyorPositionArray() iki (x, y) çiftinden daha az veya tek sayıda değere sahipx0, y0, x1, y1 olarak en az dört değer sağlayın
Konteyner kenarlığının yalnızca bazı kenarları stillendirilmişBorderInfo, bazı kenarları dışlayan bir BorderSide maskesi ile oluşturulmuşGerekli tüm BorderSide bayraklarını OR’layarak BorderSide::All‘ı kullanın
CheckBounds beklenmedik bir şekilde false döndürüyorCheckBounds‘a geçirilen boyutlar, şeklin gerçekte çizildiği kapsayıcıyla eşleşmiyorSahip olduğu Graph‘ın mevcut Width()/Height()‘ini geçir

FAQ

Circle ile AnnotationType::Circle arasındaki fark nedir?

Circle (bu kılavuz) doğrudan bir Graph aracılığıyla sayfa içeriğine çizen bir çizim şeklidir. AnnotationType::Circle ve CircleAnnotation, ayrı bir açıklama API öğesine aittir ve bunun yerine daire biçimli bir işaretleme açıklaması temsil eder — ortak isim olmasına rağmen ikisi birbirine bağlı değildir.

Tek bir Graph birden fazla şekil içerebilir mi?

Evet. Graph.Shapes(), o konteyner için tam std::vector<std::unique_ptr<Shape>>‘i döndürür ve Graph sayfaya eklenmeden önce Circle, Ellipse ve Line örneklerinin herhangi bir karışımı ona eklenebilir.

Circle ve Ellipse aynı geometri tipini paylaşıyor mu?

Hayır. Circle, bir merkez nokta ve yarıçap (PosX, PosY, Radius); Ellipse ise bir sınırlama kutusudur (Left, Bottom, Width, Height). Her ikisi de Shape‘den türetilir, ancak hiçbiri diğeriyle ortak bir nokta ya da dikdörtgen türü paylaşmaz.

Graph ile şekil çizmek, bir sayfayı görüntüye render etmekle aynı şey mi?

Hayır. Graph, Shape, Circle, Ellipse ve Line, belge oluşturulurken sayfanın içeriğine yeni vektör geometrisi ekler. Mevcut bir sayfayı raster görüntüye dönüştürmek ayrı bir yetenektir ve BmpDevice, JpegDevice ve TiffDevice tarafından işlenir.

GraphInfo.IsDoubled() ne yapar?

Diğer hiçbir çizgi özelliğini değiştirmeden, vuruşu çift çizgi olarak işaretler. Diğer GraphInfo çizgi özellikleriyle birlikte IsDoubled() / IsDoubled(value) aracılığıyla okunan ve ayarlanan bir boolean bayraktır.


API Reference Özeti

Sınıf/YöntemAçıklama
GraphBir sayfaya yerleştirilen şekil kapsayıcısı; kendini Left(), Top(), Width(), Height() ile konumlandırır
Graph.Shapes()Bu kapsayıcı tarafından çizilen std::vector<std::unique_ptr<Shape>>‘ı döndürür
Graph.GraphInfo() / GraphInfo(value)Konteynerin kendi çizgi ve dolgu stilini alır/ayarlar
Graph.Border() / Border(value)BorderInfo çerçevesini alır/ayarlar
ShapeCircle, Ellipse ve Line için soyut temel; GraphInfo() ve CheckBounds() öğelerini ortaya çıkarır
Shape.CheckBounds(w, h)Şeklin geometrisinin verilen genişlik/yükseklikteki bir konteyner içine sığıp sığmadığını raporlar
CircleDaire şekli: PosX(), PosY(), Radius()
EllipseElips şekli: sınırlayıcı kutu aracılığıyla Left(), Bottom(), Width(), Height()
LineÇizgi/yol şekli: PositionArray(), x, y koordinatlarından oluşan düz std::vector<float>
GraphInfoKontur/dolgu stili: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY()
BorderInfoKenar başına konteyner kenarlığı: Left(), Right(), Top(), Bottom() (her biri bir GraphInfo), ayrıca RoundedBorderRadius()
BorderSideBir BorderInfo oluştururken kenarları seçen enum: None, Left, Top, Right, Bottom, All, Box

Ayrıca Bakınız

 Türkçe