ruby 使用Ruby进行快速而脏的PDF签名(使用Origami)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 使用Ruby进行快速而脏的PDF签名(使用Origami)相关的知识,希望对你有一定的参考价值。

#!/usr/bin/env ruby

require "openssl"
require "time"

begin
  require "origami"
rescue LoadError
  abort "origami not installed: gem install origami"
end
include Origami

CERT_FILE = "certificate.crt"
KEY_FILE = "private_key.pem"

input_files = ARGV

if input_files.empty?
  abort "Usage: sign-pdf input.pdf [...]"
end

key = OpenSSL::PKey::RSA.new(File.read(KEY_FILE))
cert = OpenSSL::X509::Certificate.new(File.read(CERT_FILE))

input_files.each do |file|
  output_filename = file.dup.insert(file.rindex("."), "_signed")

  pdf = PDF.read(file)
  page = pdf.get_page(1)

  width = 200.0
  height = 50.0
  x = page.MediaBox[2].to_f - width - height
  y = height
  size = 8

  now = Time.now

  text_annotation = Annotation::AppearanceStream.new
  text_annotation.Type = Origami::Name.new("XObject")
  text_annotation.Resources = Resources.new
  text_annotation.Resources.ProcSet = [Origami::Name.new("Text")]
  text_annotation.set_indirect(true)
  text_annotation.Matrix = [ 1, 0, 0, 1, 0, 0 ]
  text_annotation.BBox = [ 0, 0, width, height ]
  text_annotation.write("Signed at #{now.iso8601}", x: size, y: (height/2)-(size/2), size: size)

  # Add signature annotation (so it becomes visibles in PDF document)
  signature_annotation = Annotation::Widget::Signature.new
  signature_annotation.Rect = Rectangle[llx: x, lly: y+height, urx: x+width, ury: y]
  signature_annotation.F = Annotation::Flags::PRINT
  signature_annotation.set_normal_appearance(text_annotation)

  page.add_annot(signature_annotation)

  # Sign the PDF with the specified keys
  pdf.sign(cert, key,
    method: "adbe.pkcs7.sha1",
    annotation: signature_annotation,
    location: "Helsinki",
    contact: "contact@kiskolabs.com",
    reason: "Proof of Concept"
  )

  # Save the resulting file
  pdf.save(output_filename)
end

以上是关于ruby 使用Ruby进行快速而脏的PDF签名(使用Origami)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 使用标头进行身份验证的方法?

使用 S/MIME 在 Ruby 中对电子邮件进行数字签名

ruby 快速而肮脏的脚本,以PDF格式从AT&T获取最新账单。

ruby 使用Base64和StringIO对PDF图像进行处理

使用 Ruby 为 CloudFront 创建签名 URL

如何使用 Ruby 在现有 PDF 上编辑或书写?