Q
自動化PDF生成
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. 自動生成化妝
- 2. 自動化的WebForm生成
- 3. 在Excel中生成多個pdf:可能性自動化?
- 4. PDF動態生成
- 5. 下載自動生成並顯示pdf
- 6. 的Prestashop,生成發票(PDF)自動
- 7. Sweave能自動生成很多pdf嗎?
- 8. 生成SSRS並自動轉換爲PDF
- 9. 如何自動生成網站的PDF?
- 10. PHP自動生成PDF文件?
- 11. 自動生成PDF中的按鈕
- 12. 自動打印iText生成的PDF
- 13. 生成自動打印的PDF
- 14. 自動生成PDF並自動上傳到服務器
- 15. 動態生成圖形PDF?
- 16. PDF生成動態內容
- 17. iText PDF動態生成
- 18. PDF生成動態數據
- 19. 自動化生成部署github上
- 20. 自動化AutoCAD三維模型生成
- 21. 自動化word 2010來生成文檔
- 22. 自動化的網頁/圖標生成
- 23. 自動化Team Foundation生成配置
- 24. 自動生成
- 25. 從BIRT線性化生成的pdf
- 26. 從結構化數據生成PDF
- 27. Pdf不使用wkhtmltopdf生成使用自動化的Linux Bash Shell腳本?
- 28. 無PDF生成
- 29. SSRS PDF生成
- 30. PHP5 PDF生成?
出於好奇:你爲什麼選擇了LaTeX而不是ReportLab的RML? – Goro
@Goro:直到現在我還不知道RML的存在。謝謝。 :) –