Trabalhando com recortes e caminhos de recorte em documentos PostScript (PS) com Java
Defina, aplique e gerencie caminhos de recorte vetoriais em documentos PostScript (PS/EPS) usando o Aspose.Page for Java. Restrinja as operações de desenho, renderização de texto e exibição de imagens a limites geométricos fechados arbitrários. Gerencie com eficiência as regiões de recorte locais e globais usando pilhas de estado gráfico do PostScript (writeGraphicsSave/writeGraphicsRestore) para criar efeitos visuais complexos de mascaramento.
O Aspose.Page for Java utiliza as primitivas java.awt.Shape do Java para modificar o caminho de recorte atual no estado de renderização do PsDocument.
- Para aplicar recortes que fazem a interseção do caminho de recorte atual com o limite da forma geométrica fornecida, use o método
PsDocument.writeGraphicsSave(). - Para colocar o estado gráfico atual, incluindo os limites de recorte ativos, na pilha de estados, use o método
PsDocument.writeGraphicsSave(). - Para restaurar o estado gráfico, removendo o estado gráfico do topo da pilha e redefinindo a área de recorte para seu estado anterior, use o método
PsDocument.writeGraphicsRestore(). - Para recortar formas usando qualquer caminho vetorial fechado padrão ou complexo como região de recorte, use
Rectangle2D,Ellipse2D,Path2D.
Aplicar um recorte de forma simples (retângulo ou elipse)
Restrinja as operações de desenho de texto ou vetores para que permaneçam estritamente dentro de uma 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.");
}
}Gerenciar regiões de recorte aninhadas com estados gráficos
Isole os limites de recorte locais e evite que o recorte persista entre os elementos da página, envolvendo as operações de recorte em blocos 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.");
}
}Recortar textos complexos e caminhos vetoriais
Use formas personalizadas construídas com Path2D como máscaras dinâmicas para fundos com padrões ou várias cores.
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.");
}
}Instalação e configuração
Adicione o Aspose.Page for Java ao seu 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. Como PsDocument.clip(Shape) altera a região de recorte atual?
A chamada a clip(Shape) faz a interseção da forma especificada com o caminho de recorte existente no contexto de execução do PostScript. Ela não substitui completamente o caminho de recorte, a menos que o estado seja restaurado primeiro.
2. Como removo ou redefino um caminho de recorte no PostScript?
Como o PostScript acumula recortes por meio de interseções, não é possível ‘remover’ diretamente um caminho de recorte. Em vez disso, salve o estado com document.writeGraphicsSave() antes de aplicar o recorte e restaure-o com document.writeGraphicsRestore() quando terminar.
3. Posso usar formas arbitrárias, como contornos de texto ou caminhos curvos, para recorte?
Sim. Qualquer implementação Java de java.awt.Shape, incluindo Path2D, formas Bézier curvas e contornos vetoriais de texto convertido, pode ser passada diretamente para document.clip().