2017-11-09 1 views
0

Ich benutze PYFPDF in Python, um PDF-Dateien zu generieren. Ich habe ein Base64, das ich in eine PDF-Datei einfügen möchte, ohne es als Bild in meinem Dateisystem speichern zu müssen. Aber die pypfpdf-Bildfunktion akzeptiert nur den Dateipfad.Einfügen Base64 Bild in PDF mit pyfpdf

fpdf.image(name, x = None, y = None, w = 0, h = 0, type = '', link = '') 

Gibt es eine Möglichkeit (Hack) direkt base64 oder gepufferte Bild einfügen aus dem Gedächtnis, ohne vorher in das Dateisystem speichern zu müssen? Ich habe sogar ihren Quellcode auf GitHub überprüft und konnte nicht herausfinden.

Link: https://github.com/reingart/pyfpdf/tree/master/fpdf

+1

Sie können 'fpdf' ableiten und' load_resource' überschreiben, um 'BytesIO' dateiähnliche Objekte zurückzugeben. – pvg

+0

Das ist eine großartige Idee. Es würde mir helfen, wenn Sie Ihre detaillierte Antwort posten könnten, wenn ich feststecke. –

+2

Der gesamte Bildanalysecode ruft 'load_resource' auf, gehen Sie einen Blick darauf und stellen Sie eine spezifische Frage, wenn etwas unklar ist. Alternativ können Sie auch eine andere PDF-Bibliothek verwenden, da diese eine unheilvolle Angelegenheit ist (es ist ein PHP-Port). – pvg

Antwort

1

Wie @pvg in den Kommentaren erwähnt, zwingende load_resource Funktion mit Base64-Funktionalität ist der Trick.

import base64,io 

def load_resource(self, reason, filename): 
    if reason == "image": 
     if filename.startswith("http://") or filename.startswith("https://"): 
      f = BytesIO(urlopen(filename).read()) 
     elif filename.startswith("data"): 
      f = filename.split('base64,')[1] 
      f = base64.b64decode(f) 
      f = io.BytesIO(f) 
     else: 
      f = open(filename, "rb") 
     return f 
    else: 
     self.error("Unknown resource loading reason \"%s\"" % reason) 

EDIT:

Dies ist ein Beispielcode Bilder in PDF einzufügen. Ich habe einige Anweisungen im Code kommentiert.

from fpdf import FPDF 
import os 
import io 
import base64 


class PDF(FPDF): 

    def load_resource(self, reason, filename): 
     if reason == "image": 
      if filename.startswith("http://") or filename.startswith("https://"): 
       f = BytesIO(urlopen(filename).read()) 
      elif filename.startswith("data"): 
       f = filename.split('base64,')[1] 
       f = base64.b64decode(f) 
       f = io.BytesIO(f) 
      else: 
       f = open(filename, "rb") 
      return f 
     else: 
      self.error("Unknown resource loading reason \"%s\"" % reason) 


    def sample_pdf(self,img,path): 

     self.image(img,h=70,w=150,x=30,y=100,type="jpg") 
     #make sure you use appropriate image format here jpg/png 
     pdf.output(path, 'F') 

if __name__ == '__main__': 
    img = # pass your base64 image 
    # you can find sample base64 here : https://pastebin.com/CaZJ7n6s 

    pdf = PDF() 
    pdf.add_page() 
    pdf_path = # give path to where you want to save pdf 
    pdf.sample_pdf(img,pdf_path)