tips y trucos

Java: Convertir Presentación PowerPoint a PDF

En este tutorial aprenderás como convertir una presentación a PDF, ya sea un archivo de Microsoft PowerPoint a PDF o convertir una presentación de open office incluso con Java, agregando cada diapositiva como imagen al PDF. Espero te sea de utilidad.

Dependencias

Usaré mis dependencias con Maven configurando el archivo pom.xml agregando iText en la sección de dependencias:

<!--conversión de txt a pdf-->
<dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
</dependency>

Después dependiendo de si queremos usar Microsoft Power Point u open office elegimos la dependencia adecuada de poi.

Para el caso de Microsoft Power Point agregamos:

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.13</version>
</dependency>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.9</version>
</dependency>

Para convertir usando código de open office agregamos:

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.13</version>
</dependency>

Código de la Conversión de PowerPoint a PDF

package org.javapro.pdf.util;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * Created by Javatlacati on 14/12/2016.
 */public class PPTToPDF {
    public static void main(String[] args) {
        try {
            PPTToPDF.convertPPTToPDF("/miruta/mippt.pptx", "/miruta/mipps.pdf", ".pptx");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void convertPPTToPDF(String sourcepath, String destinationPath, String fileType) {
        double zoom = 2;
        AffineTransform at = new AffineTransform();
        at.setToScale(zoom, zoom);
        Document pdfDocument = new Document();
        byte[] barr = new byte[0];
        try (FileInputStream inputStream = new FileInputStream(sourcepath);
             ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, baos);
            PdfPTable table = new PdfPTable(1);
            pdfWriter.open();
            pdfDocument.open();
            Dimension pgsize = null;
            com.lowagie.text.Image slideImage = null;
            BufferedImage img = null;
            if (fileType.equalsIgnoreCase(".ppt")) {
                SlideShow ppt = new SlideShow(inputStream);
                pgsize = ppt.getPageSize();
                Slide slide[] = ppt.getSlides();
                pdfDocument.setPageSize(new com.lowagie.text.Rectangle((float) pgsize.getWidth(), (float) pgsize.getHeight()));
                pdfWriter.open();
                pdfDocument.open();
                for (int i = 0; i < slide.length; i++) {
                    img = new BufferedImage((int) Math.ceil(pgsize.width * zoom), (int) Math.ceil(pgsize.height * zoom), BufferedImage.TYPE_INT_RGB);
                    Graphics2D graphics = img.createGraphics();
                    graphics.setTransform(at);

                    graphics.setPaint(Color.white);
                    graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
                    slide[i].draw(graphics);
                    graphics.getPaint();
                    slideImage = com.lowagie.text.Image.getInstance(img, null);
                    table.addCell(new PdfPCell(slideImage, true));
                }
            }
            if (fileType.equalsIgnoreCase(".pptx")) {
                XMLSlideShow ppt = new XMLSlideShow(inputStream);
                pgsize = ppt.getPageSize();
                java.util.List<org.apache.poi.xslf.usermodel.XSLFSlide> slide = ppt.getSlides();
                pdfDocument.setPageSize(new com.lowagie.text.Rectangle((float) pgsize.getWidth(), (float) pgsize.getHeight()));
                pdfWriter.open();
                pdfDocument.open();
                for (XSLFSlide slid : slide) {
                    img = new BufferedImage((int) Math.ceil(pgsize.width * zoom), (int) Math.ceil(pgsize.height * zoom), BufferedImage.TYPE_INT_RGB);
                    Graphics2D graphics = img.createGraphics();
                    graphics.setTransform(at);

                    graphics.setPaint(Color.white);
                    graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
                    slid.draw(graphics);
                    graphics.getPaint();
                    slideImage = com.lowagie.text.Image.getInstance(img, null);
                    table.addCell(new PdfPCell(slideImage, true));
                }
            }
            pdfDocument.add(table);
            pdfDocument.close();
            barr = baos.toByteArray();
            pdfWriter.close();
            System.out.println("Powerpoint file converted to PDF successfully");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        try (FileOutputStream outputStream = new FileOutputStream(new File(destinationPath))) {
            outputStream.write(barr);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Como podrás apreciar, esta vez AWT ha hecho su magia, otro enfoque alternativo que podrías necesitar es el extraer el texto e ir agregando párrafo por párrafo, pero podrías experimentar pérdidas en el formato en tu conversión de powerpoint a PDF.

Nota: itext es de paga si lo usas para proyectos comerciales.

Tal vez también te interese como convertir de cadena a PDF

javatlacati

Entradas recientes

Cursos de Código Facilito

Te comparto aquí mis recomendaciones de cursos de Código Facilito. Codigofacilito.com es una plataforma virtual…

2 meses hace

Cursos de LinkedIn Learning

Te comparto aquí mis recomendaciones de cursos de Linkedin Learning. LinkedIn Learning es una plataforma…

4 meses hace

Mockito: Snippets de código

Estos snippets de código para entrevista acerca de mockito espero te sean de mucha utilidad.…

4 meses hace

Expresiones regulares en Java: analizar un String

En este tutorial aprenderá a usar expresiones regulares en Java de manera práctica para contar…

4 meses hace

Preguntas para entrevista de programación Java full-stack

¿Entrevista de programación Java fullstack? No te preocupes, te tengo un compendio de preguntas de…

5 meses hace

SoftSkills: cursos de Udemy

Te recomiendo algunos cursos de Udemy para mejorar tus softskills y así mejorar en tu…

5 meses hace