什么是用于生成PDF报告的可靠工具?特别是,我们对创建具有视频的交互式PDF很感兴趣,比如示例发现here。
现在我们正在使用Python和reportlab生成PDF,但还没有完全探索这个库(主要是因为许可价格有点高)
我们一直在研究Adobe的SDK和iText库,但很难说这两个库的功能是什么。
能够从一个模板PDF生成一个文档将是一个加号。
任何指示或评论都将不胜感激。
谢谢,
发布于 2011-12-06 10:11:59
最近,我需要为Django应用程序创建ReportLab报告;虽然有可用的Django许可证,但我最终选择了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发布于 2011-12-06 20:51:31
我建议使用https://github.com/mreiferson/py-wkhtmltox来渲染HTML到PDF。
并使用您选择的任何工具将报表呈现为HTML。我喜欢http://www.makotemplates.org/
https://stackoverflow.com/questions/8394343
复制相似问题