2012-09-06 3 views
0

J'ai mis en place un script local pour insérer des signatures numériques dans les fichiers locaux PDF récurrents Origami, mais ne savent pas tout à fait ce qui serait la meilleure façon de le faire dans un rails serveur, et avec amazon s3 fichiers stockés.Obtenir Origami-pdf travailler avec des fichiers Amazon S3

Je suppose que je devrais télécharger le fichier de s3 sur mon serveur (ou le capturer avant de le télécharger sur amazon, ce que je fais avec un trombone) insérer la signature, et l'envoyer de nouveau à s3.

Voici la méthode PDF.read dans le fichier pdf.rb de solution origami:

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 

Comment pourrais-je adapter cette façon que je traite un fichier binaire en mémoire?

Avez-vous des suggestions?

Vous pouvez trouver plus sur l'origami here

Et mon code ci-dessous

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) 

Répondre

0

PDF.read et méthodes PDF.save les deux acceptent soit un chemin de fichier ou un objet Ruby IO.

Une méthode pour créer une instance PDF à partir d'une chaîne (qui, je suppose, est ce que vous voulez dire quand vous dites "en mémoire") est d'utiliser un objet StringIO.

Par exemple, la session suivante dans le shell Origami va créer une instance de PDF, enregistrez-le sur un objet StringIO et le recharger en utilisant sa propre chaîne de sortie.

>>> 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 
+0

En fait, je ne faisais pas allusion à une chaîne, mais à une instance de fichier, comme celui exposé par ses processeurs à paperclip (https://github.com/thoughtbot/paperclip) – MrWater

+0

PDF.save() semble attendre un chemin de fichier ... J'ai essayé d'entrer dans mon objet trombone, et j'ai eu une erreur en notant que l'entrée n'était pas une chaîne – MrWater

+0

Il semble que ce n'est pas une instance de fichier afterall: 'ne peut pas convertir Paperclip :: UploadedFileAdapter into String' – MrWater

0

Après une analyse plus en profondeur dans l'origami code, j'ai remarqué que PDF.Read accepte un fichier binaire, et donc au lieu de l'envoi du chemin de fichier local, nous pouvons envoyer l'instance de fichier dans son ensemble.

Questions connexes