在 PostScript 中使用剪辑 | C++

Contents
[ Hide Show ]

在 PS 文档中添加剪切

PS 文档中的剪切路径是指一条路径,它限定了当前图形状态的内容,这些内容将在 PS 查看器或编辑器中显示。超出边界的内容将被截断。

C++ 中的剪切路径可以通过三种方式指定:

目前,Aspose.Page for C++ 库提供了第一种和第二种剪切方式。在下面的示例中,我们从一个矩形获取一个圆形 System.Drawing.Drawing2D.GraphicsPath 作为剪切路径,并在相同的图形状态下截取一个蓝色填充的矩形。

为了使用 Aspose.Page for C++ 库将剪辑添加到新的 PsDocument,在本例中,我们执行以下步骤:

  1. 为生成的 PS 文件创建输出流。
  2. 使用默认选项创建 PsSaveOptions 对象。
  3. 使用已创建的输出流和保存选项创建一个单页 PsDocument。
  4. 创建新的图形状态。
  5. 根据矩形创建一个圆形 System.Drawing.Drawing2D.GraphicsPath
  6. 使用此路径设置一个剪辑。
  7. 将绘制设置为 PsDocument 的当前图形状态。
  8. 使用当前绘制填充矩形路径。
  9. 从当前图形状态退出到上一级图形状态。
  10. 平移到已填充矩形的位置。
  11. 用虚线勾勒出填充矩形上方相同矩形的边界,以显示剪切后的填充矩形的边界。
  12. 关闭页面。
  13. 保存文档。
 1    // The path to the documents directory.
 2    System::String dataDir = RunExamples::GetDataDir_WorkingWithCanvas();
 3    
 4    //Create output stream for PostScript document
 5    {
 6        System::SharedPtr<System::IO::Stream> outPsStream = System::MakeObject<System::IO::FileStream>(dataDir + u"Clipping_outPS.ps", System::IO::FileMode::Create);
 7        // Clearing resources under 'using' statement
 8        System::Details::DisposeGuard<1> __dispose_guard_0({ outPsStream});
 9        // ------------------------------------------
10        
11        try
12        {
13            //Create save options with default values
14            System::SharedPtr<PsSaveOptions> options = System::MakeObject<PsSaveOptions>();
15            
16            // Create new 1-paged PS Document
17            System::SharedPtr<PsDocument> document = System::MakeObject<PsDocument>(outPsStream, options, false);
18            
19            //Create graphics path from the rectangle
20            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> rectanglePath = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
21            rectanglePath->AddRectangle(System::Drawing::RectangleF(0.0f, 0.0f, 300.0f, 200.0f));
22            
23            ////////////////////////////////////// Clipping by shape //////////////////////////////////////////////////////////////////////
24            
25            //Save graphics state in order to return back to this state after transformation
26            document->WriteGraphicsSave();
27            
28            //Displace current graphics state on 100 points to the right and 100 points to the bottom.
29            document->Translate(100.0f, 100.0f);
30            
31            //Create graphics path from the circle
32            System::SharedPtr<System::Drawing::Drawing2D::GraphicsPath> circlePath = System::MakeObject<System::Drawing::Drawing2D::GraphicsPath>();
33            circlePath->AddEllipse(System::Drawing::RectangleF(50.0f, 0.0f, 200.0f, 200.0f));
34            
35            //Add clipping by circle to the current graphics state
36            document->Clip(circlePath);
37            
38            //Set paint in the current graphics state
39            document->SetPaint(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()));
40            
41            //Fill the rectangle in the current graphics state (with clipping)
42            document->Fill(rectanglePath);
43            
44            //Restore graphics state to the previus (upper) level
45            document->WriteGraphicsRestore();
46            
47            //Displace upper level graphics state on 100 points to the right and 100 points to the bottom.
48            document->Translate(100.0f, 100.0f);
49            
50            System::SharedPtr<System::Drawing::Pen> pen = System::MakeObject<System::Drawing::Pen>(System::MakeObject<System::Drawing::SolidBrush>(System::Drawing::Color::get_Blue()), 2.0f);
51            pen->set_DashStyle(System::Drawing::Drawing2D::DashStyle::Dash);
52            
53            document->SetStroke(pen);
54            
55            //Draw the rectangle in the current graphics state (has no clipping) above clipped rectangle
56            document->Draw(rectanglePath);
57            
58            ////////////////////////////////////// Clipping by text //////////////////////////////////////////////////////////////////////
59            
60            //Save graphics state in order to return back to this state after transformation
61            document->WriteGraphicsSave();
62            
63            //Displace current graphics state on 100 points to the right and 100 points to the bottom.
64            document->Translate(0.0f, 350.0f);
65            
66            int32_t fontSize = 120;
67            System::SharedPtr<System::Drawing::Font> font = System::MakeObject<System::Drawing::Font>(u"Arial", static_cast<float>(fontSize), System::Drawing::FontStyle::Bold);
68            
69            //Clip rectangle by text's outline
70            document->ClipText(u"ABC", font, 20.0f, static_cast<float>(fontSize + 10));
71            document->Fill(rectanglePath);
72            
73            document->WriteGraphicsRestore();
74            
75            document->Translate(0.0f, 350.0f);
76            
77            document->SetStroke(pen);
78            //Draw the rectangle in the current graphics state (has no clipping) above clipped rectangle
79            document->Draw(rectanglePath);
80            
81            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
82            
83            //Close current page
84            document->ClosePage();
85            
86            //Save the document
87            document->Save();
88        }
89        catch(...)
90        {
91            __dispose_guard_0.SetCurrentException(std::current_exception());
92        }
93    }

