8

reportlab がSimpleDocTemplateあり、動的 PDF として返します。Django モデルのメタデータに基づいてコンテンツを生成しています。これが私のテンプレートのセットアップです:

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

Entryモデルのテキスト メタデータをリストに簡単に追加して、Story後でビルドすることができます。

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

次に、 を呼び出して、応答で返される PDF を生成しbuildますSimpleDocTemplate

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 つのメタデータ フィールドは添付ファイルです。それらの添付ファイルが PDF の場合、生成しているストーリーにそれらをマージしたいと思います。reportlab の「フロー可能」タイプの PDF を意味する IE。

を使用してそうしようとしてpdfrwいますが、運がありません。理想的には、次のように呼び出したいと思います:

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

上記のように、PDF を既存のストーリー リストに追加して、最終ドキュメントの生成に含めます。

誰にもアイデアはありますか?pagexobj を使用して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 ファイルを reportlab フローアブルにマージする最良の方法を誰かに説明してもらえますか? 私はこのようなことが苦手で、何日もの間、pdf生成に頭を悩ませてきました。:) どの方向も大歓迎です!

4

4 に答える 4

3

プロジェクトで同様のタスクがありました。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()
于 2013-02-06T20:02:01.340 に答える
2

次のクラスを使用して問題を解決しました。PDF をベクター PDF 画像として挿入します。目次が必要だったので、うまくいきました。フロー可​​能なオブジェクトにより、組み込みの TOC 機能が魔法のように機能するようになりました。

ReportLab のフロー可能な matplotlib はありますか?

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

于 2014-01-27T01:06:29.020 に答える