Запись изображения в 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()
метод.