Lavorare con le trasformazioni in PostScript | .NET

Trasformare un contenuto in un documento PS

In questo articolo, consideriamo come effettuare diverse trasformazioni: traslazione, ridimensionamento, rotazione e inclinazione su un tracciato rettangolare aggiunto a PsDocument.

Suddividiamo un frammento di codice in più parti: l’inizio, la fine e ciascuna trasformazione separatamente. Una trasformazione in PostScript viene sempre eseguita in uno stato grafico vincolato dagli operatori “gsave” e “grestore”. Pertanto, nel nostro PsDocument sono presenti i metodi “WriteGraphicsSave()” e “WriteGraphicsRestore()”. Tra questi metodi, possiamo aggiungere qualsiasi contenuto, incluso lo stato grafico nidificato, ed effettuare qualsiasi trasformazione o ritaglio. Queste trasformazioni non influenzeranno gli stati grafici esterni, ma quelli nidificati.

Se eseguiamo una trasformazione senza i metodi “WriteGraphicsSave()” e “WriteGraphicsRestore()”, la eseguiamo nello stato grafico del livello superiore e tutto il contenuto presente in PsDocument verrà sottoposto a questa trasformazione.

Un algoritmo per impostare da zero qualsiasi trasformazione sul contenuto di un documento include i seguenti passaggi:

  1. Creare un flusso di output per il file PS risultante.
  2. Creare PsSaveOptions.
  3. Creare PsDocument con il flusso di output già creato e le opzioni di salvataggio.
  4. Salvare uno stato grafico. Abbiamo quindi creato un nuovo stato grafico, mentre lo stato grafico precedente è stato inserito in uno stack di stati grafici. 5. Aggiungere la trasformazione necessaria: traslazione, scala, rotazione, inclinazione o qualsiasi combinazione di esse. Nel nostro codice, mostriamo l’influenza di ogni componente di trasformazione separatamente e 3 alla volta alla fine.
  5. Aggiungere il contenuto necessario per la trasformazione. Nel nostro caso, abbiamo creato un rettangolo GraphicsPath dal rettangolo e poi lo abbiamo riempito. Abbiamo creato un rettangolo prima di qualsiasi trasformazione e lo riempiamo dopo ogni trasformazione nello stato grafico corrente.
  6. Ripristinare lo stato grafico per tornare a quello precedente, dove le trasformazioni applicate non hanno effetto. Nel nostro caso, si tratta di uno stato grafico di livello superiore.

In questo codice, creiamo PsDocument da un flusso di output e PsSaveOptions, traduciamo lo stato grafico di livello superiore ai punti 100,100 per compensare il primo rettangolo e infine creiamo il primo rettangolo GraphicsPath dal rettangolo.

 1//Create an output stream for PostScript document
 2using (Stream outPsStream = new FileStream(dataDir + "Transformations_outPS.ps", FileMode.Create))
 3{
 4    //Create save options with default values
 5    PsSaveOptions options = new PsSaveOptions();
 6
 7    // Create new 1-paged PS Document
 8    PsDocument document = new PsDocument(outPsStream, options, false);
 9
10    document.Translate(100, 100);
11
12    //Create graphics path from the rectangle
13    GraphicsPath path = new GraphicsPath();
14    path.AddRectangle(new RectangleF(0, 0, 150, 100));

Per Linux, macOS e altri sistemi operativi non Windows, offriamo l’utilizzo del nostro pacchetto Nuget Aspose.Page.Drawing. Utilizza il backend Aspose.Drawing invece della libreria di sistema System.Drawing.

Quindi, importate lo spazio dei nomi Aspose.Page.Drawing invece di quello System.Drawing. Nei frammenti di codice sopra e nei seguenti, verrà utilizzato Aspose.Page.Drawing.RectangleF al posto di System.Drawing.RectangleF, verrà utilizzato Aspose.Page.Drawing.Drawing2D.GraphicsPath al posto di System.Drawing.Drawing2D.GraphicsPath e così via. I nostri esempi di codice su GitHub contengono tutte le sostituzioni necessarie.

Qui impostiamo il colore Arancione come colore corrente per lo stato grafico di livello superiore e riempiamo questo rettangolo.

Il file PS risultante mostrerà la prima forma che si trova nello stato grafico di livello superiore e non ha subito alcuna trasformazione.

1////////////////////////////////////// No transformations ///////////////////////////////////////////////////////////////
2    //Set a paint in graphics state on upper level
3    document.SetPaint(new SolidBrush(Color.Orange));
4
5    //Fill the first rectangle that is on on the upper-level graphics state and that is without any transformations.
6    document.Fill(path);
7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Ora creiamo un nuovo stato grafico che verrà traslato di 250 punti lungo l’asse X rispetto allo stato grafico di livello superiore e aggiungiamo a questo nuovo stato grafico lo stesso percorso rettangolare dipinto di colore Blu. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore.

 1////////////////////////////////////// Translation //////////////////////////////////////////////////////////////////////
 2
 3    //Save the graphics state in order to return back to this state after transformation
 4    document.WriteGraphicsSave();
 5
 6    //Displace current graphics state on 250 to the right. So we add translation component to the current transformation.
 7    document.Translate(250, 0);
 8
 9    //Set the paint in the current graphics state
10    document.SetPaint(new SolidBrush(Color.Blue));
11
12    //Fill the second rectangle in the current graphics state (has translation transformation)
13    document.Fill(path);
14
15    //Restore the graphics state to the previus (upper) level
16    document.WriteGraphicsRestore();
17/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Tradurre lo stato grafico di livello superiore per posizionare i rettangoli successivi.

1    //Displace on 200 to the bottom.
2    document.Translate(0, 200);

Qui creiamo uno stato grafico che verrà scalato di 0,5 sull’asse X e di 0,75 sull’asse Y e aggiungiamo a questo nuovo stato grafico lo stesso percorso rettangolare dipinto di colore Rosso. Alla fine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore.

 1////////////////////////////////////// Scaling //////////////////////////////////////////////////////////////////////////
 2    //Save the graphics state in order to return back to this state after transformation
 3    document.WriteGraphicsSave();
 4
 5    //Scale current graphics state on 0.5 in X axis and on 0.75f in Y axis. So we add scale component to the current transformation.
 6    document.Scale(0.5f, 0.75f);
 7
 8    //Set the paint in the current graphics state
 9    document.SetPaint(new SolidBrush(Color.Red));
10
11    //Fill the third rectangle in the current graphics state (has scale transformation)
12    document.Fill(path);
13
14    //Restore the graphics state to the previus (upper) level
15    document.WriteGraphicsRestore();
16//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Tradurre lo stato grafico di livello superiore per posizionare i rettangoli successivi.

1    //Displace upper level graphics state on 250 to the right.
2    document.Translate(250, 0);

Quindi creiamo un nuovo stato grafico che verrà ruotato di 45 gradi in senso orario rispetto allo stato grafico di livello superiore e aggiungiamo a questo nuovo stato grafico lo stesso percorso rettangolare dipinto di verde. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore.

 1////////////////////////////////////// Rotation //////////////////////////////////////////////////////////////////////
 2    //Save the graphics state in order to return back to this state after transformation
 3    document.WriteGraphicsSave();
 4
 5    //Rotate current graphics state on 45 degrees around origin of current graphics state (350, 300). So we add rotation component to the current transformation.
 6    document.Rotate(45));
 7
 8    //Set the paint in the current graphics state
 9    document.SetPaint(new SolidBrush(Color.Green));
