2017-09-13 7 views
5

konvertieren Ich möchte pdf Datei aus DB-Datensatz zu generieren. Codieren Sie es zu Base64 Zeichenfolge und speichern Sie es in DB. Was gut funktioniert. Jetzt möchte ich umgekehrte Aktion, Wie kann ich Base64 Zeichenfolge entschlüsseln und pdf Datei erneut generieren?Wie Base64 Zeichenkette in PDF-Datei mit Garnelen Edelstein

hier ist, was ich bisher versucht habe.

def data_pdf_base64 
    begin 
    # Create Prawn Object 
    my_pdf = Prawn::Document.new 
    # write text to pdf 
    my_pdf.text("Hello Gagan, How are you?") 
    # Save at tmp folder as pdf file 
    my_pdf.render_file("#{Rails.root}/tmp/pdf/gagan.pdf") 
    # Read pdf file and encode to Base64 
    encoded_string = Base64.encode64(File.open("#{Rails.root}/tmp/pdf/gagan.pdf"){|i| i.read}) 
    # Delete generated pdf file from tmp folder 
    File.delete("#{Rails.root}/tmp/pdf/gagan.pdf") if File.exist?("#{Rails.root}/tmp/pdf/gagan.pdf") 
    # Now converting Base64 to pdf again 
    pdf = Prawn::Document.new 
    # I have used ttf font because it was giving me below error 
    # Your document includes text that's not compatible with the Windows-1252 character set. If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts. 
    pdf.font Rails.root.join("app/assets/fonts/fontawesome-webfont.ttf") 
    pdf.text Base64.decode64 encoded_string 
    pdf.render_file("#{Rails.root}/tmp/pdf/gagan2.pdf") 
    rescue => e 
    return render :text => "Error: #{e}" 
    end 
end 

Jetzt bin ich unten Störung zu erhalten:

Encoding ASCII-8BIT can not be transparently converted to UTF-8. Please ensure the encoding of the string you are attempting to use is set correctly

Ich habe How to convert base64 string to PNG using Prawn without saving on server in Rails versucht, aber es gibt mir eine Fehlermeldung:

"\xFF" from ASCII-8BIT to UTF-8

Kann mir jemand zeigen, was ich fehle?

+0

@Med: ok lassen Sie mich versuchen, werden Sie bald –

+0

@Med aktualisieren: immer diese Fehlermeldung: 'ungültige Bytefolge in UTF-8' –

+0

Ihre Frage ist unklar. Zuerst sagen Sie, dass Sie eine PDF-Datei in der Datenbank speichern. Dann fragen Sie, wie Sie aus den Daten in der DB eine PDF-Datei erzeugen können. Aber du hast gerade gesagt, dass die Daten * eine PDF-Datei sind! Also, was ist es? –

Antwort

5

Die Antwort ist, die Base64-codierte Zeichenfolge zu decodieren und entweder direkt zu senden oder direkt auf der Festplatte zu speichern (benennen Sie sie als PDF-Datei, aber ohne Verwendung von Garnelen).

Die decodierte Zeichenfolge ist eine binäre Darstellung der PDF-Dateidaten. Es ist also nicht erforderlich, Prawn zu verwenden oder den Inhalt der PDF-Daten neu zu berechnen.

dh

raw_pdf_str = Base64.decode64 encoded_string 
render :text, raw_pdf_str # <= this isn't the correct rendering pattern, but it's good enough as an example. 

EDIT

, um einige der Informationen in den Kommentaren gegeben zu klären:

  1. Es ist möglich, die Zeichenfolge als Anhang zu senden, ohne sie zu speichern Platte, entweder mit render text: raw_pdf_str oder die #send_data method (das sind 4.x API-Versionen, ich erinnere mich nicht r 5.x API-Stil).

  2. Es ist möglich, die Zeichenfolge (aus dem Prawn-Objekt) zu codieren, ohne die gerenderten PDF-Daten in einer Datei zu speichern (speichern Sie sie stattdessen in einem String-Objekt). d.h .:

    encoded_string = Base64.encode64(my_pdf.render) 
    
  3. Die String-Daten direkt als Email-Anhang verwendet werden könnten, ähnlich das Muster provided here nur den String direkt anstelle alle Daten lasen aus einer Datei. d.h .:

    # inside a method in the Mailer class 
    attachments['my_pdf.pdf'] = { :mime_type => 'application/pdf', 
               :content => raw_pdf_str } 
    
+0

danke für die Antwort, kann ich als Anhang senden, ohne als physische Datei in meinem System zu speichern? –

+0

@GaganGami - Yap, Sie können die Zeichenfolge als Anhang senden, ohne sie auf der Festplatte zu speichern. Ich kann mich nicht an den "Rails Way" erinnern. Sie können die Prawn-Daten auch in eine Zeichenkette (vor der Kodierung) rendern, anstatt sie in eine Datei zu rendern (verwenden Sie '# render' anstelle von' # render_file'). Keine Notwendigkeit für temporäre Dateien. – Myst

+0

'render' hat gut funktioniert, ich habe die codierte Zeichenkette in eine physische PDF-Datei konvertiert, aber ich möchte diese Datei nicht irgendwo speichern, sondern ein Dateiobjekt, das ich an die Mail anhängen kann, ohne als temporäre Datei –

Verwandte Themen