java - PNG 图像在 Itext7 中被损坏

标签 java image itext7

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 图像。我已在要点 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>

最佳答案

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

expected png byte array should start with {-119, 80, 78, 71};

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

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

when I print imageData.getData() I get byte array containing -1 only

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

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

等等等等

这实际上并不奇怪,毕竟你的图像几乎是纯白色的,上面有一些涂鸦:

the image

主要白色(RGB:255、255、255)和近白色(RGB 值略小于 255)是出现许多 -1 的原因(或作为无符号字节: 255), '-2'/'254', -3/253, ... 涂鸦时引入的值(无符号)较小的字节。

Am I missing something for initializing Image or is it a bug?

首先,这不是 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 在幕后处理实际的图像数据。

关于java - PNG 图像在 Itext7 中被损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60990686/

相关文章:

java - 在 json 输出中获取对象时遇到问题

java - Android 应用程序中的二维码扫描仪

python - 将图像添加到 Turtle Screen

java - Bengli 文本上的 iText7 排版 IndexOutOfBoundsException

itext7 - itext 7 在单独页面的顶部添加多个图像

java - 使用 iText 7 创建带有表单字段的 PDF/A-3 会导致 PdfAConformanceException

Java继承编译

java - OpenGL gl3 中如何处理不同数量的顶点?

image - Img 源将 prop 传递给子组件 Vue Js

c++ - 改变图像的亮度和对比度