Lavorare con le trasformazioni in un file PS | Java

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 lo faranno su 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, taglio 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 java.awt.geom.Rectangle2D e poi lo riempiamo. 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 nei punti 100,100 per compensare il primo rettangolo e infine creiamo il primo rettangolo:

 1//Create an output stream for PostScript document
 2FileOutputStream outPsStream = new FileOutputStream(dataDir + "Tranformations_outPS.ps");
 3//Create a save options with A4 size
 4PsSaveOptions options = new PsSaveOptions();
 5
 6// Create new PS Document with the page opened
 7PsDocument document = new PsDocument(outPsStream, options, false);
 8
 9document.translate(100, 100);
10
11//Create a rectangle
12Shape shape = new Rectangle2D.Float(0, 0, 150, 100);

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 paint in graphics state on upper level
3document.setPaint(Color.ORANGE);
4
5//Fill the first rectangle that is on on upper level graphics state and that is without any transformations.
6document.fill(shape);
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 rettangolo colorato di Blu. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore:

 1////////////////////////////////////// Translation //////////////////////////////////////////////////////////////////////
 2//Save graphics state in order to return back to this state after transformation
 3document.writeGraphicsSave();
 4
 5//Displace current graphics state on 250 to the right. So we add translation component to the current transformation.
 6document.translate(250, 0);
 7
 8//Set paint in the current graphics state
 9document.setPaint(Color.BLUE);
10
11//Fill the second rectangle in the current graphics state (has translation transformation)
12document.fill(shape);
13
14//Restore graphics state to the previus (upper) level
15document.writeGraphicsRestore();
16/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Traduci lo stato grafico di livello superiore per inserire i seguenti rettangoli:

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

Qui creiamo uno stato grafico che verrà ridimensionato di 0,5 sull’asse X e di 0,75 sull’asse Y e aggiungiamo a questo nuovo stato grafico lo stesso rettangolo dipinto di Rosso. Infine, 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
 3document.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.
 6document.scale(0.5f, 0.75f);
 7
 8//Set paint in the current graphics state
 9document.setPaint(Color.RED);
10
11//Fill the third rectangle in the current graphics state (has scale transformation)
12document.fill(shape);
13
14//Restore graphics state to the previus (upper) level
15document.writeGraphicsRestore();
16//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Traduci lo stato grafico di livello superiore per inserire i seguenti rettangoli:

1//Displace upper level graphics state on 250 to the right.
2document.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 rettangolo dipinto di verde. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore:

 1////////////////////////////////////// Rotation //////////////////////////////////////////////////////////////////////
 2//Save graphics state in order to return back to this state after transformation
 3document.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.
 6document.rotate(45);
 7
 8//Set paint in the current graphics state
 9document.setPaint(Color.GREEN);
10
11//Fill the fourth rectangle in the current graphics state (has rotation transformation)
12document.fill(shape);
13
14//Restore graphics state to the previus (upper) level
15document.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.
2document.translate(-250, 200);

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

 1////////////////////////////////////// Shearing //////////////////////////////////////////////////////////////////////
 2//Save graphics state in order to return back to this state after transformation
 3document.writeGraphicsSave();
 4
 5//Shear current graphics state. So we add shear component to the current transformation.
 6document.shear(0.1f, 0.2f);
 7
 8//Set paint in the current graphics state
 9document.setPaint(new Color(255,192,203));
10
11//Fill the fifth rectangle in the current graphics state (has shear transformation)
12document.fill(shape);
13
14//Restore graphics state to the previous (upper) level
15document.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.
2document.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 rettangolo dipinto con il colore Acquamarina. Infine, usciamo dallo stato grafico corrente e passiamo allo stato grafico di livello superiore:

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

Traduci 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.
2document.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 sinistra:

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)
4document.fill(path);
5//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Infine chiudiamo la pagina corrente e salviamo il documento:

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

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


Il risultato dell'esecuzione di questo codice è il seguente:

Aggiungi trasformazioni

È 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.