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
等等等等
这实际上并不奇怪,毕竟你的图像几乎是纯白色的,上面有一些涂鸦:
主要白色(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/