共计 3110 个字符,预计需要花费 8 分钟才能阅读完成。
最近几个月干了不少 PDF 相干的活,趁着这两天不忙,记录一下相干的知识点。
PDF是 Portable Document Format 的简称,翻译过去是“可携带文档格局”,由 Adobe于 1992 年创立。其格局特点是,与操作系统平台无关,在任意平台上都能够放弃雷同的渲染成果。
至于这个平台无关嘛……倒不如说是格局简略,各平台都遵循同一规范,再加上规范的公开,天然就做到了平台无关性。
发展史
PDF 从创立之后,始终是 Adobe 公司的专有格局,直到 2008 年,才成为正式的 ISO(ISO 32000)规范。
尽管 PDF 文件曾经成为了规范,但 Adobe 作为 PDF 的鼻祖,还是弄了些公有的性能,比方 XFA(Adobe PDF 表单),这玩意就不属于 ISO 32000 PDF 规范。
国产格局 – OFD
和 PDF 相似的,还有 OFD(Open Fixed-layout Documents)格局,算是“国产 PDF”规范,由中国国家标准化治理委员会于 2016 年正式公布。
和 PDF 格局相比,OFD 格局更简略,更易于实现,而且反对国密,不过目前应用的很少。
字体
常见的 Office 格局里,字体 默认都是非内嵌的,非内嵌字体能够防止反复存储雷同的字体,只须要渲染设施上装置对应字体就行;但劣势也很显著,如果客户设施上没有对应的字体,就会导致无奈渲染,应用代替字体的话,又会影响渲染成果。
而 PDF 在字体的解决上和 Office 有所不同,PDF 默认应用 内嵌字体 的形式,而且还是内嵌字体的子集 – 只把文件中应用的字符字体给嵌入到 PDF 文件中,并不会将整个字体库嵌入。这样一来,即时内嵌了字体,也不会过多的减少文件大小。
字体加密
某些文档为了数据安全,提供 PDF 格局的材料供查阅,但又不想让用户随便复制文字。
此时 PDF 内嵌字体的益处就体现进去了,基于字体混同 & 加密技术,让以后 PDF 应用混同 & 加密后的字体库。这样就算公开提供了 PDF 文件,客户复制后的文字也是混同后的,也算保障了数据安全。
不过当初 OCR 这么弱小,混同字体后,依然能够通过 OCR 的伎俩去辨认,只是须要多破费一些精力而已。
电子签名 & 数字签名
电子签名 – Electronic Signature
美国《寰球和国家商业电子签名法》(2000 年)将“电子签名”定义为“附在合同上或通过电子形式生成,发送,传播,接管或存储的其余记录或与之逻辑关联的电子声音,符号或过程。”
实际上,电子签名只是将手写签名的图片,附在电子文档上,而后配合一些多因素身份验形式(PIN/ 明码 / 邮箱)证来实现。
数字签名 – Digital Signature
数字签名和电子签名不同,数字签名须要配合 PKI 认证核心(CA)颁发的数字证书实现,根本玩法是这样:
- 对内容应用摘要算法(如 MD/SHA 等)生成摘要
- 应用非对称加密算法 + 证书私钥对摘要进行加密
- 将加密的摘要数据,和签名的证书(公钥局部)附在 PDF 文件中
从下面的步骤能够看出,PDF 数字签名和 SSL 加密并不一样,PDF 实质上是对文件“签名”,能够保障文件签名者的身份,保障不可篡改,而 SSL 是对报文进行加密。
下图是非对称加密算法下,加密和数字签名的区别:
总结一下,非对称加密算法的支流利用就两种:公钥加密 -> 私钥解密,私钥加密 -> 公钥验签。
PDF 数字签名还有个非凡的玩法,能够将数字签名信息和图片进行“绑定”,比方电子发票里的签章(Stamp)图片,这个图片能够作为数字签名的外观(Appearance)。
如果不应用外观,只进行数字签名当然也是能够的。不过记住一点:有签章图片不肯定有数字签名,有数字签名也不肯定有签章图片,这俩不是一个货色。
其实不止是 PDF 文件才能够数字签名,微软家的 Office 套件也是反对数字签名的,但个别没人会对 Office 格局的文件签名,所以市面上能见到的都是对 PDF 数字签名。
签名验证
PDF 签名验证的原理也很简略:
验证 PDF 的签名证书是否受信
- 应用客户端根证书库(比方 Adobe PDF,会应用内置的根证书列表,和操作系统无关),验证签名证书是否受信
通过证书的公钥,对签名后的摘要数据进行验签。
证书 & 签名算法
PDF 数字签名所应用的证书类型,和 SSL 是不一样的。一般 SSL 的证书验证域名所有者就能够了,而 PDF 数字签名所应用的证书个别称为机构证书,没有域名的概念,但会严格的验证企业信息,如营业许可证等等。
目前支流的数字证书非对称加密算法有 RSA/DSA/DSS,但利用最广的还是 RSA 算法,不过随着国产化的趋势,金融保险等行业缓缓的迁徙到国密算法了。
不过算法不重要,都是非对称加密,都是数字证书,只是具体签名 / 验签 / 加密 / 解密的算法不同而已。
表单域 – Acro Form
表单域就是指 PDF 表单,英文定义叫 Acro Form。是的你没看错,PDF 也有和 HTML 相似的表单技术,表单里能够配置文本域、单选框、复选框等元素:
编辑好了 PDF 表单之后,就能够通过工具或程序,对 PDF 进行填充或者填写了。
PDF 库(JAVA)
PDF 技术还是比拟关闭的,开源库用起来会十分不爽,如果企业商用的话,尽量还是思考买商业 SDK,功能丰富,文档欠缺,花钱买工夫。
开源 & 收费
- Itext – 4.x 版本以下收费,5 以上的版本开源许可为 AGPL,商用须要付费
- Openpdf – 基于 itext 2.x 版本修复,还是 Itext
- pdfbox – Apache 下开源的 PDF 库,尽管收费,但性能远不如 Itext,不举荐应用。
还有一些更小众的 PDF 库,这里就不举荐了。目前应用最多的是 itext,pdfbox 尽管齐全开源收费,但性能和文档丰盛水平远不迭 itext。
商业
- Itext 7 – 有 JAVA 和 C# 两个版本,性能全,文档欠缺,根本能满足你对 PDF 的所有要求。
- Aspose.PDF – 提供了多语言的 SDK,功能强大,文档也比拟丰盛
- Spire.PDF – 提供了多语言的 SDK,功能强大,文档也比拟丰盛,而且不只是 PDF,还反对 Office 全家桶,在国内也有经销商
- Adobe PDF Library SDK – Adobe 自家的 PDF SDK,性能必定是最全的,反对多语言
Datalogics PDF Java Toolkit – Datalogics 是 Adobe PDF Library 的代理商,同时本人也提供了另一个版本的 PDF SDK
PDF 工具
PDF 工具市面上一大堆,上面列出一些支流的功能完善的 GUI 工具(浏览、编辑、转换、签名):
- Adobe Acrobat– PDF 的鼻祖,最强 PDF 工具,没有之一
- 福昕 – 国产老牌 PDF 软件
- 万兴 PDF
- 迅捷办公
small pdf – 良心的 PDF 在线工具网站,编辑、转换等性能都有,兼容性也很好,而且每天有肯定收费配额
参考
- https://www.wikiwand.com/zh/%E5%8F%AF%E7%A7%BB%E6%A4%8D%E6%96%87%E6%A1%A3%E6%A0%BC%E5%BC%8F
- https://www.ssl.com/zh-CN/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D%E5%92%8C%E6%96%87%E4%BB%B6%E7%AD%BE%E5%90%8D/
- https://www.wosign.com/FAQ/faq_2019070401.htm
- http://gmssl.org/
- https://itextpdf.com/sites/default/files/2018-12/digitalsignatures20130304.pdf