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, sahipGraph‘in kendiWidth()/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‘iPage.Paragraphs()‘ye eklemeden önce — birCircle,EllipseveyaLineoluşturmak, hem sahipGraph‘a eklenene hem de oGraphbir sayfaya eklenene kadar görünür bir etki yaratmaz.- İlgili şekilleri, şekil başına bir
Graphyerine tek birGraphaltında gruplayın;Left()/Top()/Width()/Height()tüm konteyneri bir kez konumlandırır veShapes()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ılanGraphInfo,1.0fgenişliğinde bir çizgiye, doldurma olmadan ve boş birDashArray()‘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
| Sorun | Neden | Çö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 çizilir | Shape.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üyor | PositionArray() iki (x, y) çiftinden daha az veya tek sayıda değere sahip | x0, 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üyor | CheckBounds‘a geçirilen boyutlar, şeklin gerçekte çizildiği kapsayıcıyla eşleşmiyor | Sahip 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öntem | Açıklama |
|---|---|
Graph | Bir 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 |
Shape | Circle, 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 |
Circle | Daire şekli: PosX(), PosY(), Radius() |
Ellipse | Elips ş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> |
GraphInfo | Kontur/dolgu stili: LineWidth(), Color(), FillColor(), DashArray(), DashPhase(), IsDoubled(), RotationAngle(), SkewAngleX()/SkewAngleY(), ScalingRateX()/ScalingRateY() |
BorderInfo | Kenar başına konteyner kenarlığı: Left(), Right(), Top(), Bottom() (her biri bir GraphInfo), ayrıca RoundedBorderRadius() |
BorderSide | Bir BorderInfo oluştururken kenarları seçen enum: None, Left, Top, Right, Bottom, All, Box |