3
A
答えて
5
は、私は、DjangoアプリケーションのためのPDFレポートを作成するために必要な。 ReportLabライセンスが利用可能でしたが、私はLaTeXを選択しました。このアプローチの利点は、Django templatesを使用してLaTeXソースを生成することができ、作成する必要のある多くのレポートのためにたくさんのコードを書くことができないことです。さらに、比較的簡潔なLaTeX構文(多くの癖があり、あらゆる目的には適していない)を利用することができます。
This snippetは、アプローチの概要を提供します。私はこの質問の最後にいくつかの変更を加える必要があることを発見しました。主な追加はRerun LaTeX
メッセージの検出です。これは追加パスが必要であることを示します。使用方法は次のように簡単です:
def my_view(request):
pdf_stream = process_latex(
'latex_template.tex',
context=RequestContext(request, {'context_obj': context_obj})
)
return HttpResponse(pdf_stream, content_type='application/pdf')
LaTeXで生成されたPDFにビデオを埋め込むことは可能ですが、私はそれについての経験はありません。 HereはトップGoogle resultです。
このソリューションでは、新しいプロセス(pdflatex
)を生成する必要があります。したがって、純粋なPythonソリューションを探し続けるには、
import os
from subprocess import Popen, PIPE
from tempfile import NamedTemporaryFile
from django.template import loader, Context
class LaTeXException(Exception):
pass
def process_latex(template, context={}, type='pdf', outfile=None):
"""
Processes a template as a LaTeX source file.
Output is either being returned or stored in outfile.
At the moment only pdf output is supported.
"""
t = loader.get_template(template)
c = Context(context)
r = t.render(c)
tex = NamedTemporaryFile()
tex.write(r)
tex.flush()
base = tex.name
names = dict((x, '%s.%s' % (base, x)) for x in (
'log', 'aux', 'pdf', 'dvi', 'png'))
output = names[type]
stdout = None
if type == 'pdf' or type == 'dvi':
stdout = pdflatex(base, type)
elif type == 'png':
stdout = pdflatex(base, 'dvi')
out, err = Popen(
['dvipng', '-bg', '-transparent', names['dvi'], '-o', names['png']],
cwd=os.path.dirname(base), stdout=PIPE, stderr=PIPE
).communicate()
os.remove(names['log'])
os.remove(names['aux'])
# pdflatex appears to ALWAYS return 1, never returning 0 on success, at
# least on the version installed from the Ubuntu apt repository.
# so instead of relying on the return code to determine if it failed,
# check if it successfully created the pdf on disk.
if not os.path.exists(output):
details = '*** pdflatex output: ***\n%s\n*** LaTeX source: ***\n%s' % (
stdout, r)
raise LaTeXException(details)
if not outfile:
o = file(output).read()
os.remove(output)
return o
else:
os.rename(output, outfile)
def pdflatex(file, type='pdf'):
out, err = Popen(
['pdflatex', '-interaction=nonstopmode', '-output-format', type, file],
cwd=os.path.dirname(file), stdout=PIPE, stderr=PIPE
).communicate()
# If the output tells us to rerun, do it by recursing over ourself.
if 'Rerun LaTeX.' in out:
return pdflatex(file, type)
else:
return out
0
https://github.com/mreiferson/py-wkhtmltoxを使用してHTMLをPDFにレンダリングすることをお勧めします。
レポートをHTMLとしてレンダリングするために選択したツールを使用します。私は好きですhttp://www.makotemplates.org/
関連する問題
- 1. 自動化pdf生成のためのpdfテンプレート
- 2. 自動生成されたpdf
- 3. PDFを自動生成(ノード、Express)
- 4. Eclipseでのテストスイート生成の自動化
- 5. 動的PDF生成
- 6. PDF概要テキスト - Acrobatシーケンスの自動化
- 7. PDFを自動的に生成してサーバーに自動的にアップロードする
- 8. iTextで生成されたPDFの自動印刷
- 9. 別のユーザーのSSH鍵ペアの作成/生成を自動化
- 10. iText PDF動的生成
- 11. PDF生成を動的に
- 12. ajaxで送る方法pdfファイルを自動生成
- 13. 自動的にpdfからキーワードを生成
- 14. サーバーディスクにレポート(PDF)を自動的に保存/生成する
- 15. 自動的に生成され、pdfを表示しました
- 16. URLからの自動PDF作成
- 17. フィールド生成メソッドの自動生成
- 18. 派生自動生成エンティティークラス
- 19. 自動生成テキストボックス
- 20. 自動レター生成
- 21. 自動インラインドキュメント生成
- 22. 自動生成タイムスタンプ
- 23. 自動化の作成
- 24. イオン生成のPdf生成
- 25. Hibernateマッピングファイルの自動生成
- 26. ジャンゴモードの自動生成シート
- 27. 自動データアクセスレイヤの生成
- 28. intellijのjavadoc自動生成
- 29. ウェブサイトの自動生成グラフ
- 30. Javaポリシーファイルの自動生成
好奇心をそらして:なぜあなたはReportLabのRMLでLaTeXを選んだのですか? – Goro
@ゴロ:今までRMLが存在していたことは分かりませんでした。ありがとう。 :) –