C++'ta PDF Grafikleriyle Çalışma

C++'ta PDF Grafikleriyle Çalışma

Aspose.PDF FOSS for C++ içinde, PDF sayfasına doğrudan serbest biçimli şekiller çizmeyi sağlayan küçük bir vektör-grafik API bulunur — kütüphanenin raster-işleme aygıtlarından (BmpDevice, JpegDevice, TiffDevice) ayrı olarak, bu aygıtlar mevcut sayfa içeriğini görüntülere dönüştürür. Bu kılavuz, bir Graph konteyneri oluşturmayı, içine Circle, Ellipse ve Line şekilleri eklemeyi, bu şekilleri GraphInfo ile stilize etmeyi ve tamamlanmış Graph‘i bir sayfaya yerleştirmeyi adım adım gösterir. Kütüphane, bir projeye CMake aracılığıyla eklenir.

Adım Adım Kılavuz

Adım 1: Paketi Yükleyin

Kütüphaneyi bir CMake alt dizini olarak ekleyin ve aspose_pdf_foss hedefine bağlayın:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Araç zinciri ve başlıkların çözüldüğünü, minimal bir program derleyerek doğrulayın:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}

Başarılı bir derleme, pages: 0 yazdırdığında kütüphanenin doğru şekilde bağlandığını doğrular.


Adım 2: Gerekli Sınıfları İçe Aktar

Belge, şekil kapsayıcısı, üç somut şekil ve bunların stil türleri için başlıkları ekleyin:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/drawing/graph.hpp>
#include <aspose/pdf/drawing/circle.hpp>
#include <aspose/pdf/drawing/ellipse.hpp>
#include <aspose/pdf/drawing/line.hpp>
#include <aspose/pdf/graph_info.hpp>
#include <aspose/pdf/border_info.hpp>
#include <aspose/pdf/color.hpp>

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

Graph, Shape, Circle, Ellipse ve Line Aspose::Pdf::Drawing ad alanında bulunur; GraphInfo, BorderInfo ve Color doğrudan Aspose::Pdf altında bulunur.


Adım 3: Bir Grafik Oluştur ve Bir Sayfaya Ekle

Graph, Left(), Top(), Width() ve Height() aracılığıyla sayfada konumlanan bir kapsayıcıdır ve Shapes() aracılığıyla içinde çizilen şekilleri tutar. Yapılandırıldıktan sonra, diğer sayfa içeriği için kullanılan aynı koleksiyon olan Page.Paragraphs().Add() aracılığıyla sayfaya yerleştirilir:

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

auto graph = std::make_shared<Graph>();
graph->Left(50.0);
graph->Top(50.0);
graph->Width(400.0);
graph->Height(400.0);

page.Paragraphs().Add(graph);

Adım 4: Bir Daire ve Bir Elips Çizin

Circle, geometrisini PosX(), PosY() ve Radius() ile tanımlar. Ellipse bunun yerine bir sınırlayıcı kutu kullanır — Left(), Bottom(), Width() ve Height(). İkisi de Graph‘e, Shapes() tarafından döndürülen vektöre Shape işaretçileri olarak eklenir:

auto circle = std::make_unique<Circle>();
circle->PosX(150.0);
circle->PosY(150.0);
circle->Radius(75.0);
graph->Shapes().push_back(std::move(circle));

auto ellipse = std::make_unique<Ellipse>();
ellipse->Left(20.0);
ellipse->Bottom(20.0);
ellipse->Width(120.0);
ellipse->Height(60.0);
graph->Shapes().push_back(std::move(ellipse));

Her iki şekil de Shape‘den CheckBounds(containerWidth, containerHeight) miras alır; bu, şeklin mevcut geometrisinin verilen boyuttaki bir kapsayıcıya sığıp sığmadığını rapor eder:

bool circleFits = circle->CheckBounds(graph->Width(), graph->Height());

Adım 5: Çizgi Çizin

Line geometrisini farklı bir şekilde depolar: PositionArray(), nokta başına bir x, y çifti olan düz bir std::vector<float> koordinat kümesi tutar — adlandırılmış özellikler yerine. İki noktalı bir segment dört değer gerektirir: başlangıç x, başlangıç y, bitiş x, bitiş y.

auto line = std::make_unique<Line>();
line->PositionArray({0.0f, 0.0f, 400.0f, 400.0f});
graph->Shapes().push_back(std::move(line));

Adım 6: Şekilleri GraphInfo ve Kapsayıcı Kenarı ile Stilize Edin

Her şeklin konturu ve doldurulması bir GraphInfo üzerinden gelir, Shape.GraphInfo() / GraphInfo(value) aracılığıyla okunur ve ayarlanır. Kontur kalınlığını (LineWidth(), varsayılan 1.0f), kontur ve dolgu rengini (Color(), FillColor()) ve bir kesik desenini (DashArray(), DashPhase()) sunar:

