我想使用Ruby on Rails数次签名(两次就可以了)PDF。
我尝试过使用Origami Gem,它非常适合单个签名(感谢MrWater提供的非常有用的帖子:Insert digital signature into existing pdf file)
但是,我无法签署两次文件。当我这样做时,使用相同的方法,我的pdf文件显示签名错误(签名无效)。
您是否知道如何使用Origami或任何其他Ruby Gem来完成这项工作?
提前感谢您的帮助。
2015-10-25更新:
您将在下面找到我的代码来签署文档(也许它可以帮助找到问题的解决方案,至少它会向您展示如何制作单个签名,这非常合适)。评论是我未能尝试双重签名。我还尝试第一次签署整个过程,并使用相同的过程第二次签名但没有任何成功:
PDF_ORI = "contrat_old.pdf"
PDF_NEW = "contrat_new.pdf"
pdf = Origami::PDF.read(PDF_ORI)
# Open certificate files
key = OpenSSL::PKey::RSA.new 2048
cert = OpenSSL::X509::Certificate.new
cert.version = 2
cert.serial = 0
cert.not_before = Time.now
cert.not_after = Time.now + 10 * 365 * 24 * 60 * 60 # 10 years validity
cert.public_key = key.public_key
cert.issuer = OpenSSL::X509::Name.parse('CN=Test')
cert.subject = OpenSSL::X509::Name.parse('CN=test1 ESSAI1')
# Open certificate files
#key2 = OpenSSL::PKey::RSA.new 2048
#cert2 = OpenSSL::X509::Certificate.new
#cert2.version = 2
#cert2.serial = 0
#cert2.not_before = Time.now
#cert2.not_after = Time.now + 10 * 365 * 24 * 60 * 60 # 10 years validity
#cert2.public_key = key2.public_key
#cert2.issuer = OpenSSL::X509::Name.parse('CN=Test2')
#cert2.subject = OpenSSL::X509::Name.parse('CN=test2 ESSAI2')
sigannot = Origami::Annotation::Widget::Signature.new
sigannot.Rect = Origami::Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0]
pdf.get_page(1).add_annot(sigannot)
#sigannot2 = Origami::Annotation::Widget::Signature.new
#sigannot2.Rect = Origami::Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0]
#pdf.get_page(1).add_annot(sigannot2)
# Sign the PDF with the specified keys
pdf.sign(cert, key,
:method => 'adbe.pkcs7.sha1',
:annotation => sigannot,
:location => "France",
:contact => "tmp@security.org",
:reason => "Proof of Concept"
)
# Sign the PDF with the specified keys
#pdf.sign(cert2, key2,
# :method => 'adbe.pkcs7.sha1',
# :annotation => sigannot2,
# :location => "France",
# :contact => "tmp@security.org",
# :reason => "Proof of Concept"
#)
# Save the resulting file
pdf.save(PDF_NEW)
我知道这很棘手,但没有人可以帮助我? 或者使用其他解决方案?
答案 0 :(得分:1)
您可以使用CombinePDF
为PDF添加水印我过去使用它并且效果很好:
要向现有PDF页面添加内容,请先从现有PDF文件导入新内容。之后,将内容添加到现有PDF中的每个页面。
在此示例中,我们将为每个页面添加公司徽标:
company_logo = CombinePDF.load("company_logo.pdf").pages[0]
pdf = CombinePDF.load "content_file.pdf"
pdf.pages.each {|page| page << company_logo}
# notice the << operator is on a page and not a PDF object.
pdf.save "content_with_logo.pdf"
注意&lt;&lt;运算符在页面上而不是PDF对象。 &lt;&lt;&lt;运算符在PDF对象和页面上的行为方式不同。
&lt;&lt;运算符默认通过重命名引用来保护注入,以避免冲突。对于使用可能无法编辑的压缩数据覆盖页面(由于有限的过滤器支持),您可以使用:
pdf.pages(nil, false).each {|page| page << stamp_page}
您可以在此处查看更多详细信息: