5

Ich arbeite an einer Rails-Anwendung, die mithilfe von Garnelen PDFs generiert. Kurz gesagt, wir möchten generierte PDFs digital signieren. Ich bin mir nicht sicher, wo ich anfangen soll, genau zu lesen. Ich wollte nur fragen, ob jemand anderes dies schon früher geschafft hat und wenn ja, welche Art von Ressourcen ich dafür verwenden sollte.Generieren von PDFs mit Signaturen mit Ruby oder Ruby on Rails

Danke!

Antwort

3

Ich würde vorschlagen, dass Sie sich https://github.com/joseicosta/odf-report ansehen. Es ist ein Juwel für die Generierung von ODF, aber sie können leicht in PDF konvertiert werden, und es unterstützt Vorlagen.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort er aufzunehmen Geben Sie den Link als Referenz an. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – nalply

2

Obwohl diese Frage eine Antwort und ziemlich alt ist, würde ich gerne relevanten Link zur Information hinzufügen.

MrWater hat seinen Code an Insert digital signature into existing pdf file weitergegeben.

VERSION 1 - Generieren Zertifikat und die Schlüsseldatei, und fügen Sie sie direkt in das Dokument

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 

# Code below is based on documentation available on 
# http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL.html 
key = OpenSSL::PKey::RSA.new 2048 

open 'private_key.pem', 'w' do |io| io.write key.to_pem end 
open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end 

cipher = OpenSSL::Cipher::Cipher.new 'AES-128-CBC' 
pass_phrase = 'Origami rocks' 

key_secure = key.export cipher, pass_phrase 

open 'private_key.pem', 'w' do |io| 
    io.write key_secure 
end 

#Create the certificate 

name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example' 

cert = OpenSSL::X509::Certificate.new 
cert.version = 2 
cert.serial = 0 
cert.not_before = Time.now 
cert.not_after = Time.now + 3600 

cert.public_key = key.public_key 
cert.subject = name 


OUTPUTFILE = "test.pdf" 

contents = ContentStream.new.setFilter(:FlateDecode) 
contents.write OUTPUTFILE, 
    :x => 350, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30 

pdf = PDF.read('Sample.pdf') 


# Open certificate files 

#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 => "[email protected]", 
    :reason => "Proof of Concept" 
) 

# Save the resulting file 
pdf.save(OUTPUTFILE) 

VERSION 2 - Verwenden Sie Zertifikate bestehenden PDF-Dokument

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 => "[email protected]", 
    :reason => "Proof of Concept" 
) 

# Save the resulting file 
pdf.save(OUTPUTFILE) 
zu unterzeichnen
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – nalply

+0

Der ursprüngliche Code wurde gemäß @nalply und http://stackoverflow.com/help/referencing hinzugefügt – twnaing