10
11    //Fill the fourth rectangle in the current graphics state (has rotation transformation)
12    document.Fill(path);
13
14    //Restore the graphics state to the previus (upper) level
15    document.WriteGraphicsRestore();
16//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Tradurre lo stato grafico di livello superiore per posizionare i rettangoli successivi nello spazio vuoto della pagina.

1    //Returns upper level graphics state back to the left and displace on 200 to the bottom.
2    document.Translate(-250, 200);

Quindi creiamo un nuovo stato grafico che verrà tagliato e aggiungiamo a questo nuovo stato grafico lo stesso percorso rettangolare dipinto con il colore Rosa. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore.

 1////////////////////////////////////// Shearing //////////////////////////////////////////////////////////////////////
 2    //Save the graphics state in order to return back to this state after transformation
 3    document.WriteGraphicsSave();
 4
 5    //Shear current graphics state. So we add shear component to the current transformation.
 6    document.Shear(0.1f, 0.2f);
 7
 8    //Set the paint in the current graphics state
 9    document.SetPaint(new SolidBrush(Color.Pink));
10
11    //Fill the fifth rectangle in the current graphics state (has shear transformation)
12    document.Fill(path);
13
14    //Restore the graphics state to the previus (upper) level
15    document.WriteGraphicsRestore();
16//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Tradurre lo stato grafico di livello superiore per posizionare i rettangoli successivi nello spazio vuoto della pagina.

1    //Displace upper level graphics state on 250 to the right.
2    document.Translate(250, 0);

Ora creiamo l’ultimo stato grafico che verrà sottoposto a una trasformazione complessa contenente componenti di traslazione, ridimensionamento e rotazione e aggiungiamo a questo nuovo stato grafico lo stesso tracciato rettangolare dipinto con il colore Acquamarina. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore.

 1////////////////////////////////////// Complex transformation ////////////////////////////////////////////////////////
 2    //Save the graphics state in order to return back to this state after transformation
 3    document.WriteGraphicsSave();
 4	
 5    //Transform current graphics state with complex transformation. So we add translation, scale and rotation components to the current transformation.
 6    document.Transform(new Matrix(1.2f, -0.965925f, 0.258819f, 1.5f, 0f, 50));
 7	
 8    //Set the paint in the current graphics state
 9    document.SetPaint(new SolidBrush(Color.Aquamarine));
10	
11    //Fill the sixth rectangle in the current graphics state (has complex transformation)
12    document.Fill(path);
13	
14    //Restore the graphics state to the previus (upper) level
15    document.WriteGraphicsRestore();
16//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Tradurre lo stato grafico di livello superiore per posizionare l’ultimo rettangolo nello spazio vuoto della pagina.

1    //Returns upper level graphics state back to the left and displace on 200 to the bottom.
2    document.Translate(-250, 200);

L’ultimo rettangolo riempito che abbiamo riposizionato nello stato grafico di livello superiore mostra che non ha subito trasformazioni degli stati grafici di livello inferiore né cambiamenti di colore. Il colore arancione è la vernice corrente.

1////////////////////////////////////// Again no transformation ////////////////////////////////////////////////////////
2    // Demonstrates that current graphics state's color is orange that was set up at the beginning of the code. 
3    //Fill the seventh rectangle in the current graphics state (has no transformation)
4    document.Fill(path);
5//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Infine chiudiamo la pagina corrente e salviamo il documento.

1    //Close current page
2    document.ClosePage();
3
4    //Save the document
5    document.Save();
6}

Vedi come lavorare con le trasformazioni in un documento PS in Java.


Il risultato dell’esecuzione di questo codice è il seguente

Transformations

È possibile scaricare esempi e file di dati da GitHub.

Have any questions about Aspose.Page?



Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.