GraphInfo stroke;
stroke.LineWidth(2.0f);
stroke.Color(Color::FromRgb(1.0, 0.0, 0.0));
stroke.FillColor(Color::FromRgb(1.0, 0.9, 0.9));

Graph kapsayıcısı kendisi bir BorderInfo taşır, Border() aracılığıyla ayarlanır; bu, kenar başına bir GraphInfo (Left(), Right(), Top(), Bottom()) ve ayrıca kapsayıcının kendi çerçevesi için bir RoundedBorderRadius() gruplar:

BorderInfo border{BorderSide::All, 1.5f, Color::Black()};
border.RoundedBorderRadius(6.0);
graph->Border(border);

Adım 7: Belgeyi Kaydedin

doc.Save("graphics.pdf");

Yaygın Sorunlar ve Çözümler

Benim oluşturduğum bir şekil sayfada hiç görünmüyor

Bir Circle, Ellipse veya Line tek başına oluşturulması, sahip Graph‘ün Shapes() tarafından döndürülen vektöre eklenene kadar etkisizdir ve bu Graph, Page.Paragraphs().Add() aracılığıyla bir sayfaya eklenir. Üç adımın — oluşturma, ekleme, Graph‘i sayfaya ekleme — hepsi gereklidir.

Şekiller yanlış konumda renderlanıyor

Graph.Left() ve Graph.Top() konteyneri sayfada konumlandırır; şekil özellikleri (Circle.PosX()/PosY(), Ellipse.Left()/Bottom(), Line.PositionArray() koordinatları) bu konteyner içindeki geometriyi tanımlar. Çıktı kaymış gibi göründüğünde hem konteyner yerleşimini hem de şeklin kendi koordinatlarını kontrol edin.

CheckBounds returns false unexpectedly

CheckBounds(containerWidth, containerHeight), şeklin kendi geometrisini verilen boyutlarla — genellikle sahip Graph‘in Width()/Height() değerleriyle, sayfanın tam medya kutusuyla değil — karşılaştırır. Yanlış boyutların geçirilmesi, şekil aslında Graph içine sığsa bile yanlış bir negatif sonuç üretir.

A Line görünmüyor ya da tek bir nokta olarak görünüyor

PositionArray(), görünür bir segment tanımlamak için en az iki (x, y) çifti — dört float değeri — gerektirir. Daha kısa bir vektör bir çizgi oluşturmaz.

Confusing Circle with AnnotationType::Circle or CircleAnnotation

Kütüphane ayrıca ayrı bir PDF ek açıklamaları API içerir; burada AnnotationType::Circle ve CircleAnnotation daire biçiminde işaretleme ek açıklamalarını temsil eder. Bu kılavuzda ele alınan Circle sınıfı alâkasızdır — Aspose::Pdf::Drawing içinde bulunur ve bir ek açıklama nesnesi eklemek yerine sayfa içeriğine doğrudan çizer.

Sık Sorulan Sorular

GraphInfo ile BorderInfo arasındaki fark nedir?

GraphInfo tek bir çizgiyi — çizgi kalınlığı, renk, dolgu rengi ve kesikli desen — biçimlendirir ve hem bireysel şekillerde ( Shape.GraphInfo() aracılığıyla) hem de bir BorderInfo içindeki kenar başına kullanılır. BorderInfo, dört GraphInfo değerini (Left(), Right(), Top(), Bottom()) ve bir RoundedBorderRadius() öğesini bir araya getirerek bir Graph konteynerinin kendi kenar çerçevesini tanımlar.

Bir şekli katı bir renk ile doldurabilir miyim?

Evet. GraphInfo.FillColor(), şeklin sahip olduğu Graph aracılığıyla çizildiğinde kullanılan dolgu rengini ayarlar.

Daire, Elips gibi bir sınırlayıcı kutu saklıyor mu?

Hayır. Circle, PosX(), PosY() ve Radius() öğelerini ortaya çıkarır; Ellipse, Left(), Bottom(), Width() ve Height() öğelerini ortaya çıkarır. Soyut Shape temeli ve GraphInfo stilinin ötesinde ortak bir geometri temsili paylaşmazlar.

Bir grafik birden fazla şekil tutabilir mi?

Evet. Graph.Shapes(), o Graph içinde yerleştirilen Shape nesnelerinin tam koleksiyonunu döndürür — daireler, elipsler ve çizgiler aynı kapsayıcıya eklenebilir.

Bu, bir sayfayı görüntüye dönüştürmekle aynı şey mi?

Hayır. BmpDevice, JpegDevice ve TiffDevice, mevcut sayfa içeriğini görüntü formatlarına rasterleştirir. Graph, Shape, Circle, Ellipse ve Line, bir belge oluşturulurken veya düzenlenirken PDF içeriğinde doğrudan yeni vektör geometrisi oluşturur.

Ayrıca Bakınız

 Türkçe