Criando uma apresentação do MS PowerPoint em Java
1. Introdução
Neste artigo, veremos como podemos criar uma apresentação usandoApache POI.
Essa biblioteca nos dá a possibilidade de criar apresentações do PowerPoint, ler as existentes e alterar seu conteúdo.
2. Dependências do Maven
Para começar, precisaremos adicionar as seguintes dependências em nossopom.xml:
org.apache.poi
poi
3.17
org.apache.poi
poi-ooxml
3.17
A versão mais recente de amboslibraries pode ser baixada do Maven Central.
3. Apache POI
OApache POI library supports both .ppt and .pptx files e fornece a implementação HSLF para o formato de arquivo Powerpoint '97 (-2007) e o XSLF para o formato de arquivo OOXML do PowerPoint 2007.
Como não existe uma interface comum para ambas as implementações,we have to remember to use the XMLSlideShow, XSLFSlide and XSLFTextShape classes when working with the newer .pptx file format.
E, quando for necessário trabalhar com o formato.ppt mais antigo, use as classesHSLFSlideShow,HSLFSlideeHSLFTextParagraph.
Usaremos o novo formato de arquivo.pptx em nossos exemplos, e a primeira coisa que temos que fazer é criar uma nova apresentação, adicionar um slide a ela (talvez usando um layout predefinido) e salvá-la.
Depois que essas operações estiverem claras, poderemos começar a trabalhar com imagens, texto e tabelas.
3.1. Crie uma nova apresentação
Vamos primeiro criar a nova apresentação:
XMLSlideShow ppt = new XMLSlideShow();
ppt.createSlide();
3.2. Adicionar um novo slide
Ao adicionar um novo slide a uma apresentação, também podemos optar por criá-lo a partir de um layout predefinido. Para conseguir isso, primeiro temos que recuperar oXSLFSlideMaster que contém os layouts (o primeiro é o mestre padrão):
XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);
Agora, podemos recuperar oXSLFSlideLayoute usá-lo ao criar o novo slide:
XSLFSlideLayout layout
= defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide slide = ppt.createSlide(layout);
Vamos ver como preencher espaços reservados dentro de um modelo:
XSLFTextShape titleShape = slide.getPlaceholder(0);
XSLFTextShape contentShape = slide.getPlaceholder(1);
Lembre-se de que cada modelo tem seus marcadores de posição, instâncias da subclasseXSLFAutoShape, que podem diferir em número de um modelo para outro.
Vamos ver como podemos recuperar rapidamente todos os marcadores de posição de um slide:
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFAutoShape) {
// this is a template placeholder
}
}
3.3. Salvando uma apresentação
Depois de criar a apresentação de slides, a próxima etapa é salvá-la:
FileOutputStream out = new FileOutputStream("powerpoint.pptx");
ppt.write(out);
out.close();
4. Trabalhando com objetos
Agora que vimos como criar uma nova apresentação, adicionar um slide a ela (usando ou não um modelo predefinido) e salvá-lo, podemos começar a adicionar texto, imagens, links e tabelas.
Vamos começar com o texto.
4.1. Text
Ao trabalhar com texto dentro de uma apresentação, como no MS PowerPoint, precisamos criar a caixa de texto dentro de um slide, adicionar um parágrafo e depois adicionar o texto ao parágrafo:
XSLFTextBox shape = slide.createTextBox();
XSLFTextParagraph p = shape.addNewTextParagraph();
XSLFTextRun r = p.addNewTextRun();
r.setText("example");
r.setFontColor(Color.green);
r.setFontSize(24.);
Ao configurar oXSLFTextRun, é possível customizar seu estilo escolhendo a família da fonte e se o texto deve estar em negrito, itálico ou sublinhado.
4.2. Hiperlinks
Ao adicionar texto a uma apresentação, às vezes pode ser útil adicionar hiperlinks.
Depois de criar o objetoXSLFTextRun, podemos agora adicionar um link:
XSLFHyperlink link = r.createHyperlink();
link.setAddress("http://www.example.com");
4.3. Imagens
Também podemos adicionar imagens:
byte[] pictureData = IOUtils.toByteArray(
new FileInputStream("logo-leaf.png"));
XSLFPictureData pd
= ppt.addPicture(pictureData, PictureData.PictureType.PNG);
XSLFPictureShape picture = slide.createPicture(pd);
No entanto,without a proper configuration, the image will be placed in the top left corner of the slide. Para colocá-lo corretamente, temos que configurar seu ponto de ancoragem:
picture.setAnchor(new Rectangle(320, 230, 100, 92));
OXSLFPictureShape aceita umRectangle como ponto de ancoragem, o que nos permite configurar as coordenadas x / y com os dois primeiros parâmetros, e a largura / altura da imagem com os dois últimos.
4.4. Listas
O texto, dentro de uma apresentação, é frequentemente representado na forma de uma lista, numerada ou não.
Vamos agora definir uma lista de marcadores:
XSLFTextShape content = slide.getPlaceholder(1);
XSLFTextParagraph p1 = content.addNewTextParagraph();
p1.setIndentLevel(0);
p1.setBullet(true);
r1 = p1.addNewTextRun();
r1.setText("Bullet");
Da mesma forma, podemos definir uma lista numerada:
XSLFTextParagraph p2 = content.addNewTextParagraph();
p2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
p2.setIndentLevel(1);
XSLFTextRun r2 = p2.addNewTextRun();
r2.setText("Numbered List Item - 1");
Caso estejamos trabalhando com várias listas, é sempre importante definir oindentLevel para obter um recuo adequado dos itens.
4.5. Tabelas
As tabelas são outro objeto importante em uma apresentação e são úteis quando queremos exibir dados.
Vamos começar criando uma tabela:
XSLFTable tbl = slide.createTable();
tbl.setAnchor(new Rectangle(50, 50, 450, 300));
Agora, podemos adicionar um cabeçalho:
int numColumns = 3;
XSLFTableRow headerRow = tbl.addRow();
headerRow.setHeight(50);
for (int i = 0; i < numColumns; i++) {
XSLFTableCell th = headerRow.addCell();
XSLFTextParagraph p = th.addNewTextParagraph();
p.setTextAlign(TextParagraph.TextAlign.CENTER);
XSLFTextRun r = p.addNewTextRun();
r.setText("Header " + (i + 1));
tbl.setColumnWidth(i, 150);
}
Depois que o cabeçalho é concluído, podemos adicionar linhas e células à nossa tabela para exibir dados:
for (int rownum = 1; rownum < numRows; rownum++) {
XSLFTableRow tr = tbl.addRow();
tr.setHeight(50);
for (int i = 0; i < numColumns; i++) {
XSLFTableCell cell = tr.addCell();
XSLFTextParagraph p = cell.addNewTextParagraph();
XSLFTextRun r = p.addNewTextRun();
r.setText("Cell " + (i*rownum + 1));
}
}
Ao trabalhar com tabelas, é importante lembrar que é possível personalizar a borda e o fundo de cada célula.
5. Alterando uma apresentação
Nem sempre ao trabalhar em uma apresentação de slides, precisamos criar uma nova, mas precisamos alterar uma já existente.
Vamos dar uma olhada naquele que criamos na seção anterior e então podemos começar a alterá-lo:
5.1. Ler uma apresentação
Ler uma apresentação é muito simples e pode ser feito usando o construtor sobrecarregadoXMLSlideShow que aceita umFileInputStream:
XMLSlideShow ppt = new XMLSlideShow(
new FileInputStream("slideshow.pptx"));
5.2. Alterando a ordem dos slides
Ao adicionar slides à nossa apresentação, é uma boa ideia colocá-los na ordem correta para ter um fluxo adequado de slides.
Quando isso não acontece, é possível reorganizar a ordem dos slides. Vamos ver como podemos mover o quarto slide para o segundo:
List slides = ppt.getSlides();
XSLFSlide slide = slides.get(3);
ppt.setSlideOrder(slide, 1);
5.3. Excluindo um slide
Também é possível excluir um slide de uma apresentação.
Vamos ver como podemos excluir o 4º slide:
ppt.removeSlide(3);
6. Conclusão
Este rápido tutorial ilustrou como usar a APIApache POI para ler e gravar arquivos PowerPoint de uma perspectiva Java.
O código-fonte completo deste artigo pode ser encontrado, como sempre,over on GitHub.