在java中将图像写入pdf文件

我正在编写一个代码,将Microsoft power-point(ppt)幻灯片转换为图像,并将生成的图像写入pdf文件。 以下代码生成并将图像写入pdf文件,但我面临的问题是,当我将图像写入pdf文件时,它的大小超过了pdf页面大小,我只能查看75%的图像rest是不可见的。 这里需要注意的另一件事是,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(); } } 

谢谢

首先:如果png存储为"C:/DATASTORE/slide-"+(i+1)+".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();之后doc.newPage();生效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()方法和一个getScaledHeight()方法。