Java GIF图像仅部分显示

Java GIF图像仅部分显示,java,gif,javax.imageio,openhtmltopdf,Java,Gif,Javax.imageio,Openhtmltopdf,我在Java中遇到了一个奇怪的GIF图像问题。XML API将图像作为Base64编码字符串提供。要解码Base64,我使用1.13版中的commons编解码器库 当我解码Base64字符串并将字节写入文件时,图像会在浏览器中正确显示,MS Paint没有其他测试 最终字符串base64Gif=[Base64由API提供]; 最后一个字节[]sigImg=Base64.decodeBase64base64Gif; 文件sigGif=new FileC:/Temp/pod_1Z12345E5991

我在Java中遇到了一个奇怪的GIF图像问题。XML API将图像作为Base64编码字符串提供。要解码Base64,我使用1.13版中的commons编解码器库

当我解码Base64字符串并将字节写入文件时,图像会在浏览器中正确显示,MS Paint没有其他测试

最终字符串base64Gif=[Base64由API提供]; 最后一个字节[]sigImg=Base64.decodeBase64base64Gif; 文件sigGif=new FileC:/Temp/pod_1Z12345E5991872040.org.gif; 尝试FileOutputStream fos=新建FileOutputStream{ fos.writesigm; fos.flush; } 在MS Paint中打开的结果文件:

但是,当我现在开始使用Java来使用这个文件时,例如,使用openhtmltopdf库从HTML创建PDF文档时,它已经损坏并且不能正确显示

最终字符串htmletterstr=[API提供的HTML]; 最终文件doc=Jsoup.parsehtmletterstr; 尝试FileOutputStream fos=newfileOutputStreamnew FileC:/Temp/letter_1Z12345E5991872040.pdf{ PDFrenderBuilder=新PDFrenderBuilder; builder.useFastMode; builder.WithW3CDocument新建W3CDom.fromJsoupdoc,file:///C:/Temp/; builder.toStreamfos; builder.useDefaultPageSize210297,baseRenderBuilder.PageSizeUnits.MM; builder.run; fos.flush; } 现在打开生成的PDF时,上面创建的图像如下所示。似乎只打印了第一个像素行,缺少某个层,或者类似的东西

如果我用ImageIO再次读取图像并尝试将其转换为PNG,也会发生同样的情况。生成的PNG看起来与PDF文档中打印的图像完全相同

如何使图像在PDF文档中正确显示

编辑:
API提供的原始GIF Base64链接:

正如@haraldK在评论中指出的,通过XML API提供的GIF文件不符合GIF标准,因此无法由Java的ImageIO API解析

由于似乎不存在修复文件的纯Java工具,我现在想到的解决方法是通过Java的Process API使用ImageMagick。使用-coalesce选项调用convert命令将解析损坏的GIF并创建一个符合GIF标准的新GIF

//解码损坏的GIF图像并写入磁盘 最终字符串base64Gif=[Base64由API提供]; 最后一个字节[]sigImg=Base64.decodeBase64base64Gif; Path gifPath=Path.getC:/Temp/pod_1Z12345E5991872040.tmp.gif; 如果Files.existsgifPath{ Files.createFilegifPath; } Files.writegifPath、sigImg、StandardOpenOption.WRITE、StandardOpenOption.TRUNCATE_现有; //在Linux上使用Java进程API调用ImageMagick您将使用“convert”二进制文件 ProcessBuilder procBuild=新的ProcessBuilder; procBuild.commandC:\\Program Files\\ImageMagick-7.0.9-Q16\\magick.exe,C:\\Temp\\pod_1Z12345E5991872040.tmp.gif,-coalesce,C:\\Temp\\pod_1Z12345E5991872040.gif; 进程proc=procBuild.start; //等待ImageMagick完成其工作 等待程序;
新创建的文件可以被Java的ImageIO API读取并按预期使用。

是这样的:您可以共享原始GIF吗?@haraldK I添加了指向API@JoopEggen不,它不是HTML API,而是XML API。因此它被提供为Base64.String-hereTLDR;你的GIF坏了。我所说的破碎,是指不符合规范,即使某些解码器可以读取它。如果我在阅读时添加一个警告侦听器,我会得到很多顺序错误的代码警告,这可能是由于我没有进一步调试LZW解码。您可能会幸运地使用其他软件/库,但内置的ImageIO GIF插件无法读取它。