0

我已经实现了一个本地脚本,将数字签名插入到 Origami 重复出现的本地 pdf 文件中,但不太清楚在 rails 服务器和亚马逊 s3 存储文件中执行此操作的最佳方法是什么。

我猜我需要将文件从 s3 下载到我的服务器(或者在上传到亚马逊之前捕获它,这就是我用回形针做的)插入签名,然后再次将其发送回 s3。

这是折纸解决方案的pdf.rb文件中的PDF.read方法:

 class << self

      #
      # Reads and parses a PDF file from disk.
      #
      def read(filename, options = {})
        filename = File.expand_path(filename) if filename.is_a?(::String)
        PDF::LinearParser.new(options).parse(filename)
      end

我该如何调整它以便处理内存中的二进制文件?

你有什么建议吗?

你可以在这里找到更多关于折纸的信息

下面是我的代码

require 'openssl'

begin
  require 'origami'
rescue LoadError
  ORIGAMIDIR = "C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems\1.9.1\gems\origami-1.2.4\lib"
  $: << ORIGAMIDIR
  require 'origami'
end
include Origami

INPUTFILE = "Sample.pdf"
@inputfile = String.new(INPUTFILE)
OUTPUTFILE = @inputfile.insert(INPUTFILE.rindex("."),"_signed")
CERTFILE = "certificate.pem"
RSAKEYFILE = "private_key.pem"
passphrase = "your passphrase"

key4pem=File.read RSAKEYFILE

key = OpenSSL::PKey::RSA.new key4pem, passphrase
cert = OpenSSL::X509::Certificate.new(File.read CERTFILE)

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

# Add signature annotation (so it becomes visibles in pdf document)

sigannot = Annotation::Widget::Signature.new
sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0]

page.add_annot(sigannot)

# Sign the PDF with the specified keys
pdf.sign(cert, key, 
  :method => 'adbe.pkcs7.sha1',
  :annotation => sigannot, 
  :location => "Portugal", 
  :contact => "myemail@email.tt", 
  :reason => "Proof of Concept"
)

# Save the resulting file
pdf.save(OUTPUTFILE)
4

3 回答 3

0

在对折纸代码进行深入分析后,我注意到 PDF.Read 接受二进制文件,因此我们可以发送整个文件实例,而不是发送本地文件路径。

于 2012-09-06T15:26:11.367 回答
0

PDF.readPDF.save方法都接受文件路径或 Ruby IO 对象。

从字符串创建 PDF 实例的一种方法(我想这就是您所说的“内存中”的意思)是使用StringIO对象。

例如,Origami shell 中的以下会话将创建一个 PDF 实例,将其保存到 StringIO 对象并使用其自己的输出字符串重新加载它。

>>> PDF.new.save(strio = StringIO.new)
...

>>> strio.string
"%PDF-1.0\r\n1 0 obj\r\n<<\r\n\t/Pages 2 0 R ..."

>>> strio.reopen(strio.string, 'r')
#<StringIO:0xffbea6cc>

>>> pdf = PDF.read(strio)
...

>>> pdf.class
Origami::PDF
于 2012-09-06T15:52:08.447 回答
0

正如@MrWater 所写,Origami::PDF.read接受一个流(更准确地说,Origami::PDF::LinearParser确实如此,请在此处查看源代码)。

这是我的简单解决方案:

require 'open-uri'

# pdf_url = 'http://someurl.com/somepdf.pdf'
pdf = Origami::PDF.read(URI.parse(pdf_url))

参考

于 2021-03-02T11:41:21.950 回答