2012-11-13 23 views
7

私は報告書SimpleDocTemplateを持っており、それを動的PDFとして返します。 Djangoのモデルメタデータに基づいてコンテンツを生成しています。ここに私のテンプレートの設定です:既存のPDFをフローラブルを使用して新しいReportLab PDFに結合

buff = StringIO() 
doc = SimpleDocTemplate(buff, pagesize=letter, 
         rightMargin=72,leftMargin=72, 
         topMargin=72,bottomMargin=18) 
Story = [] 

私は後で簡単に構築することがStoryリストにEntryモデルからテキスト形式のメタデータを追加することができます

ptext = '<font size=20>%s</font>' % entry.title.title() 
    paragraph = Paragraph(ptext, custom_styles["Custom"]) 
    Story.append(paragraph) 

そしてによって応答で返されるPDFを生成しますSimpleDocTemplatebuildを呼び出す:

doc.build(Story, onFirstPage=entry_page_template, onLaterPages=entry_page_template) 

pdf = buff.getvalue() 
resp = HttpResponse(mimetype='application/x-download')  
resp['Content-Disposition'] = 'attachment;filename=logbook.pdf' 
resp.write(pdf) 
return resp 

モデル上の1つのメタデータ・フィールドは、ファイルattachmですent。これらの添付ファイルがPDFの場合は、それらを私が生成しているStoryにマージしたいと思います。 IEはreportlabの "flowable"タイプのPDFを意味します。

pdfrwを使用していますが、運がないとしています。

from pdfrw import PdfReader 
pdf = pPdfReader(entry.document.file.path) 
Story.append(pdf) 

をし、上記のように、最終文書の作成に含まれる既存のストーリーのリストにPDFファイルを追加します。理想的には私はちょうど呼び出すのが大好きです。

誰もが考えている?

http://code.google.com/p/pdfrw/source/browse/trunk/examples/rl1/subset.py

from pdfrw.buildxobj import pagexobj 
from pdfrw.toreportlab import makerl 

pdf = pagexobj(PdfReader(entry.document.file.path)) 

しかし、どちらかのいずれかの運を持っていなかった。私はこの例に従うことをしようと、PDFファイルを作成するためにpagexobjを使用して、同様のものを試してみました。誰かが私に、既存のPDFファイルをflowableなreportlabにマージする最善の方法を説明できますか?私はこのようなものでうまくやっていないし、今pdf世代で私の頭を叩いています。 :)どの方向にも大変感謝しています!

+0

私はReportLabの有料版でこれを行うことができると思います。 –

+0

うわー、残念ながら、私はReportLabの有料版が私の選択肢だとは思わない。誰にでも何か選択肢がありますか? – kyleturner

答えて

1

私はちょうどプロジェクトで同様の作業をしていました。私はreportlab(オープンソース版)を使用してPDFファイルを生成し、pyPDFを使ってマージを容易にしました。私の要件は、私がちょうど各添付ファイルから1ページが必要であった点でわずかに異なっていましたが、これはあなたが一般的な考えを得るのに十分に近いと確信しています。

from pyPdf import PdfFileReader, PdfFileWriter 

def create_merged_pdf(user): 
    basepath = settings.MEDIA_ROOT + "/" 
    # following block calls the function that uses reportlab to generate a pdf 
    coversheet_path = basepath + "%s_%s_cover_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f")) 
    create_cover_sheet(coversheet_path, user, user.performancereview_set.all()) 

    # now user the cover sheet and all of the performance reviews to create a merged pdf 
    merged_path = basepath + "%s_%s_merged_%s.pdf" %(user.first_name, user.last_name, datetime.now().strftime("%f")) 

    # for merged file result 
    output = PdfFileWriter() 

    # for each pdf file to add, open in a PdfFileReader object and add page to output 
    cover_pdf = PdfFileReader(file(coversheet_path, "rb")) 
    output.addPage(cover_pdf.getPage(0)) 

    # iterate through attached files and merge. I only needed the first page, YMMV 
    for review in user.performancereview_set.all(): 
     review_pdf = PdfFileReader(file(review.pdf_file.file.name, "rb")) 
     output.addPage(review_pdf.getPage(0)) # only first page of attachment 

    # write out the merged file 
    outputStream = file(merged_path, "wb") 
    output.write(outputStream) 
    outputStream.close() 
1

私の問題を解決するために、次のクラスを使用しました。 PDFをベクトルPDFイメージとして挿入します。 私は目次が必要だったのですごくうまくいきます。流動性のあるオブジェクトは、組み込みのTOC機能を魅力的に機能させることを可能にしました。

Is there a matplotlib flowable for ReportLab?

注:ファイルに複数のページを持っている場合、あなたは少しクラスを変更する必要があります。サンプルクラスは、PDFの最初のページを読み込むように設計されています。

関連する問題