Trabajar con recortes y trazados de recorte en documentos PostScript (PS) con Java

Defina, aplique y administre trazados de recorte vectoriales en documentos PostScript (PS/EPS) mediante Aspose.Page for Java. Restrinja las operaciones de dibujo, renderizado de texto y visualización de imágenes a límites geométricos cerrados arbitrarios. Administre de forma eficiente las regiones de recorte locales y globales mediante pilas de estados gráficos de PostScript (writeGraphicsSave/writeGraphicsRestore) para crear efectos visuales complejos de enmascaramiento.

 

Aspose.Page for Java utiliza las primitivas java.awt.Shape de Java para modificar el trazado de recorte actual dentro del estado de renderizado de PsDocument.

  • Para aplicar recortes que intersequen el trazado de recorte actual con el límite de la forma geométrica proporcionada, utilice el método PsDocument.writeGraphicsSave().
  • Para guardar el estado gráfico actual, incluidas las regiones de recorte activas, en la pila de estados, utilice el método PsDocument.writeGraphicsSave().
  • Para restaurar el estado gráfico, lo que extrae el estado gráfico superior de la pila y restablece el área de recorte a su estado anterior, utilice el método PsDocument.writeGraphicsRestore().
  • Para recortar formas utilizando cualquier trazado vectorial cerrado estándar o complejo como región de recorte, utilice Rectangle2D, Ellipse2D, Path2D.

Aplicar un recorte con una forma simple (rectángulo o elipse)

Restrinja las operaciones de dibujo de texto o vectores para que permanezcan estrictamente dentro de una forma geométrica básica.

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.");
    }
}

Administrar regiones de recorte anidadas con estados gráficos

Aísle los límites de recorte locales y evite que el recorte persista entre los elementos de la página encapsulando las operaciones de recorte dentro de bloques de writeGraphicsSave() y 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.");
    }
}

Recortar texto complejo y trazados vectoriales

Utilice formas personalizadas construidas con Path2D como máscaras dinámicas para fondos con patrones o de varios colores.

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.");
    }
}

Instalación y configuración

Agregue Aspose.Page for Java a su 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>

Preguntas frecuentes

1. ¿Cómo modifica PsDocument.clip(Shape) la región de recorte actual?

La llamada a clip(Shape) intersecta la forma especificada con la ruta de recorte existente en el contexto de ejecución de PostScript. No reemplaza completamente la ruta de recorte a menos que primero se restaure el estado.

2. ¿Cómo puedo eliminar o restablecer una ruta de recorte en PostScript?

Debido a que PostScript acumula los recortes mediante intersecciones, no se puede ’eliminar’ directamente una ruta de recorte. En su lugar, guarde el estado con document.writeGraphicsSave() antes de aplicar el recorte y restáurelo con document.writeGraphicsRestore() cuando haya terminado.

3. ¿Puedo utilizar formas arbitrarias, como contornos de texto o rutas curvas, para realizar recortes?

Sí. Cualquier implementación de Java java.awt.Shape, incluidas Path2D, las formas Bézier curvas y los contornos vectoriales de texto convertidos, se puede pasar directamente a document.clip().