Arbeiten mit Beschneidungen und Beschneidungspfaden in PostScript-(PS-)Dokumenten mit Java

Definieren, anwenden und verwalten Sie Vektor-Beschneidungspfade in PostScript-(PS/EPS-)Dokumenten mit Aspose.Page for Java. Beschränken Sie Zeichen-, Textdarstellungs- und Bildanzeigevorgänge auf beliebige geschlossene geometrische Grenzen. Verwalten Sie lokale und globale Beschneidungsbereiche effizient mithilfe von PostScript-Grafikzustandsstapeln (writeGraphicsSave/writeGraphicsRestore), um komplexe visuelle Maskierungseffekte zu erstellen.

 

Aspose.Page for Java nutzt die java.awt.Shape-Primitive von Java, um den aktuellen Beschneidungspfad innerhalb des PsDocument-Darstellungszustands zu ändern.

  • Um Beschneidungen anzuwenden, die den aktuellen Beschneidungspfad mit der Grenze der bereitgestellten geometrischen Form schneiden, verwenden Sie die Methode PsDocument.writeGraphicsSave().
  • Um den aktuellen Grafikzustand einschließlich aktiver Beschneidungsgrenzen auf den Zustandsstapel zu legen, verwenden Sie die Methode PsDocument.writeGraphicsSave().
  • Um den Grafikzustand wiederherzustellen, der den obersten Grafikzustand vom Stapel entfernt und den Beschneidungsbereich auf seinen vorherigen Zustand zurücksetzt, verwenden Sie die Methode PsDocument.writeGraphicsRestore().
  • Um Formen zu beschneiden, indem ein beliebiger standardmäßiger oder komplexer geschlossener Vektorpfad als Beschneidungsbereich verwendet wird, nutzen Sie Rectangle2D, Ellipse2D, Path2D.

Anwenden einer einfachen Formbeschneidung (Rechteck oder Ellipse)

Beschränken Sie Text- oder Vektorzeichenvorgänge darauf, strikt innerhalb einer einfachen geometrischen Form zu bleiben.

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

Verwalten verschachtelter Beschneidungsbereiche mit Grafikzuständen

Isolieren Sie lokale Beschneidungsgrenzen und verhindern Sie, dass Beschneidungen über Seitenelemente hinweg bestehen bleiben, indem Sie Beschneidungsvorgänge in writeGraphicsSave()- und writeGraphicsRestore()-Blöcke einschließen.

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

Beschneiden komplexer Text- und Vektorpfade

Verwenden Sie mit Path2D erstellte benutzerdefinierte Formen als dynamische Masken für gemusterte oder mehrfarbige Hintergründe.

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

Installation und Einrichtung

Fügen Sie Aspose.Page for Java zu Ihrem Maven hinzu:

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. Wie verändert PsDocument.clip(Shape) die aktuelle Beschneidungsregion?

Der Aufruf von clip(Shape) schneidet die angegebene Form mit dem vorhandenen Beschneidungspfad im PostScript-Ausführungskontext. Er ersetzt den Beschneidungspfad nicht vollständig, es sei denn, der Zustand wird zuvor wiederhergestellt.

2. Wie kann ich einen Beschneidungspfad in PostScript entfernen oder zurücksetzen?

Da PostScript Beschneidungen durch Schnittmengen akkumuliert, können Sie einen Beschneidungspfad nicht direkt ’entfernen’. Speichern Sie stattdessen den Zustand mit document.writeGraphicsSave(), bevor Sie die Beschneidung anwenden, und stellen Sie ihn mit document.writeGraphicsRestore() wieder her, wenn Sie fertig sind.

3. Kann ich beliebige Formen wie Textumrisse oder gekrümmte Pfade zum Beschneiden verwenden?

Ja. Jede Java-java.awt.Shape-Implementierung—einschließlich Path2D, gekrümmter Bézier-Formen und konvertierter Vektor-Textumrisse—kann direkt an document.clip() übergeben werden.