Personalizar Formas de Apresentação em PHP
Visão geral
Este artigo explica como personalizar formas de apresentação no Aspose.Slides editando a geometria da forma por meio de pontos de edição e caminhos de geometria. Ele mostra como trabalhar com GeometryPath para modificar formas existentes, executar operações básicas de edição de caminhos, adicionar ou remover pontos e aplicar a geometria atualizada de volta a uma forma.
Também demonstra como criar formas personalizadas e compostas, construir formas com cantos curvos, determinar se a geometria de uma forma está fechada e converter entre GeometryPath e java.awt.Shape para cenários adicionais de personalização de geometria.
Alterar uma forma usando pontos de edição
Considere um quadrado. No PowerPoint, usando pontos de edição, você pode
- mover o canto do quadrado para dentro ou para fora
- especificar a curvatura de um canto ou ponto
- adicionar novos pontos ao quadrado
- manipular pontos no quadrado, etc.
Essencialmente, você pode realizar as tarefas descritas em qualquer forma. Usando pontos de edição, você pode alterar uma forma ou criar uma nova forma a partir de uma forma existente.
Dicas de edição de formas

Antes de começar a editar formas do PowerPoint por meio de pontos de edição, pode ser útil considerar estes pontos sobre formas:
- Uma forma (ou seu caminho) pode ser fechada ou aberta.
- Quando uma forma é fechada, não possui ponto de início ou fim. Quando uma forma é aberta, tem um início e um fim.
- Todas as formas consistem em pelo menos 2 pontos âncora ligados entre si por linhas
- Uma linha pode ser reta ou curva. Os pontos âncora determinam a natureza da linha.
- Os pontos âncora podem ser cantos, pontos retos ou pontos suaves:
- Um ponto de canto é um ponto onde 2 linhas retas se juntam em um ângulo.
- Um ponto suave é um ponto onde 2 alças existem em linha reta e os segmentos da linha se unem em uma curva suave. Nesse caso, todas as alças ficam separadas do ponto âncora por uma distância igual.
- Um ponto reto é um ponto onde 2 alças existem em linha reta e os segmentos da linha se unem em uma curva suave. Nesse caso, as alças não precisam estar separadas do ponto âncora por uma distância igual.
- Ao mover ou editar pontos âncora (o que altera o ângulo das linhas), você pode mudar a aparência de uma forma.
Para editar formas do PowerPoint por meio de pontos de edição, Aspose.Slides fornece a classe GeometryPath.
- Uma instância de GeometryPath representa um caminho de geometria do objeto GeometryShape.
- Para obter o
GeometryPathda instânciaGeometryShape, você pode usar o método GeometryShape::getGeometryPaths. - Para definir o
GeometryPathde uma forma, você pode usar estes métodos: GeometryShape::setGeometryPath para formas sólidas e GeometryShape::setGeometryPaths para formas compostas. - Para adicionar segmentos, você pode usar os métodos em GeometryPath.
- Usando os métodos GeometryPath::setStroke e GeometryPath::setFillMode, você pode definir a aparência de um caminho de geometria.
- Usando o método GeometryPath::getPathData, você pode recuperar o caminho de geometria de um
GeometryShapecomo um array de segmentos de caminho. - Para acessar opções adicionais de personalização da geometria da forma, você pode converter GeometryPath para java.awt.Shape.
- Use os métodos geometryPathToGraphicsPath e graphicsPathToGeometryPath (da classe ShapeUtil) para converter GeometryPath em java.awt.Shape e vice‑versa.
Operações de edição simples
Este código PHP mostra como
Adicionar uma linha ao final de um caminho
Adicionar uma linha a uma posição especificada em um caminho:
Adicionar uma curva Bézier cúbica ao final de um caminho:
Adicionar uma curva Bézier cúbica a uma posição especificada em um caminho:
Adicionar uma curva Bézier quadrática ao final de um caminho:
Adicionar uma curva Bézier quadrática a uma posição especificada em um caminho:
Anexar um arco especificado a um caminho:
Fechar a figura atual de um caminho:
Definir a posição para o próximo ponto:
Remover o segmento do caminho em um índice especificado:
Adicionar pontos personalizados a uma forma
- Crie uma instância da classe GeometryShape e defina o tipo ShapeType::Rectangle.
- Obtenha uma instância da classe GeometryPath a partir da forma.
- Adicione um novo ponto entre os dois pontos superiores do caminho.
- Adicione um novo ponto entre os dois pontos inferiores do caminho.
- Aplique o caminho à forma.
Este código PHP mostra como adicionar pontos personalizados a uma forma:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 200, 100);
$geometryPath = $shape->getGeometryPaths()[0];
$geometryPath->lineTo(100, 50, 1);
$geometryPath->lineTo(100, 50, 4);
$shape->setGeometryPath($geometryPath);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Remover pontos de uma forma
- Crie uma instância da classe GeometryShape e defina o tipo ShapeType::Heart.
- Obtenha uma instância da classe GeometryPath a partir da forma.
- Remova o segmento do caminho.
- Aplique o caminho à forma.
Este código PHP mostra como remover pontos de uma forma:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Heart, 100, 100, 300, 300);
$path = $shape->getGeometryPaths()[0];
$path->removeAt(2);
$shape->setGeometryPath($path);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Criar uma forma personalizada
- Calcule os pontos da forma.
- Crie uma instância da classe GeometryPath.
- Preencha o caminho com os pontos.
- Crie uma instância da classe GeometryShape.
- Aplique o caminho à forma.
Este Java mostra como criar uma forma personalizada:
$points = new Java("java.util.ArrayList");
$R = 100;
$r = 50;
$step = 72;
for($angle = -90; $angle < 270; $angle += $step) {
$radians = $angle * java("java.lang.Math")->PI / 180.0;
$x = $R * java("java.lang.Math")->cos($radians);
$y = $R * java("java.lang.Math")->sin($radians);
$points->add(new Point2DFloat($x + $R, $y + $R));
$radians = java("java.lang.Math")->PI * $angle . $step / 2 / 180.0;
$x = $r * java("java.lang.Math")->cos($radians);
$y = $r * java("java.lang.Math")->sin($radians);
$points->add(new Point2DFloat($x + $R, $y + $R));
}
$starPath = new GeometryPath();
$starPath->moveTo($points->get(0));
for($i = 1; $i < java_values($points->size()) ; $i++) {
$starPath->lineTo($points->get($i));
}
$starPath->closeFigure();
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, $R * 2, $R * 2);
$shape->setGeometryPath($starPath);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Criar uma forma personalizada composta
- Crie uma instância da classe GeometryShape.
- Crie a primeira instância da classe GeometryPath.
- Crie a segunda instância da classe GeometryPath.
- Aplique os caminhos à forma.
Este código PHP mostra como criar uma forma personalizada composta:
$pres = new Presentation();
try {
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 200, 100);
$geometryPath0 = new GeometryPath();
$geometryPath0->moveTo(0, 0);
$geometryPath0->lineTo($shape->getWidth(), 0);
$geometryPath0->lineTo($shape->getWidth(), $shape->getHeight() / 3);
$geometryPath0->lineTo(0, $shape->getHeight() / 3);
$geometryPath0->closeFigure();
$geometryPath1 = new GeometryPath();
$geometryPath1->moveTo(0, $shape->getHeight() / 3 * 2);
$geometryPath1->lineTo($shape->getWidth(), $shape->getHeight() / 3 * 2);
$geometryPath1->lineTo($shape->getWidth(), $shape->getHeight());
$geometryPath1->lineTo(0, $shape->getHeight());
$geometryPath1->closeFigure();
$shape->setGeometryPaths(array($geometryPath0, $geometryPath1 ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Criar uma forma personalizada com cantos curvos
Este código PHP mostra como criar uma forma personalizada com cantos curvos (para dentro);
$shapeX = 20.0;
$shapeY = 20.0;
$shapeWidth = 300.0;
$shapeHeight = 200.0;
$leftTopSize = 50.0;
$rightTopSize = 20.0;
$rightBottomSize = 40.0;
$leftBottomSize = 10.0;
$pres = new Presentation();
try {
$childShape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Custom, $shapeX, $shapeY, $shapeWidth, $shapeHeight);
$geometryPath = new GeometryPath();
$point1 = new Point2DFloat($leftTopSize, 0);
$point2 = new Point2DFloat($shapeWidth - $rightTopSize, 0);
$point3 = new Point2DFloat($shapeWidth, $shapeHeight - $rightBottomSize);
$point4 = new Point2DFloat($leftBottomSize, $shapeHeight);
$point5 = new Point2DFloat(0, $leftTopSize);
$geometryPath->moveTo($point1);
$geometryPath->lineTo($point2);
$geometryPath->arcTo($rightTopSize, $rightTopSize, 180, -90);
$geometryPath->lineTo($point3);
$geometryPath->arcTo($rightBottomSize, $rightBottomSize, -90, -90);
$geometryPath->lineTo($point4);
$geometryPath->arcTo($leftBottomSize, $leftBottomSize, 0, -90);
$geometryPath->lineTo($point5);
$geometryPath->arcTo($leftTopSize, $leftTopSize, 90, -90);
$geometryPath->closeFigure();
$childShape->setGeometryPath($geometryPath);
$pres->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Descobrir se a geometria de uma forma está fechada
Uma forma fechada é definida como aquela cujo todos os lados se conectam, formando um único contorno sem lacunas. Essa forma pode ser uma forma geométrica simples ou um contorno customizado complexo. O exemplo de código a seguir mostra como verificar se a geometria de uma forma está fechada:
function isGeometryClosed($geometryShape)
{
$isClosed = null;
foreach ($geometryShape->getGeometryPaths() as $geometryPath) {
$dataLength = count(java_values($geometryPath->getPathData()));
if ($dataLength === 0) {
continue;
}
$lastSegment = java_values($geometryPath->getPathData())[$dataLength - 1];
$isClosed = $lastSegment->getPathCommand() === PathCommandType::Close;
if ($isClosed === false) {
return false;
}
}
return $isClosed === true;
}
Converter GeometryPath para java.awt.Shape
- Crie uma instância da classe GeometryShape.
- Crie uma instância da classe java.awt.Shape.
- Converta a instância java.awt.Shape para a instância GeometryPath usando o ShapeUtil.
- Aplique os caminhos à forma.
Este código PHP — uma implementação dos passos acima — demonstra o processo de conversão de GeometryPath para GraphicsPath:
$pres = new Presentation();
try {
# Criar nova forma
$shape = $pres->getSlides()->get_Item(0)->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 300, 100);
# Obter caminho de geometria da forma
$originalPath = $shape->getGeometryPaths()[0];
$originalPath->setFillMode(PathFillModeType::None);
# Criar novo caminho gráfico com texto
$graphicsPath;
$font = new Font("Arial", Font->PLAIN, 40);
$text = "Text in shape";
$img = new BufferedImage(100, 100, BufferedImage->TYPE_INT_ARGB);
$g2 = $img->createGraphics();
try {
$glyphVector = $font->createGlyphVector($g2->getFontRenderContext(), $text);
$graphicsPath = $glyphVector->getOutline(20.0, -$glyphVector->getVisualBounds()->getY() + 10);
} finally {
$g2->dispose();
}
# Converter caminho gráfico para caminho de geometria
$textPath = ShapeUtil->graphicsPathToGeometryPath($graphicsPath);
$textPath->setFillMode(PathFillModeType::Normal);
# Definir combinação do novo caminho de geometria e do caminho de geometria original na forma
$shape->setGeometryPaths(array($originalPath, $textPath ));
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}

Perguntas Frequentes
O que acontecerá ao preenchimento e contorno após substituir a geometria?
O estilo permanece associado à forma; apenas o contorno muda. O preenchimento e o contorno são aplicados automaticamente à nova geometria.
Como girar corretamente uma forma personalizada junto com sua geometria?
Use o método setRotation da forma; a geometria gira com a forma porque está vinculada ao próprio sistema de coordenadas da forma.
Posso converter uma forma personalizada em uma imagem para “travar” o resultado?
Sim. Exporte a área do slide necessária ou o próprio shape para um formato raster; isso simplifica trabalhos posteriores com geometrias complexas.