当前位置: 首页 > 后端技术 > Java

关于PDF的那些事儿

时间:2023-04-02 01:46:28 Java

最近几个月做了很多PDF相关的工作,这两天趁着不忙把相关的知识点记录下来。PDF是PortableDocumentFormat的缩写,译为“便携式文档格式”,由Adobe于1992年创建。其格式的特点是与操作系统平台无关,在任何平台上都能保持相同的渲染效果。平台。至于这个平台无关紧要……倒不如说格式简单,所有平台都遵循相同的标准,再加上标准的公开,自然是平台无关的。发展历程PDF自创建以来就是Adobe的专有格式,直到2008年才成为正式的ISO(ISO32000)标准。XFA(AdobePDFForm)等功能,不属于ISO32000PDF标准。国产格式——OFD与PDF类似,也有OFD(OpenFixed-layoutDocuments)格式,被视为“国产PDF”标准,2016年国家标准化管理委员会正式发布。与PDF格式,OFD格式更简单,更容易实现,支持国家机密,但目前很少使用。字体在常见的Office格式中,字体默认是非嵌入的。非嵌入字体可以避免相同字体的重复存储。你只需要在渲染设备上安装相应的字体即可;但缺点也很明显。如果客户端设备上没有相应的字体如果使用了该字体,将无法渲染。如果改用字体,会影响渲染效果。不过,PDF在字体处理上与Office有所不同。PDF默认使用嵌入字体,它也是嵌入字体的一个子集——只嵌入文件中使用的字符字体到PDF文件中,而不会嵌入整个字体库。这样即使嵌入了字体,也不会使文件体积增加太多。字体加密有些文档为了数据安全提供了PDF格式的数据,但不希望用户随意复制文字。这时候PDF内嵌字体的好处就体现出来了。基于字体混淆和加密技术,当前的PDF使用混淆和加密的字体库。这样即使公开提供PDF文件,客户复制的文本也会被混淆,也算是保证了数据安全。不过现在OCR这么强大,把字体混淆后,还是可以通过OCR的方式识别出来,只是稍微费点功夫。ElectronicSignatures&DigitalSignaturesElectronicSignatures-ElectronicSignatureUSA《全球和国家商业电子签名法》(2000)将“电子签名”定义为“附在合同上或通过电子方式或逻辑方式生成、发送、通信、接收或存储的其他记录”相关的电子声音、符号或过程。”实际上,电子签名只是将手写签名的图片附在电子文档上,然后用一些多重身份验证方法(PIN/密码/电子邮件)证书来完成。数字签名-DigitalSignature数字签名不同于电子签名。数字签名需要用PKI认证中心(CA)颁发的数字证书来实现。基本方法如下:使用摘要算法(如MD/SHA等)对内容生成摘要,使用非对称加密算法+证书私钥对摘要进行加密附上加密后的摘要数据和签名证书(公钥部分)到PDF文件。从以上步骤可以看出,PDF数字签名与SSL加密是不一样的。PDF的本质就是上面对文件进行“签名”,可以保证文件签名者的身份,保证不能被篡改,同时SSL对消息进行加密。下图是非对称加密算法下加密和数字签名的区别:总结一下,非对称加密算法的主流应用有两种:公钥加密->私钥解密,私钥加密->公钥验证.PDF数字签名还有一种特殊的方法,可以将数字签名信息和图片“绑定”起来,比如电子发票中的盖章图片,这张图片可以作为数字签名的外观(Appearance)。如果不使用外观,当然也可以只进行数字签名。但是记住一件事:有印章的图片不一定有数字签名,有数字签名的图片也不一定有印章的图片。这两个不是一回事。事实上,不仅仅是PDF文件可以进行数字签名。微软的Office套件也支持数字签名,但一般不会有人给Office格式的文件签名,所以市面上能看到的都是经过数字签名的PDF。签名验证的原理PDF签名验证也很简单:验证PDF的签名证书是否可信使用客户端根证书库(如AdobePDF,会使用内置的根证书列表,不管操作系统),通过证书公钥验证签名的摘要数据来验证签名证书是否可信。证书和签名算法用于PDF数字签名的证书类型与SSL不同。普通的SSL证书足以验证域名所有者,而PDF数字签名使用的证书一般称为机构证书,没有域名的概念,但会严格验证企业信息,如营业执照等.目前主流的数字证书非对称加密算法有RSA/DSA/DSS,但应用最广泛的还是RSA算法。但随着国产化的趋势,金融、保险等行业正在慢慢向国密算法迁移。不过,算法并不重要。都是非对称加密和数字证书,只是具体的签名/签名验证/加密/解密算法不同而已。表单域——AcroForm表单域是指PDF表单,英文定义称为AcroForm。是的,你没看错,PDF也有类似HTML的表单技术,可以配置文本域、单选框、复选框等元素:编辑完PDF表单后,可以使用工具或程序修改PDF填充或填写。PDF库(JAVA)PDF技术还是比较封闭的,开源的库用起来会很不爽。如果企业商业使用,尽量考虑购买商业SDK,功能丰富,文档齐全,花钱买时间。开源免费itext-4.x以下版本免费,5.x以上版本开源许可为AGPL,商业使用需付费免费,但功能更强大不如Itext,不推荐。还有一些比较小的PDF库,这里不推荐。目前使用最多的是itext。虽然pdfbox是完全开源免费的,但是其功能和文档远不如itext丰富。CommercialItext7-有JAVA和C#两个版本,功能齐全,文档齐全,基本可以满足你对PDF的所有要求。Aspose.PDF-提供多语言SDK,功能强大,文档丰富。Spire.PDF-提供多语言SDK,功能强大,文档丰富。它不仅支持PDF,还支持Office全家桶。还有resellerAdob??ePDFLibrarySDK-Adob??e自己的PDFSDK,绝对是最全面的,支持多种语言DatalogicsPDFJavaToolkit-Datalogics是AdobePDFLibrary的代理,也提供另外一个版本的PDFSDKPDF工具市场上有很多PDF工具。下面推荐几款功能齐全(阅读、编辑、转换、签名)的主流GUI工具:Adob??eAcrobat-PDF鼻祖,最强PDF工具,没有之一Foxit-国产老牌PDF软件WondersharePDFQuickOffice小pdf-a良心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%8Fhttps://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.htmhttp://gmssl.org/https://itextpdf.com/sites/default/files/2018-12/digitalsignatures20130304。PDF格式