gpt4 book ai didi

java - iTextPdf 无法正确加载图像

转载 作者:行者123 更新时间:2023-12-02 04:46:18 24 4
gpt4 key购买 nike

嘿哟,我的这段代码有问题:

  private void createPDF(String[] url, String name) throws FileNotFoundException, DocumentException, IOException{
com.itextpdf.text.Document document = new com.itextpdf.text.Document();
FileOutputStream fos = new FileOutputStream(name);
PdfWriter writer = PdfWriter.getInstance(document, fos);
writer.open();
document.open();
document.setMargins(1, 0, 0, 0);
document.addTitle(name);
document.addSubject(name);
for (String url1 : url) {
Image i = Image.getInstance(new java.net.URL(url1));
i.scaleToFit(document.getPageSize());
document.add(i);
document.newPage();
writer.flush();
}
document.close();
writer.close();
}

图像采用 jpeg 格式,在服务器上,我通过 Maven 使用 iText-pdfa-5.5.5 和 iText-xtra-5.5.5。

问题是,有些图片显示不正确,就像被切成两半一样。我怎样才能防止这种情况发生?

到目前为止我尝试过的:

  • 您在上面看到的内容
  • 使用 ImageIO 预加载图像

两者的结果相同。

请帮助我。

<小时/>

好吧,我刚刚插入(下面是来自 Bruno Lowagies 代码的 getImage )

  BufferedImage read = ImageIO.read(new ByteArrayInputStream(getImage(new java.net.URL(url1))));
ImageIO.write(read, "jpeg", new File(url1.substring(url1.length()-8, url1.length())));
Image i = Image.getInstance(read, null);

我得到的文件没有完全下载,图片的底部似乎充满了#808080

最佳答案

iText 不会更改 JPG 图像的单个字节。它只是获取接收到的字节并将它们放入 PDF 中的流中,将 /Filter 定义为 /DCTDecode,因此导入 JPG 图像应该没有问题。

但是,查看您的代码,我发现您希望 Image 对象从 URL 加载文件:new java.net.URL(url1) 并且我记得有人遇到与您类似的问题,因为当 url1 不是文件时,从 URL 对象获取的 InputStream 并不总是被完全读取URL,而是网络上某些图像的 URL。

此问题是读取 InputStream 所固有的:Image 需要首先读取 InputStream 的前几个字节以确定图像类型,然后返回到 InputStream 的开头来读取完整图像。

要解决此问题,最好先将图像读入 byte[] 中,然后使用此 byte[] 作为 >图像构造函数。

类似这样的事情:

public byte[] getImage(URL url) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = url.openStream ();
byte[] b = new byte[4096];
int n;
while ( (n = is.read(b)) > -1 ) {
baos.write(b, 0, n);
}
return baos.toByteArray();
}

然后:

Image i = Image.getInstance(getImage(new java.net.URL(url1)));

我在没有测试的情况下编写了这些代码片段。请让我知道它们是否有效(或者如果我犯了一些拼写错误,请更新我的答案)。

关于java - iTextPdf 无法正确加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632741/

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