gpt4 book ai didi

java - 使用 itext 将 jpg 图像写入 pdf 时读取 JPG 异常时出现过早的 EOF

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:19 34 4
gpt4 key购买 nike

我正在尝试将 jpg 图像插入 PDF。一些 jpg 图像可以正常工作,但在某些情况下我会遇到以下异常。

java.io.IOException: Premature EOF while reading JPG.
at com.itextpdf.text.Jpeg.processParameters(Jpeg.java:218)
at com.itextpdf.text.Jpeg.<init>(Jpeg.java:117)
at com.itextpdf.text.Image.getInstance(Image.java:279)
at com.itextpdf.text.Image.getInstance(Image.java:241)
at com.itextpdf.text.Image.getInstance(Image.java:364)

下面是我使用的代码。

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class ImagesNextToEachOther {

public static final String DEST = "/home/Documents/pdftest/hello.pdf";

public static final String IMG1 = "/home/Documents/pdftest/2.jpg";

public static void main(String[] args) throws IOException,
DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ImagesNextToEachOther().createPdf(DEST);
}

public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);
table.addCell(createImageCell(IMG1));
document.add(table);
document.close();
}

public static PdfPCell createImageCell(String path) throws DocumentException, IOException {
Image img = Image.getInstance(path);
PdfPCell cell = new PdfPCell(img, true);
return cell;
}
}

我在上面代码中的以下行中遇到错误。

Image img = Image.getInstance(path);

path 是图像的完整路径。

我在 SO 上发现了类似的问题

Premature EOF while reading JPG using itext

Failure to read JPEG file from byte[]

但这并没有解决我的问题。

这是其中一张图片的链接

https://dl.dropboxusercontent.com/u/46349359/image.jpg

最佳答案

正如 Amedee 在他的评论中所解释的那样,JPG 已损坏。您可以通过打开 GIMP 中的图像自行检查。然后选择 File > Overwrite image.jpg,GIMP 将修复图像,EOF 错误将消失。

我已经为你做了这件事,结果是:

enter image description here

如果您下载此图像,并将其与您的代码一起使用,则不会发生错误。

这对我有什么帮助?您可能会问。 我可以在浏览器中看到图像。我可以在图像查看器中看到图像。你为什么不在 iText 中解决这个问题?

答案很简单:PDF 原生支持 JPG,这意味着我们可以将所有 JPG 图像字节的精确副本放入 PDF 中。然而,在我们这样做之前,iText 会对图像执行健全性检查。当此完整性检查失败时,iText 将(并且应该)拒绝该图像,因为如果我们使用它,包含此类“损坏”图像的 PDF 很有可能会显示错误消息。

图像查看器或图像编辑工具(如 GIMP)的容忍度更高。他们忽略了图像格式不正确的事实。对于 GIMP,该工具会修复错误,并让您有机会“覆盖”图像以存储修复。

目前没有让 iText 执行此类修复的计划。我们已经为损坏的 TIFF 文件提供了这样的修复程序,但即便如此,默认设置仍会拒绝损坏的图像。如果您希望 iText 修复损坏的 TIFF 文件,您必须设置一个标志,因为我们的大多数客户更愿意获得异常(exception),而不是冒险添加自动修复的图像。如果您是 iText 客户,请随时发布支持请求以获得与 iText 类似的“损坏图像修复”功能;如果您不是 iText 客户,请自行添加此修复程序,并根据 AGPL 发布该修复程序以及您项目的其余代码(如您所知,iText 的 AGPL 强制执行在大多数情况下,您可以发布项目的完整源代码)。

关于java - 使用 itext 将 jpg 图像写入 pdf 时读取 JPG 异常时出现过早的 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689795/

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