Lavorare con i ritagli e i tracciati di ritaglio nei documenti PostScript (PS) con Java

Definisci, applica e gestisci tracciati di ritaglio vettoriali nei documenti PostScript (PS/EPS) utilizzando Aspose.Page for Java. Limita le operazioni di disegno, rendering del testo e visualizzazione delle immagini all’interno di confini geometrici chiusi arbitrari. Gestisci in modo efficiente le aree di ritaglio locali e globali utilizzando gli stack dello stato grafico di PostScript (writeGraphicsSave/writeGraphicsRestore) per creare effetti visivi complessi di mascheratura.

 

Aspose.Page for Java utilizza le primitive java.awt.Shape di Java per modificare il tracciato di ritaglio corrente nello stato di rendering di PsDocument.

  • Per applicare ritagli che intersecano il tracciato di ritaglio corrente con il contorno della forma geometrica fornita, utilizzare il metodo PsDocument.writeGraphicsSave().
  • Per inserire lo stato grafico corrente, incluse le aree di ritaglio attive, nello stack degli stati, utilizzare il metodo PsDocument.writeGraphicsSave().
  • Per ripristinare lo stato grafico, rimuovendo lo stato grafico superiore dallo stack e riportando l’area di ritaglio allo stato precedente, utilizzare il metodo PsDocument.writeGraphicsRestore().
  • Per ritagliare le forme utilizzando qualsiasi tracciato vettoriale chiuso standard o complesso come area di ritaglio, utilizzare Rectangle2D, Ellipse2D, Path2D.

Applicare un ritaglio con una forma semplice (rettangolo o ellisse)

Limita le operazioni di disegno del testo o della grafica vettoriale in modo che rimangano rigorosamente all’interno di una forma geometrica di base.

import com.aspose.page.eps.PsDocument;
import com.aspose.page.eps.device.PsSaveOptions;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;

public class BasicClippingPS {
    public static void main(String[] args) throws Exception {
        // Initialize output stream and PS document
        FileOutputStream outStream = new FileOutputStream("C:/PSProject/Output/basic_clipping.ps");
        PsSaveOptions options = new PsSaveOptions();
        PsDocument document = new PsDocument(outStream, options, 1);

        document.openPage(null);

        // Define a clipping shape (Circle boundary)
        Ellipse2D clipShape = new Ellipse2D.Float(100, 100, 200, 200);

        // Save state before clipping
        document.writeGraphicsSave();

        // Apply clip shape
        document.clip(clipShape);

        // Draw a large rectangle that extends past the clip boundary
        document.setPaint(Color.BLUE);
        document.fill(new Rectangle2D.Float(50, 50, 300, 300)); // Only the circle area gets rendered

        // Restore state to release clip
        document.writeGraphicsRestore();

        document.closePage();
        document.save();
        outStream.close();

        System.out.println("Basic clip applied successfully to PostScript document.");
    }
}

Gestire aree di ritaglio nidificate con gli stati grafici

Isola i contorni di ritaglio locali e impedisci che il ritaglio persista tra gli elementi della pagina racchiudendo le operazioni di ritaglio nei blocchi writeGraphicsSave() e writeGraphicsRestore().

import com.aspose.page.eps.PsDocument;
import com.aspose.page.eps.device.PsSaveOptions;
import java.awt.Color;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;

public class NestedClippingPS {
    public static void main(String[] args) throws Exception {
        FileOutputStream outStream = new FileOutputStream("C:/PSProject/Output/nested_clipping.ps");
        PsSaveOptions options = new PsSaveOptions();
        PsDocument document = new PsDocument(outStream, options, 1);

        document.openPage(null);

        // Outer graphic state
        document.writeGraphicsSave();
        
        // Intersect First Clip (Outer Box)
        document.clip(new Rectangle2D.Float(100, 100, 200, 200));

        // Inner graphic state
        document.writeGraphicsSave();
        
        // Intersect Second Clip (Inner Box - creates combined intersection)
        document.clip(new Rectangle2D.Float(150, 150, 200, 200));

        // Fill combined intersection region
        document.setPaint(Color.RED);
        document.fill(new Rectangle2D.Float(0, 0, 500, 500));

        // Restore back to single outer box clip
        document.writeGraphicsRestore();

        // Restore back to unclipped original page state
        document.writeGraphicsRestore();

        document.closePage();
        document.save();
        outStream.close();

        System.out.println("Nested clip states processed successfully.");
    }
}

Ritagliare testo complesso e tracciati vettoriali

Utilizza forme personalizzate create con Path2D come maschere dinamiche per sfondi a motivi o multicolore.

import com.aspose.page.eps.PsDocument;
import com.aspose.page.eps.device.PsSaveOptions;
import java.awt.Color;
import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;

public class ComplexPathClippingPS {
    public static void main(String[] args) throws Exception {
        FileOutputStream outStream = new FileOutputStream("C:/PSProject/Output/complex_clip.ps");
        PsSaveOptions options = new PsSaveOptions();
        PsDocument document = new PsDocument(outStream, options, 1);

        document.openPage(null);

        // Construct a custom triangle path for clipping
        Path2D triangleClip = new Path2D.Float();
        triangleClip.moveTo(250, 100);
        triangleClip.lineTo(400, 350);
        triangleClip.lineTo(100, 350);
        triangleClip.closePath();

        document.writeGraphicsSave();

        // Apply custom path clip
        document.clip(triangleClip);

        // Render overlapping colored stripes inside the triangle boundary
        Color[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW };
        for (int i = 0; i < colors.length; i++) {
            document.setPaint(colors[i]);
            document.fill(new Rectangle2D.Float(100, 100 + (i * 60), 300, 50));
        }

        document.writeGraphicsRestore();

        document.closePage();
        document.save();
        outStream.close();

        System.out.println("Complex vector path clip applied successfully.");
    }
}

Installazione e configurazione

Aggiungi Aspose.Page for Java al tuo Maven:

Package Manager Console Command

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>https://repository.aspose.com/repo/</url>
</repository>

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-page</artifactId>
    <version>Latest</version>
</dependency>

FAQ

1. In che modo PsDocument.clip(Shape) modifica la regione di ritaglio corrente?

La chiamata a clip(Shape) interseca la forma specificata con il percorso di ritaglio esistente nel contesto di esecuzione PostScript. Non sostituisce completamente il percorso di ritaglio a meno che lo stato non venga ripristinato prima.

2. Come posso rimuovere o reimpostare un percorso di ritaglio in PostScript?

Poiché PostScript accumula i ritagli tramite intersezione, non è possibile ‘rimuovere’ direttamente un percorso di ritaglio. È invece necessario salvare lo stato con document.writeGraphicsSave() prima di applicare il ritaglio e ripristinarlo con document.writeGraphicsRestore() al termine.

3. Posso utilizzare forme arbitrarie, come contorni di testo o percorsi curvi, per il ritaglio?

Sì. Qualsiasi implementazione Java di java.awt.Shape, inclusi Path2D, forme curve di Bézier e contorni vettoriali di testo convertito, può essere passata direttamente a document.clip().