【问题标题】:PNG image is getting corrupted in Itext7PNG图像在Itext7中被损坏
【发布时间】:2020-04-02 11:38:44
【问题描述】:
import static com.itextpdf.kernel.xmp.XMPUtils.decodeBase64;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;

public  void testPngImage() throws XMPException {
    String orignalImage =  https://gist.github.com/nil96/d9d54200e5329211d2d7455492716500;
    String base64Image = orignalImage.replaceFirst("data:image/png;base64,","");
    byte[] decodedBytes = decodeBase64(base64Image);
    ImageData imageData = ImageDataFactory.create(decodedBytes,true);
    imageData.getData();
}

当我打印 imageData.getData() 时,我得到的字节数组仅包含 -1。而预期的 png 字节数组应该以 {-119, 80, 78, 71} 开头。这只发生在 PNG 图像上。我可以成功创建 jpeg 图像。我在 gist https://gist.github.com/nil96/d9d54200e5329211d2d7455492716500 中附上了 png

我是在初始化 Image 时遗漏了一些东西还是一个错误?

依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.0.7</version>
    <!--<version>7.1.8</version>-->
    <type>pom</type>
</dependency>

【问题讨论】:

  • 根据 itext7 的文档。 PDF 不支持 PNG,这就是 iText 还将 PNG 图像解码为 rw 图像的原因。所以我们需要使用函数 ImageDataFactory.createRawImage(decodedBytes); 将其读取为原始图像;

标签: java image itext7


【解决方案1】:

您似乎误解了imageData.getData() 返回的数据格式。你说

预期的 png 字节数组应以 {-119, 80, 78, 71} 开头;

imageData 不再包含 PNG,它包含原始 PDF 位图图像格式的数据。

您还声称,您非常肤浅地检查了imageData.getData()返回的那些数据

当我打印 imageData.getData() 时,我得到仅包含 -1 的字节数组

这是错误的:它确实包含很多 -1 条目,但也包含一些其他字节值:

  • 255898次-1
  • 12838次-2
  • 3126次-3

等等等等

这实际上并不令人惊讶,毕竟你的图像几乎是纯白色的,上面有一点涂鸦:

主要的白色(RGB:255、255、255)和接近白色(RGB 值略小于 255)是许多 -1(或无符号字节:255)、'-2' 的原因/ '254', -3 / 253, ... 值,而 scribble 引入了几个(无符号)较小的字节。

我是在初始化 Image 时遗漏了一些东西还是一个错误?

首先,它不是 iText 错误,而是预期的结果。

问题是您要如何处理那些仅用于在压缩后嵌入 PDF 的图像数据。因此,通常 iText 用户不会自己在这里调用getData(),而是从图像数据中创建一个 iText 图像对象并将其添加到 PDF:

ImageData data = ImageDataFactory.create(...);
Image img = new Image(data);

然后

Document document = ...;
document.add(img);

Canvas canvas = ...;
canvas.add(img);

甚至

PdfCanvas pdfCanvas = ...;
pdfCanvas.addImage(data, ...);

iText 在后台处理实际的图像数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 2021-02-06
    • 2016-05-24
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多