Cara Bekerja dengan Grafik PDF di C++

Cara Bekerja dengan Grafik PDF di C++

Aspose.PDF FOSS untuk C++ menyertakan sebuah API vektor-grafik kecil untuk menggambar bentuk bebas langsung pada halaman PDF — terpisah dari perangkat raster-rendering perpustakaan (BmpDevice, JpegDevice, TiffDevice), yang mengubah konten halaman yang ada menjadi gambar. Panduan ini menjelaskan cara membuat sebuah wadah Graph, menambahkan bentuk Circle, Ellipse, dan Line ke dalamnya, memberi gaya pada bentuk-bentuk tersebut dengan GraphInfo, dan menempatkan Graph yang selesai pada halaman. Perpustakaan ditambahkan ke proyek melalui CMake.

Panduan Langkah demi Langkah

Langkah 1: Instal Paket

Tambahkan perpustakaan sebagai subdirektori CMake dan tautkan terhadap target aspose_pdf_foss:

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

Verifikasi toolchain dan header terresolusi dengan mengompilasi program minimal:

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

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

Build yang berhasil yang mencetak pages: 0 mengonfirmasi bahwa perpustakaan telah ditautkan dengan benar.


Langkah 2: Impor Kelas yang Diperlukan

Sertakan header untuk dokumen, kontainer bentuk, tiga bentuk konkret, dan jenis gaya mereka:

#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, dan Line berada di namespace Aspose::Pdf::Drawing; GraphInfo, BorderInfo, dan Color berada langsung di bawah Aspose::Pdf.


Langkah 3: Buat Grafik dan Tambahkan ke Halaman

Graph adalah sebuah kontainer yang memposisikan dirinya di halaman melalui Left(), Top(), Width(), dan Height(), serta menampung bentuk-bentuk yang digambar di dalamnya melalui Shapes(). Setelah dikonfigurasi, ia ditempatkan di halaman melalui Page.Paragraphs().Add(), koleksi yang sama digunakan untuk konten halaman lainnya:

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

Langkah 4: Gambar Lingkaran dan Elips

Circle menggambarkan geometri-nya dengan PosX(), PosY(), dan Radius(). Ellipse menggunakan kotak pembatas sebagai gantinya — Left(), Bottom(), Width(), dan Height(). Keduanya ditambahkan ke Graph dengan menambahkan mereka, sebagai pointer Shape, ke vektor yang dikembalikan oleh Shapes():

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

Kedua bentuk mewarisi CheckBounds(containerWidth, containerHeight) dari Shape, yang melaporkan apakah geometri bentuk saat ini cocok di dalam sebuah kontainer dengan ukuran yang diberikan:

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

Langkah 5: Gambar Garis

Line menyimpan geometri-nya secara berbeda: PositionArray() berisi std::vector<float> datar koordinat — pasangan x, y per titik — bukan properti bernama. Segmen dua titik membutuhkan empat nilai: x awal, y awal, x akhir, y akhir.

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

Langkah 6: Gaya Bentuk dengan GraphInfo dan Batas Kontainer

Setiap goresan dan isi bentuk diambil dari GraphInfo, dibaca dan diatur melalui Shape.GraphInfo() / GraphInfo(value). Ini menyediakan lebar goresan (LineWidth(), default 1.0f), warna goresan dan isi (Color(), FillColor()), serta pola garis putus-putus (DashArray(), DashPhase()):

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

Kontainer Graph itu sendiri membawa BorderInfo, diatur melalui Border(), yang mengelompokkan satu GraphInfo per tepi (Left(), Right(), Top(), Bottom()) plus RoundedBorderRadius() untuk bingkai kontainer itu sendiri:

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

Langkah 7: Simpan Dokumen

doc.Save("graphics.pdf");

Masalah Umum dan Solusinya

Sebuah bentuk yang saya buat tidak pernah muncul di halaman

Membuat sebuah Circle, Ellipse, atau Line secara terpisah tidak berpengaruh sampai itu ditambahkan ke vektor yang dikembalikan oleh Graph’s Shapes(), dan Graph itu ditambahkan ke halaman melalui Page.Paragraphs().Add(). Semua tiga langkah — membuat, menambahkan, menambahkan Graph ke halaman — diperlukan.

Bentuk-bentuk dirender pada posisi yang salah

Graph.Left() dan Graph.Top() menempatkan kontainer pada halaman; properti bentuk (Circle.PosX()/PosY(), Ellipse.Left()/Bottom(), koordinat Line.PositionArray()) menggambarkan geometri di dalam kontainer tersebut. Periksa baik penempatan kontainer maupun koordinat bentuk itu sendiri ketika output tampak bergeser.

CheckBounds returns false unexpectedly

CheckBounds(containerWidth, containerHeight) memeriksa geometri bentuk itu sendiri terhadap dimensi yang diberikan — biasanya Graph’s Width()/Height() milik, bukan kotak media penuh halaman. Mengirim dimensi yang salah menghasilkan negatif palsu bahkan ketika bentuk sebenarnya muat di dalam Graph.

A Line tidak muncul, atau muncul sebagai satu titik

PositionArray() membutuhkan setidaknya dua pasang (x, y) — empat nilai float — untuk menggambarkan segmen yang terlihat. Vektor yang lebih pendek tidak membentuk garis.

Confusing Circle with AnnotationType::Circle or CircleAnnotation

Perpustakaan juga memiliki API anotasi PDF terpisah, di mana AnnotationType::Circle dan CircleAnnotation mewakili anotasi markup berbentuk lingkaran. Kelas Circle yang dibahas dalam panduan ini tidak terkait — ia berada di Aspose::Pdf::Drawing dan menggambar langsung ke konten halaman alih-alih menambahkan objek anotasi.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara GraphInfo dan BorderInfo?

GraphInfo mengatur satu goresan — lebar garis, warna, warna isi, dan pola dash — dan digunakan baik pada bentuk individual (melalui Shape.GraphInfo()) maupun per tepi di dalam BorderInfo. BorderInfo mengelompokkan empat nilai GraphInfo (Left(), Right(), Top(), Bottom()) plus sebuah RoundedBorderRadius() untuk mendeskripsikan bingkai batas kontainer Graph itu sendiri.

Bisakah saya mengisi bentuk dengan warna solid?

Ya. GraphInfo.FillColor() menentukan warna isi yang digunakan ketika bentuk digambar melalui Graph miliknya.

Apakah Circle menyimpan kotak pembatas seperti yang dilakukan Ellipse?

Tidak. Circle mengekspos PosX(), PosY(), dan Radius(); Ellipse mengekspos Left(), Bottom(), Width(), dan Height(). Mereka tidak memiliki representasi geometri umum selain basis abstrak Shape dan gaya GraphInfo.

Apakah satu Graph dapat menampung lebih dari satu bentuk?

Ya. Graph.Shapes() mengembalikan seluruh koleksi objek Shape yang ditempatkan dalam Graph tersebut — lingkaran, elips, dan garis semuanya dapat ditambahkan ke kontainer yang sama.

Apakah ini sama dengan merender halaman menjadi gambar?

Tidak. BmpDevice, JpegDevice, dan TiffDevice merasterkan konten halaman yang ada ke format gambar. Graph, Shape, Circle, Ellipse, dan Line membuat geometri vektor baru secara langsung dalam konten PDF saat dokumen sedang dibuat atau diedit.

Lihat Juga

 Bahasa Indonesia