Запись изображения в pdf-файл на java

Я пишу код для преобразования слайдов Microsoft power-point(ppt) в изображения и записи сгенерированных изображений в pdf-файл. Следующий код генерирует и записывает изображения в pdf-файл, но проблема, с которой я сталкиваюсь, заключается в том, что когда я пишу изображение в pdf-файл, его размер превышает размер страницы pdf, и я могу просматривать только 75% остальных изображений невидимо. Еще одна вещь, чтобы заметить здесь, написанные изображения в pdf-файле выглядят как увеличенные или расширенные. Взгляните на следующий фрагмент код:

for (int i = 0; i < slide.length; i++) {
    BufferedImage img = new BufferedImage(pgsize.width, pgsize.height,   BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics = img.createGraphics();
    graphics.setPaint(Color.white);
    graphics.fill(new Rectangle(0, 0, pgsize.width, pgsize.height));
    slide[i].draw(graphics);
    fileName="C:/DATASTORE/slide-"+(i+1)+".png";
    FileOutputStream out = new FileOutputStream(fileName);
    javax.imageio.ImageIO.write(img, "png", out);
out.flush();
out.close();
com.lowagie.text.Image image =com.lowagie.text.Image.getInstance(fileName);
            image.setWidthPercentage(40.0f);
    doc.add((image));
    }

doc.close();
} catch(DocumentException de) {
          System.err.println(de.getMessage());
    }

Если кто-нибудь знает решение, Пожалуйста, помогите мне исправить. Спасибо.

вот код, который он выполняет задачу, которую я хотел. Теперь я получаю желаемые результаты после выполнения рекомендаций Бруно Ловаги.

но, как ранее отметил Бруно Ловаги, их проблема в сгенерированном png-изображении. Сгенерированное изображение png неверно, потому что форма или изображение на слайде перекрываются с текстами слайда. Вы можете помочь мне идентифицировать и исправить ошибку?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import com.itextpdf.text.Image;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
public class ConvertSlidesIntoImages {
    public static void main(String[] args){
    try {
        FileInputStream is = new FileInputStream("C:/DATASTORE/testPPT.ppt");
        SlideShow ppt = new SlideShow(is);
        is.close();
        String fileName;
        Dimension pgsize = ppt.getPageSize();
        Slide[] slide = ppt.getSlides();
        Document doc=new Document();
        PdfWriter.getInstance(doc, new  FileOutputStream("c:/DATASTORE/convertPPTSlidesIntoPDFImages.pdf"));
        doc.open();

        for (int i = 0; i < slide.length; i++) {
            BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = img.createGraphics();
            graphics.setPaint(Color.white);
            graphics.fill(new Rectangle(0, 0, pgsize.width, pgsize.height));
            slide[i].draw(graphics);
            fileName="C:/DATASTORE/slide-"+(i+1)+".png";
            FileOutputStream out = new FileOutputStream(fileName);
            javax.imageio.ImageIO.write(img, "png", out);
            out.flush();
            out.close();
            com.itextpdf.text.Image image =com.itextpdf.text.Image.getInstance(fileName);
            doc.setPageSize(new com.itextpdf.text.Rectangle(image.getScaledWidth(), image.getScaledHeight()));
            doc.newPage();
            image.setAbsolutePosition(0, 0);
            doc.add(image);
            }
    doc.close();
}catch(DocumentException de) {
    System.err.println(de.getMessage());
    }
    catch(Exception ex) {
    ex.printStackTrace();
    }
}

спасибо

1 ответов


первый это: если png хранится как "C:/DATASTORE/slide-"+(i+1)+".png" неверно, слайд в PDF также не будет правильным.

и так: ваш фрагмент кода не показывает нам, как вы создаете ответ: есть два способа решить эту проблему.

либо вы изменение размера изображения (не С setWidthPercentage() если вы рассчитали фактический процент), и вы добавляете его в позицию (0, 0), чтобы она не учитывала маржу. Например:

image.scaleToFit(595, 842);
image.setAbsolutePosition(0, 0);
doc.add(image);
doc.newPage();

лучшим решением было бы адаптировать размер страницы к размеру изображения.

Document doc = new Document(new Rectangle(image.getScaledWidth(), image.getScaledHeight()));
// create a writer, open the document
image.setAbsolutePosition(0, 0);
doc.add(image);
doc.newPage();

если размер изображений варьируется, вы можете изменить размер страницы при добавлении изображений, таких как это:

doc.setPageSize(new Rectangle(image.getScaledWidth(), image.getScaledHeight()));
doc.newPage();
image.setAbsolutePosition(0, 0);
doc.add(image);

важно понимать, что новый размер страницы вступят в силу только после doc.newPage();

нюанс 1: Если ваш PDF содержит только последний слайд, вы, вероятно, помещаете все слайды на одну страницу, и последний слайд охватывает их все. Вам нужно вызвать newPage() метод каждый раз, когда вы добавляете изображение (как это сделано в фрагменте кода в моем ответе).

нюанс 2: Ваше утверждение неверно. Согласно документам API, существует метод setPageSize(Rectangle rect), может быть, вы используете неправильный Rectangle класса. Если вы не последовали моему совету (который ИМХО не был бы мудрым), вы, вероятно, ищете com.lowagie.text.Rectangle вместо java.awt.Rectangle.

нюанс 3: Это похоже на предостережение 2, действительно нет таких методов в классе java.awt.Image, но, как описано в документах API, класс com.itextpdf.text.Image есть getScaleWidth() метод и a getScaledHeight() метод.