Bekerja dengan kanvas (canvases) di dalam XPS
Memotong (clip) dan mengubah (transform) kanvas dalam file XPS menggunakan API C++
Dalam file XPS, kanvas (canvas) adalah area persegi panjang pada halaman tempat konten visual, seperti teks, gambar, dan bentuk, dapat digambar. Ini berfungsi sebagai wadah untuk elemen-elemen ini dan menyediakan kerangka kerja untuk mengatur dan melapiskannya. Kanvas dapat digunakan kembali di berbagai bagian dokumen atau bahkan di beberapa dokumen, yang menyediakan cara fleksibel untuk menstrukturkan dan mengatur konten dalam dokumen XPS. Karakteristik utama kanvas dalam file XPS:
- Kanvas dapat disarangkan (nested) di dalam kanvas lain, menciptakan struktur hierarkis yang memungkinkan tata letak (layouts) yang kompleks dan pengelompokan elemen.
- Kanvas dapat diubah (transform) menggunakan berbagai operasi, seperti translasi (translation), rotasi (rotation), dan penskalaan (scaling). Ini memungkinkan penentuan posisi yang fleksibel dan pengubahan ukuran konten.
- Kanvas dapat dipotong (clip) ke wilayah tertentu, membatasi area yang terlihat dari kontennya. Ini berguna untuk membuat bentuk dan efek yang rumit.
- Kanvas dapat berisi berbagai elemen visual, termasuk rangkaian teks (text runs), paragraf, dan kotak teks (text boxes). Mereka juga dapat berisi gambar, bentuk geometris, dan kanvas lainnya.
Mengelola kanvas dalam dokumen adalah salah satu fitur yang ditawarkan oleh Aspose.Page untuk C++. Solusi ini bekerja dengan bahasa deskripsi halaman yang berbeda, XPS pada khususnya.
Untuk mengubah (transform) kanvas dari file XPS, ikuti panduan di bawah ini:
- Buat file XPS menggunakan kelas XpsDocument.
- Buat kanvas utama, yang umum untuk semua elemen halaman, menggunakan metode AddCanvas().
- Lakukan offset kiri dan atas di kanvas utama menggunakan metode CreateMatrix().
- Buat geometri jalur persegi panjang (rectangle path geometry) dengan metode CreatePathGeometry().
- Buat pengisian (fill) untuk persegi panjang menggunakan kelas XpsBrush.
- Untuk membuat persegi panjang di kanvas 2 dan mengisinya, gunakan kelas XpsPath.
- Untuk memindahkan (translate) kanvas 3 guna memosisikan persegi panjang baru di bawah persegi panjang sebelumnya, gunakan metode CreateMatrix().
- Untuk memindahkan kanvas ini ke sisi kanan halaman, gunakan metode Translate().
- Untuk menskalakan (scale) kanvas 4, panggil metode Scale().
- Untuk memutar (rotate) kanvas 5 di sekitar suatu titik sebesar 45 derajat; metode RotateAround() sangat berguna.
- Simpan dokumen XPS yang diubah menggunakan metode XpsDocument.Save().
Transformasi kanvas (canvas transformation)
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithCanvas();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// Create main canvas, common for all page elemnts
System::SharedPtr<XpsCanvas> canvas1 = doc->AddCanvas();
// Make left and top offsets in the main canvas
canvas1->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 20.0f, 10.0f));
// Create rectangle path geometry
System::SharedPtr<XpsPathGeometry> rectGeom = doc->CreatePathGeometry(u"M 0,0 L 200,0 200,100 0,100 Z");
// Create a fill for rectangles
System::SharedPtr<XpsBrush> fill = doc->CreateSolidColorBrush(doc->CreateColor(12, 15, 159));
// Add new canvas without any transformations to the main canvas
System::SharedPtr<XpsCanvas> canvas2 = canvas1->AddCanvas();
// Create rectangle in this canvas and fill it
System::SharedPtr<XpsPath> rect = canvas2->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with translate transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas3 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas3->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 200.0f));
// Translate this canvas to right side of page
canvas3->get_RenderTransform()->Translate(500.0f, 0.0f);
// Create rectangle in this canvas and fill it
rect = canvas3->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with double scale transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas4 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas4->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 400.0f));
// Scale this canvas
canvas4->get_RenderTransform()->Scale(2.0f, 2.0f);
// Create rectangle in this canvas and fill it
rect = canvas4->AddPath(rectGeom);
rect->set_Fill(fill);
// Add new canvas with rotation around a point transformation to the main canvas
System::SharedPtr<XpsCanvas> canvas5 = canvas1->AddCanvas();
// Translate this canvas to position new rectangle below previous rectnagle
canvas5->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 800.0f));
// Rotate this canvas aroud a point on 45 degrees
canvas5->get_RenderTransform()->RotateAround(45.0f, System::Drawing::PointF(100.0f, 50.0f));
rect = canvas5->AddPath(rectGeom);
rect->set_Fill(fill);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"output1.xps");Untuk memotong (clip) kanvas dari file XPS, ikuti panduan di bawah ini:
- Buat atau buka file XPS menggunakan kelas XpsDocument.
- Buat kanvas utama, yang umum untuk semua elemen halaman, menggunakan metode AddCanvas().
- Lakukan offset kiri dan atas di kanvas utama menggunakan metode CreateMatrix().
- Buat geometri jalur persegi panjang dengan metode CreatePathGeometry().
- Buat pengisian untuk persegi panjang menggunakan kelas XpsBrush.
- Untuk menambahkan kanvas lain dengan klip (clip) ke kanvas utama, panggil metode AddCanvas() lagi.
- Buat geometri lingkaran untuk klip menggunakan kelas XpsPathGeometry.
- Untuk membuat persegi panjang di kanvas ini dan mengisinya, gunakan kelas XpsPath.
- Tambahkan kanvas lain dengan metode AddCanvas(), lalu buat persegi panjang di kanvas ini dan gores (stroke) dengan kelas XpsPathGeometry.
- Simpan dokumen XPS yang diubah menggunakan metode XpsDocument.Save().
Pemotongan kanvas (canvas clipping)
// The path to the documents directory.
System::String dataDir = RunExamples::GetDataDir_WorkingWithCanvas();
// Create new XPS Document
System::SharedPtr<XpsDocument> doc = System::MakeObject<XpsDocument>();
// Create main canvas, common for all page elemnts
System::SharedPtr<XpsCanvas> canvas1 = doc->AddCanvas();
// Make left and top offsets in the main canvas
canvas1->set_RenderTransform(doc->CreateMatrix(1.0f, 0.0f, 0.0f, 1.0f, 20.0f, 10.0f));
// Create rectangle path geometry
System::SharedPtr<XpsPathGeometry> rectGeom = doc->CreatePathGeometry(u"M 0,0 L 500,0 500,300 0,300 Z");
// Create a fill for rectangles
System::SharedPtr<XpsBrush> fill = doc->CreateSolidColorBrush(doc->CreateColor(12, 15, 159));
// Add another canvas with clip to the main canvas
System::SharedPtr<XpsCanvas> canvas2 = canvas1->AddCanvas();
// Create circle geometry for clip
System::SharedPtr<XpsPathGeometry> clipGeom = doc->CreatePathGeometry(u"M250,250 A100,100 0 1 1 250,50 100,100 0 1 1 250,250");
canvas2->set_Clip(clipGeom);
// Create rectangle in this canvas and fill it
System::SharedPtr<XpsPath> rect = canvas2->AddPath(rectGeom);
rect->set_Fill(fill);
// Add the second canvas with stroked rectangle to the main canvas
System::SharedPtr<XpsCanvas> canvas3 = canvas1->AddCanvas();
// Create rectangle in this canvas and stroke it
rect = canvas3->AddPath(rectGeom);
rect->set_Stroke(fill);
rect->set_StrokeThickness(2.0f);
// Save resultant XPS document
doc->Save(dataDir + u"output/" + u"output2.xps");
XPS Apa itu Format File XPS
XPS (XML Paper Specification) adalah alternatif Microsoft untuk PDF. Berdasarkan XML/HTML, menjaga tata letak di berbagai platform dan bersifat independen sistem operasi.