问题

使用word等工具转换PDF文档签章的文件,使用WPS、Chrome 等均无法显示签章图片,但是使用最新的pdf.js 却可以显示图片。

分析

在使用word等工具转换PDF时,PDF可能会转换为混合模式。

特征是文档除了正常的trailer 还含有一个空的增量更新内容,这个增量没有任何内容,但是在trailer 中会含有XRefStm

例如:

如果使用itext7对这种类型文档使用增量更新模式签章进行签章,例如:

String src = "src/test/resources/helloworld.pdf";
PdfReader reader = new PdfReader(src);
String dest = "target/XrefStmTest-sign.pdf";
PdfSigner signer = new PdfSigner(reader, new FileOutputStream(dest), new StampingProperties().useAppendMode());signer.setFieldName("SIGN_FILE");
Rectangle rect = new Rectangle(0, 0, 0, 0);
ImageData imageData = ImageDataFactory.create(IMG);// 设置签章信息
signer.getSignatureAppearance().setPageRect(rect).setPageNumber(1);
// 图片添加的方式
Image image = new Image(imageData).scaleAbsolute(36, 36).setFixedPosition(1, 36, 648);
PdfDocument document = signer.getDocument();final PdfWriter writer = document.getWriter();
writer.setCompressionLevel(CompressionConstants.NO_COMPRESSION);
Document doc = new Document(document).add(image);
signer.signExternalContainer(new IExternalSignatureContainer() {@Overridepublic byte[] sign(InputStream data) throws GeneralSecurityException {byte[] b = new byte[1024];for (int i = 0; i < 1024; i++) {b[i] = (byte) 0xFF;}return b;}@Overridepublic void modifySigningDictionary(PdfDictionary signDic) {// 不做任何事}
}, 4096);

通过该种方式产生的文档增量更新部分将会使用全压缩的方式写入的文件,全压缩增量部分:

全压缩有如下操作:

  1. 压缩受到影响的非Stream类型对象的引用表。
  2. 压缩非Stream类型对象到 object stream中。

上面示例中的42 0 obj就是压缩的引用表(xRef) ,实际上该增量的/XRefStm 38413指向的正是42 0 obj

42 0 obj压缩的引用表中包含的引用来自于39 0 obj39 0 obj压缩过后的一系列PDF对象,从上图就可以看出来。

结论:

实际上混合模式和全压缩模式的文档是符合PDF标准的,但是在部分阅读器上支持不是特别好,所以导致了增量更新部分没有办法显示。

解决方案

通过看itext源码我们可以了解到,PDFDocument中的PdfWriter要是处于appendMode模式,那么只要检查到文件中含有XrefStm就会强制使用全压缩模式。

简单的解决方案,就是在PDFDocument#open 运行之后,重新设置writer.properties.isFullCompressionfalse表明不需要使用全压缩模式。

通过观察PdfSigner的实现我们可以使用继承的方式重写来hack这个writer.properties.isFullCompressionfalse

如下:

public class NoCompressionSigner extends PdfSigner {public NoCompressionSigner(PdfReader reader, OutputStream outputStream, StampingProperties properties) throws IOException {super(reader, outputStream, null, properties);}@Overrideprotected PdfDocument initDocument(PdfReader reader, PdfWriter writer, StampingProperties properties) {WriterProperties wp = new WriterProperties();writer = new PdfWriter(this.temporaryOS, wp);PdfDocument doc = super.initDocument(reader, writer, properties);// 强制不使用压缩模式wp.setFullCompressionMode(false);System.out.println(writer.isFullCompression());return doc;}
}

警告: 该种修改方式会导致 Linearized 类型PDF文档在增量更新之后,格式损坏!

linearized文档特征是文档开头有如下内容:

PDF 签章图片不显示问题相关推荐

  1. 使用Adobe Acrobat提取PDF签章图片

    1.Adobe Arcobat 打开带有签章的pdf文件 2.选择 工具>导出PDF,选择Microsoft Word,导出 3.打开导出的pdf文件,在签章图片上,选择另存图片

  2. java通过itext方法往pdf中插入图片(交互式pdf插入图片无法显示)

    本文参考自: 原文地址 一.:首先明确pdf的类型,在自己的开发过程中发现pdf也分几种类型. 我目前这里就指出常用两种: 一种是交互式pdf,他的组件可以读取,可以被编辑,比如liveCycle(A ...

  3. Markdown中图片转PDF之后图片不能显示的问题(已解决)

    本人是新手,初次使用Markdown,勿喷 我目前知道的两种在md文件中插入图片的两种方式为: (重点!!!一定要把md文件和图片放到同一个文件夹里面,不然加载不成功,网上好多文章都不写清楚,这对我这 ...

  4. linux pdf 转图片不显示,Linux下wkhtmltopdf网页转为图片或者PDF方法

    这里记录的是用一个php扩展来给网页截图, 但是今天编译,一直不通过, 于是又找到一个更方便的方法,记录一下! 首先 软件下载地址 https://wkhtmltopdf.org/downloads. ...

  5. IText导出PDF添加图片,解决中文问题

    利用IText导出PDF: 使用.ftl模板引入图片不显示,不报错,但是它找不到图片, .separator {margin: 15px;height: 16px;text-align: center ...

  6. Win10用Windows照片查看程序打开图片+更改注册表后导致Win10任务栏Adobe PDF阅读器图标显示异常

    Win10用Windows照片查看程序打开图片 解决办法: 参考:https://jingyan.baidu.com/article/455a9950bb20bda166277824.html 上述操 ...

  7. java itext html转PDF解决中文无法显示以及base64图片处理

    文章目录 一.添加maven依赖 二.处理中文不显示问题 三.处理HTML文件中Base64格式图片不显示问题 四.封装工具类 一.添加maven依赖 <dependency><gr ...

  8. java生成sm2证书_(转载)Java使用IText实现PDF签章

    前文讲到了如何使用Adobe的PDF工具软件进行电子印章应用.在实际应用中还有一种情形就是需要将电子印章功能集成在我们开发的系统里,这里就要用到一些PDF的二次开发库了.做过相关开发的同学应该知道常用 ...

  9. Java使用Itext5.5.10进行pdf签章

    原文地址 :   http://blog.csdn.net/liumengya007007/article/details/53129323 啰嗦 说到PDF数字签名签章,这个其实也是数字证书信息安全 ...

最新文章

  1. golang 生成 解析 json
  2. 一些小团队的自动化运维实践经验
  3. 更换group.id时kafka从哪开始消费
  4. WSAENOBUFS: No buffer space available in SAP
  5. php mysql 插入多条数据_雷林鹏分享:PHP MySQL 插入多条数据
  6. GameMaker Studio 中的组合技(Combo)设置
  7. 调整HashMap的大小:未来的危险
  8. Java import static静态导入
  9. 一台微型计算机的处理速度主要取决于,2017年答案计算机等级考试题库「附答案」...
  10. ubuntu 14 配置vsftp
  11. linux断点续传程序,Linux下怎么实现断点续传
  12. 手机如何测光照度_手机摄影,如何进行准确的测光?一篇文章教会你玩转“测光”...
  13. Android 插件化换肤 思路及实现
  14. Java消息队列--ActiveMQ 实战
  15. 智慧灯杆解决方案之智慧景区(园区)建设
  16. 卷积和反卷积输出的计算公式
  17. js中元素样式设置的六种方法
  18. [内网渗透]—GPO批量控制域内主机
  19. 【项目管理软件盛宴】谁才是人气王?
  20. 【IT】计算机体系结构

热门文章

  1. match against
  2. Ubuntu18.04开机自动挂载Nas硬盘
  3. 自动增益控制电路(AGC)
  4. chrome浏览器设置cookie失效
  5. 物流赛道加速内卷,安迅上市能否博得更大席位?
  6. 【笔记:模拟CMOS集成电路】两级运算放大器设计与仿真(带版图)
  7. android应用推广高招齐分享!力荐六大安卓应用推广方式
  8. Lucene 索引文件之tvdtvxtvm
  9. 如何用本地电脑部署一个网站
  10. 记一次小程序接口本地可访问,真机不能访问的问题