Trabalhar com Padrões de Hachura em PostScript | .NET
Adicionar Padrão de Hachura em Documento PS
O padrão de hachura é um padrão de textura em mosaico, geralmente representado por pequenas imagens simples de duas cores (geralmente preto e branco). O conteúdo principal destas pequenas imagens são várias hachuras.
Para a pintura por hachuras, a plataforma . NET possui uma classe separada, derivada de System.Drawing.Brush, System.Drawing.HatchBrush. A sua diferença em relação a System.Drawing.TextureBrush é que tem estilos predefinidos que definem qual a imagem a utilizar para o mosaico. A plataforma . NET oferece 53 estilos de hachura e todos os 52 estilos podem ser utilizados para preenchimento ou contorno no PsDocument.
Para pintar objetos gráficos com um padrão de hachura na biblioteca Aspose.Page para .NET, basta passar System.Drawing.HatchBrush para SetPaint() ou um dos métodos FillText() ou FillAndStrokeText() que aceitam System.Drawing.Brush como parâmetro.
Para contornar os objetos gráficos com um padrão de hachura na biblioteca Aspose.Page para .NET, é necessário criar uma nova System.Drawing.Pen com System.Drawing.HacthBrush e passá-la para SetStroke() ou um dos métodos OutlineText() ou FillAndStrokeText() que aceitam System.Drawing.Pen como parâmetro.
No exemplo abaixo, demonstramos, em primeiro lugar, como preencher uma forma com um padrão de hachura, depois todos os estilos de hachura em .NET e, por fim, como preencher e contornar um texto com um padrão de hachura.
Um algoritmo para pintar objetos gráficos com um padrão de hachura num novo documento PS inclui os seguintes passos:
- Crie um fluxo de saída para o ficheiro PS resultante.
- Crie PsSaveOptions.
- Crie PsDocument com o fluxo de saída já criado e as opções de guardar.
- Crie o caminho gráfico ou a fonte necessária, dependendo do objeto que iremos preencher ou contornar.
- Crie um objeto de System.Drawing.HatchBrush com o estilo pretendido.
- Defina o pincel de hachura como a tinta atual no PsDocument.
- Preencha o percurso gráfico com a tinta atual ou preencha com texto. Se utilizarmos um dos métodos para preencher um texto que aceite System.Drawing.Brush como parâmetro, o ponto anterior pode ser ignorado.
- Feche a página.
- Guarde o documento.
Se precisarmos de traçar (contornar) objetos gráficos com um padrão de hachura em vez dos últimos 4 pontos, o seguinte será:
Crie o objeto System.Drawing.Pen com o pincel de hachura.
Defina esta caneta como o traço atual no PsDocument.
Contorne o percurso gráfico com o traço atual ou contorne o texto. Se utilizarmos um dos métodos para contornar o texto que aceita System.Drawing.Pen como parâmetro, o ponto anterior pode ser ignorado.
Feche a página.
Guarde o documento.
1//Create an output stream for PostScript document
2using (Stream outPsStream = new FileStream(dataDir + "AddHatchPattern_outPS.ps", FileMode.Create))
3{
4 //Create save options with A4 size
5 PsSaveOptions options = new PsSaveOptions();
6
7 // Create new 1-paged PS Document
8 PsDocument document = new PsDocument(outPsStream, options, false);
9
10 int x0 = 20;
11 int y0 = 100;
12 int squareSide = 32;
13 int width = 500;
14 int sumX = 0;
15
16 //Create a graphics state
17 document.WriteGraphicsSave();
18
19 //Translate the graphics state to initial point
20 document.Translate(x0, y0);
21
22 //Create a rectangle path for every pattern square
23 GraphicsPath path = new GraphicsPath();
24 path.AddRectangle(new RectangleF(0, 0, squareSide, squareSide));
25
26 //Create a pen for outlining pattern square
27 Pen pen = new Pen(Color.Black, 2);
28
29 //For every hatch pattern style
30 for (HatchStyle hatchStyle = 0; hatchStyle <= (HatchStyle)52; hatchStyle++)
31 {
32 //Set the paint with current hatch brush style
33 document.SetPaint(new HatchBrush(hatchStyle, Color.Black, Color.White));
34
35 //Calculate a displacement in order to don't go beyond the page bounds
36 int x = squareSide;
37 int y = 0;
38 if (sumX >= width)
39 {
40 x = -(sumX - squareSide);
41 y += squareSide;
42 }
43 //Translate current graphics state
44 document.Translate(x, y);
45 //Fill the pattern square
46 document.Fill(path);
47 //Set the stroke
48 document.SetStroke(pen);
49 //Draw the square outline
50 document.Draw(path);
51
52 //Calculate a distance from X0
53 if (sumX >= width)
54 {
55 sumX = squareSide;
56 }
57 else
58 sumX += x;
59 }
60
61 //Exit from current graphics state to upper level graphics state
62 document.WriteGraphicsRestore();
63
64 //Fill the text with the hatch pattern
65 HatchBrush brush = new HatchBrush(HatchStyle.DiagonalCross, Color.Red, Color.Yellow);
66 Font font = new Font("Arial", 96, FontStyle.Bold);
67 document.FillAndStrokeText("ABC", font, 200, 300, brush, pen);
68
69 //Outline the text with hatch pattern
70 brush = new HatchBrush(HatchStyle.Percent50, Color.Blue, Color.White);
71 document.OutlineText("ABC", font, 200, 400, new Pen(brush, 5));
72
73
74 //Close current page
75 document.ClosePage();
76
77 //Save the document
78 document.Save();
79}
Para Linux, MacOS e outros sistemas operativos não Windows, oferecemos a utilização do nosso pacote NuGet Aspose.Page.Drawing. Utiliza o backend Aspose.Drawing em vez da biblioteca de sistema System.Drawing.
Assim, importe o namespace Aspose.Page.Drawing em vez do System.Drawing. No excerto de código acima, será utilizado Aspose.Page.Drawing.Rectangle em vez de System.Drawing.Rectangle, Aspose.Page.Drawing.Drawing2D.GraphicsPath será utilizado em vez de System.Drawing.Drawing2D.GraphicsPath e assim por diante. Os nossos exemplos de código no GitHub contêm todas as substituições necessárias.
Veja como trabalhar com um padrão de hachura num documento PS em Java.
O resultado da execução deste código é apresentado como
Pode descarregar exemplos e ficheiros de dados do GitHub.