gpt4 book ai didi

java - 在java中将图像写入pdf文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:53 27 4
gpt4 key购买 nike

我正在编写代码将 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();
}
}

谢谢

最佳答案

首先:如果存储为 "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();

之后生效

警告 1:如果您的 PDF 只包含最后一张幻灯片,您可能将所有幻灯片放在同一页上,而最后一张幻灯片覆盖了所有幻灯片。每次添加图像时都需要调用 newPage() 方法(正如我在回答中的代码片段中所做的那样)。

警告 2:你的指控是错误的。根据 API 文档,有一种方法 setPageSize(Rectangle rect) ,也许您使用了错误的 Rectangle 类。如果您没有听从我的建议(恕我直言,这并不明智),您可能正在寻找 com.lowagie.text.Rectangle 而不是 java.awt.Rectangle.

警告 3:这与 CAVEAT 2 类似,类 java.awt.Image 中确实没有此类方法,但正如 API 文档中所述,类 com.itextpdf.text.Image 有一个 getScaleWidth()方法和 getScaledHeight()方法。

关于java - 在java中将图像写入pdf文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16786026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com