我正在编写一个代码,将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());
}
如果有人知道解决方案,请帮我纠正。谢谢。
这是完成我希望的任务的代码。按照Bruno Lowagie的建议,我现在得到了理想的结果。
但是,正如Bruno Lowagie先前指出的那样,他们在生成的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();
}
}
谢谢
答案 0 :(得分:11)
首先:如果存储为"C:/DATASTORE/slide-"+(i+1)+".png"
的png不正确,PDF中的幻灯片也不正确。
这就是:您的代码段未向我们展示您如何创建Document
对象。默认情况下,页面大小为纵向A4。不言而喻,大于595 x 842的图像不适合该页面。
现在回答:有两种方法可以解决这个问题。
您可以更改图片的大小(不,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();
CAVEAT 1:
如果您的PDF仅包含最后一张幻灯片,则可能将所有幻灯片放在同一页面上,最后一张幻灯片将全部放在同一页面上。每次添加图像时都需要调用newPage()
方法(如我的答案中的代码片段所示)。
CAVEAT 2:
你的指控是错误的。根据API文档,有一种方法setPageSize(Rectangle rect)
,也许你使用了错误的Rectangle
类。如果你没有听从我的建议(恕我直言不明智),你可能正在寻找com.lowagie.text.Rectangle
而不是java.awt.Rectangle
。
CAVEAT 3:
这类似于CAVEAT 2,类java.awt.Image
中确实没有这样的方法,但是如API文档中所述,类com.itextpdf.text.Image
具有getScaleWidth()
方法和{{3方法。