2017-11-09 17 views
0

私はpythonでpyfpdfを使ってpdfファイルを生成しています。私は自分のファイルシステムにイメージとして保存することなくpdfファイルに挿入したいBase64を持っています。しかし、pyfpdfイメージ関数はファイルパスしか受け付けません。pyfpdfを使ってBase64イメージをpdfに挿入

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

ファイルシステムにあらかじめ保存しなくても、メモリからbase64またはバッファリングされたイメージを直接挿入する方法(ハック)はありますか?私はgithub上でソースコードをチェックしても理解できませんでした。

リンク:https://github.com/reingart/pyfpdf/tree/master/fpdf

+1

'fpdf'をサブクラス化し、' Load_resource'をオーバーライドして 'BytesIO'ファイルのようなオブジェクトを返すことができます。 – pvg

+0

それは素晴らしいアイデアです。私が立ち往生した場合、あなたが詳細な回答を投稿できるかどうかは私には助けになります。 –

+2

すべての画像解析コードは 'load_resource'を呼び出します。それを見て、不明なことがある場合は特定の質問をしてください。あるいは、別のpdfライブラリを使ってみるといいかもしれません。これは(PHPのポートです) – pvg

答えて

1

@pvgがあなたのbase64機能とトリックをload_resource機能をオーバーライドしない、コメントで述べたように。

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:

これは、PDFに画像を挿入するためのサンプルコードです。コード内のいくつかの説明にコメントしました。

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) 
関連する問題