Làm việc với các canvas bên trong XPS
Cắt (clip) và chuyển đổi (transform) các canvas trong tệp XPS bằng API C++
Trong các tệp XPS, canvas là một vùng hình chữ nhật trên trang nơi nội dung trực quan, chẳng hạn như văn bản, hình ảnh và hình dạng, có thể được vẽ. Nó hoạt động như một vùng chứa cho các phần tử này và cung cấp một khung để sắp xếp và xếp lớp (layering) chúng. Các canvas có thể được tái sử dụng ở các phần khác nhau của tài liệu hoặc thậm chí trong nhiều tài liệu, cung cấp một cách linh hoạt để cấu trúc và tổ chức nội dung trong tài liệu XPS. Các đặc điểm chính của canvas trong tệp XPS:
- Các canvas có thể được lồng (nested) trong các canvas khác, tạo ra cấu trúc phân cấp cho phép bố cục (layouts) phức tạp và nhóm các phần tử.
- Các canvas có thể được chuyển đổi (transform) bằng cách sử dụng các thao tác khác nhau, chẳng hạn như dịch chuyển (translation), xoay (rotation) và chia tỷ lệ (scaling). Điều này cho phép định vị linh hoạt và thay đổi kích thước nội dung.
- Các canvas có thể được cắt (clip) vào các vùng cụ thể, giới hạn vùng hiển thị của nội dung của chúng. Điều này hữu ích để tạo ra các hình dạng và hiệu ứng phức tạp.
- Canvas có thể chứa các phần tử trực quan khác nhau, bao gồm các đoạn văn bản (text runs), đoạn văn (paragraphs) và hộp văn bản (text boxes). Chúng cũng có thể chứa hình ảnh, hình dạng hình học và các canvas khác.
Quản lý các canvas trong tài liệu là một trong những tính năng do Aspose.Page cho C++ cung cấp. Giải pháp này hoạt động với các ngôn ngữ mô tả trang khác nhau, đặc biệt là XPS.
Để chuyển đổi (transform) các canvas của tệp XPS, hãy làm theo hướng dẫn bên dưới:
- Tạo tệp XPS bằng lớp XpsDocument.
- Tạo canvas chính, chung cho tất cả các phần tử trang, bằng phương thức AddCanvas().
- Tạo độ lệch trái và trên trong canvas chính bằng phương thức CreateMatrix().
- Tạo hình học đường dẫn hình chữ nhật (rectangle path geometry) bằng phương thức CreatePathGeometry().
- Tạo phần điền (fill) cho các hình chữ nhật bằng lớp XpsBrush.
- Để tạo hình chữ nhật trong canvas 2 và điền vào đó, hãy sử dụng lớp XpsPath.
- Để dịch canvas 3 để định vị hình chữ nhật mới bên dưới hình chữ nhật trước, hãy sử dụng phương thức CreateMatrix().
- Để dịch canvas này sang bên phải của trang, hãy sử dụng phương thức Translate().
- Để chia tỷ lệ (scale) canvas 4, hãy gọi phương thức Scale().
- Để xoay canvas 5 quanh một điểm 45 độ; phương thức RotateAround() rất hữu ích.
- Lưu tài liệu XPS đã thay đổi bằng phương thức XpsDocument.Save().
Chuyển đổi canvas (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");Để cắt (clip) các canvas của tệp XPS, hãy làm theo hướng dẫn bên dưới:
- Tạo hoặc mở tệp XPS bằng lớp XpsDocument.
- Tạo canvas chính, chung cho tất cả các phần tử trang, bằng phương thức AddCanvas().
- Tạo độ lệch trái và trên trong canvas chính bằng phương thức CreateMatrix().
- Tạo hình học đường dẫn hình chữ nhật bằng phương thức CreatePathGeometry().
- Tạo phần điền cho các hình chữ nhật bằng lớp XpsBrush.
- Để thêm một canvas khác có clip vào canvas chính, hãy gọi lại phương thức AddCanvas().
- Tạo hình học hình tròn cho clip bằng lớp XpsPathGeometry.
- Để tạo hình chữ nhật trong canvas này và điền vào đó, hãy sử dụng lớp XpsPath.
- Thêm một canvas khác bằng phương thức AddCanvas(), sau đó tạo hình chữ nhật trong canvas này và tô viền (stroke) bằng lớp XpsPathGeometry.
- Lưu tài liệu XPS đã thay đổi bằng phương thức XpsDocument.Save().
Cắt canvas (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 What is XPS File Format
XPS (XML Paper Specification) là định dạng thay thế PDF của Microsoft, dựa trên XML/HTML, giữ nguyên bố cục trên mọi nền tảng và không phụ thuộc vào hệ điều hành.