0

Origami で繰り返されるローカル pdf ファイルにデジタル署名を挿入するローカル スクリプトを実装しましたが、レール サーバー内で、Amazon s3 に保存されたファイルを使用してこれを行うための最良の方法がよくわかりません。

ファイルをs3からサーバーにダウンロードする必要があると思います(または、ペーパークリップで行っているAmazonにアップロードする前にキャプチャします)署名を挿入し、再度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およびPDF.saveメソッドは両方とも、ファイルパスまたはRubyIOオブジェクトのいずれかを受け入れます。

文字列からPDFインスタンスを作成する1つの方法(これは、「メモリ内」と言うときの意味です)は、StringIOオブジェクトを使用することです。

たとえば、Origamiシェルの次のセッションでは、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

折り紙コードをさらに詳しく分析した結果、PDF.Read がバイナリ ファイルを受け入れることに気付きました。そのため、ローカル ファイル パスを送信する代わりに、ファイル インスタンス全体を送信できます。

于 2012-09-06T15:26:11.367 に答える