Apache Poi слайд-шоу в PDF преобразование - PullRequest
3 голосов
/ 30 сентября 2011

Есть ли способ конвертировать сгенерированный. ppt файл с использованием apache poi в. pdf файл?

             OR

Любой способ конвертировать PPT файл в PDF файл с использованием JAVA?

Ответы [ 2 ]

6 голосов
/ 03 декабря 2012

Гаграварр, спасибо за ваш комментарий со следующим подходом: PPT -> images -> PDF.Он дал мне подсказки для дальнейших решений.

Недавно я столкнулся с той же задачей: преобразовать отчеты PPT в отчеты PDF с использованием средств Java.Отчеты PPT создаются с помощью библиотеки Apache POI, и я намеревался повторно использовать уже созданную структуру PPT.

Я разработал два решения, каждое из которых имеет свои преимущества / недостатки.И оба они используют библиотеку iText с версией 2.1.7. (Которая бесплатна и отлична).Оба они поддерживают японские символы после дополнительного улучшения.

1. Apache POI Slide -> изображение -> PDF

Пример кода демонстрации:

package com.test.pdf;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfWriter;

public class PPTtoImageToPDFexample {


    public static void main(String[] args) throws IOException, DocumentException {

        //load any ppt file
        FileInputStream inputStream = new FileInputStream("d:/temp/initialPPT.ppt");
        SlideShow ppt = new SlideShow(inputStream);
        inputStream.close();
        Dimension pgsize = ppt.getPageSize();

        //take first slide and save it as an image
        Slide slide = ppt.getSlides()[0];
        BufferedImage img = new BufferedImage(pgsize.width, pgsize.height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = img.createGraphics();
        graphics.setPaint(Color.white);
        graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,
                pgsize.height));
        slide.draw(graphics);
        FileOutputStream out = new FileOutputStream("d:/temp/slideImage.png");
        javax.imageio.ImageIO.write(img, "png", out);
        out.close();


        //get saved slide-image and save it into pdf
        Image slideImage = Image.getInstance("d:/temp/slideImage.png");
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("d:/temp/PPTtoImageTest.pdf"));
        document.setPageSize(new Rectangle(slideImage.getWidth(), slideImage.getHeight()));
        document.open();
        slideImage.setAbsolutePosition(0, 0);
        document.add(slideImage);
        document.close();

    }
}

2. Этот подход работает на лету: возьмите Apache POI Slide -> получите от него экземпляр awt.Graphics2 -> передайте этот интерфейс движку рисования iText.

Пример кода демонстрации:

package com.test.pdf;

import java.awt.Dimension;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfGraphics2D;
import com.lowagie.text.pdf.PdfWriter;

public class PPTtoPDFdirectly {



    public static void main(String[] args) throws IOException, DocumentException {

        //load any ppt file
        FileInputStream inputStream = new FileInputStream("d:/temp/initialPPT.ppt");
        SlideShow ppt = new SlideShow(inputStream);
        inputStream.close();
        Dimension pgsize = ppt.getPageSize();


        //take first slide and draw it directly into PDF via awt.Graphics2D interface.
        Slide slide = ppt.getSlides()[0];

        Document document = new Document();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("d:/temp/PPTtoPDF.pdf"));
        document.setPageSize(new Rectangle((float)pgsize.getWidth(), (float) pgsize.getHeight()));
        document.open();

        PdfGraphics2D graphics = (PdfGraphics2D) pdfWriter.getDirectContent().createGraphics((float)pgsize.getWidth(), (float)pgsize.getHeight());
        slide.draw(graphics);
        graphics.dispose();

        document.close();

    }
}
4 голосов
/ 30 сентября 2011

Один из вариантов - использовать POI для преобразования каждого слайда в изображение , а затем использовать что-то вроде Apache PDFBox , чтобы поместить каждое изображение на свою собственную страницу PDF. Это должно хорошо работать для более простых файлов PPT, но код для рендеринга слайдов по-прежнему является WIP. Так что, если у вас очень сложный слайд, вы можете обнаружить, что некоторые биты отсутствуют / некорректны, отправляйте патчи, если вы исправите любой из этих пробелов!

В противном случае, другой вариант - использовать привязки Java для OpenOffice, и сделать это для вас

...