请参阅如何在 Java 中使用 PS 文档中的剪辑。


运行此代码的结果显示为

Clipping

在下一个示例中,我们获取一种字体,用于根据文本轮廓裁剪蓝色填充的矩形。

为了在本例中使用 Aspose.Page for C++ 库将文本剪辑添加到新的 PsDocument,我们执行以下步骤:

  1. 为生成的 PS 文件创建输出流。
  2. 使用默认选项创建一个 PsSaveOptions 对象。
  3. 创建一个单页 PsDocument,其中包含已创建的输出流和保存选项。
  4. 创建新的图形状态。
  5. 创建字体。
  6. 设置包含文本和字体的裁剪区域。
  7. 将绘制设置为 PsDocument 的当前图形状态。
  8. 使用当前绘制填充矩形路径。
  9. 从当前图形状态退出到上一级图形状态。
  10. 平移到已填充矩形的位置。
  11. 用虚线勾勒出已填充矩形上方相同矩形的边界,以显示裁剪后的已填充矩形的边界。
  12. 关闭页面。
  13. 保存文档。
 1//Create an output stream for the PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "Clipping_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with default values
 5    PsSaveOptions options = new PsSaveOptions();
 6
 7    // Create a new 1-paged PS Document
 8    PsDocument document = new PsDocument(outPsStream, options, false);
 9
10    //Create a graphics path from the rectangle
11    GraphicsPath rectangePath = new GraphicsPath();
12    rectangePath.AddRectangle(new RectangleF(0, 0, 300, 200));
13
14    //Save the graphics state in order to return back to this state after transformation
15    document.WriteGraphicsSave();
16
17    //Displace the current graphics state on 100 points to the right and 100 points to the bottom.
18    document.Translate(100, 100);
19    
20    //Set the paint in the current graphics state
21    document.SetPaint(new SolidBrush(Color.Blue));
22
23    //Create a font
24    int fontSize = 120;
25    Font font = new Font("Arial", fontSize, FontStyle.Bold);
26
27    //Clip the rectangle by text's outline
28    document.ClipText("ABC", font, 20, fontSize + 10);
29    document.Fill(rectanglePath);
30
31    //Restore the graphics state to the previus (upper) level
32    document.WriteGraphicsRestore();
33
34		//Displace the upper level graphics state on 100 points to the right and 100 points to the bottom.
35    document.Translate(100, 100);
36
37		Pen pen = new Pen(new SolidBrush(Color.Blue), 2);
38    pen.DashStyle = DashStyle.Dash;
39
40    document.SetStroke(pen);
41    
42    //Draw the rectangle in the current graphics state (has no clipping) above the clipped rectangle
43    document.Draw(rectanglePath);
44
45    //Close the current page
46    document.ClosePage();
47
48    //Save the document
49    document.Save();
50}

请参阅如何在 .NETJava 中使用 PS 文档中的剪辑。


运行此代码的结果显示为

ClippingByText

您可以从 GitHub 下载示例和数据文件。

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.