我有一个应用程序,需要检索一些数据(签名人姓名)从数字签名“附加”的PDF文件。
我只在Java和C#中找到使用iText类AcroFields方法GetSignatureNames的示例
**edit:**我尝试了 pdftk 和dump_data_fields以及generate_fpdf,结果是(不幸的是):
/Fields [
<<
/V /dftk.com.lowagie.text.pdf.PdfDictionary@3048918
/T (Signature1)
>>]
和
FieldType: Signature
FieldName: Signature1
FieldFlags: 0
FieldJustification: Left
提前致谢!
4条答案
按热度按时间kmb7vmvb1#
好吧,这是复杂的(我会说甚至是不可能的,但谁知道呢),以实现这只与PHP。
首先,请阅读article about digital signature in Adobe PDF
第二,在阅读完本文后,您将知道签名根据/ByteRange[a b c d]指示符存储在b和c字节之间
第三,我们可以从文档中提取B和c,然后提取签名本身(指南说它将是十六进制解码的PKCS7#对象)。
第四,在第三步之后,我们在文件signature.pkcs7中有PKCS#7对象。不幸的是,我不知道使用PHP从签名中提取信息的方法。所以你必须能够运行shell命令才能使用openssl
在文件info.txt中运行此命令后,您将拥有一系列证书。最后一个是您需要的证书。您可以查看文件的结构并解析所需的数据。
另请参考this question、this question和this topic
编辑于2017-10-09我故意建议您查看exactly this question有一个代码,您可以根据需要进行调整。
我已经帮你调整好了,剩下的请你自己做。
yi0zb3m42#
这是我在PHP7中的工作代码:
kmynzznz3#
类似于@Denis Alimov提出的solution,但只使用PHP函数(而不是**openssl**命令),并且没有Composer依赖项:
对于一些
test1.pdf
,只有一个人签名(我们称她为ALICE
),这个脚本应该返回:对于一些由两个人签名的
test2.pdf
(我们称之为BOB
和CAROL
),此脚本应返回:想了解更多信息,看看我的这个问题:
bakd9h0s4#
我使用过iText,发现它非常可靠,我强烈推荐它。你可以随时从PHP中调用Java代码作为“微服务”。