我在我的Django应用程序中使用Pisa/xhtml2pdf从HTML源生成pdf.那是:
这个过程还可以,但速度很慢(特别是在处理长表时),我必须根据Pisa功能/限制使用HTML/CSS.
问题是:这是从Web应用程序生成pdf的正确方法(即创建HTML然后将其转换为pdf)还是有更直接的方法,即用更合适的语言"编写"pdf?
我想使用Python + Flask从html生成pdf文件.为此,我使用xhtml2pdf.这是我的代码:
def main():
pdf = StringIO()
pdf = create_pdf(render_template('cvTemplate.html', user=user))
pdf_out = pdf.getvalue()
response = make_response(pdf_out)
return response
def create_pdf(pdf_data):
pdf = StringIO()
pisa.CreatePDF(StringIO(pdf_data.encode('utf-8')), pdf)
return pdf
Run Code Online (Sandbox Code Playgroud)
在这个代码文件中即时生成.但!xhtml2pdf不支持CSS中的许多样式,因为正确标记页面存在这个大问题.我发现了另一种乐器(wkhtmltopdf).但是当我写下这样的话:
pdf = StringIO()
data = render_template('cvTemplate1.html', user=user)
WKhtmlToPdf(data.encode('utf-8'), pdf)
return pdf
Run Code Online (Sandbox Code Playgroud)
被引发的错误:
AttributeError: 'cStringIO.StringO' object has no attribute 'rfind'
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在Flask中使用wkhtmltopdf(在运行中生成文件)将html转换为pdf?
提前感谢您的回答.
我安装xhtml2pdf
使用pip
与Django的使用.我收到以下ImportError:
Reportlab Toolkit Version 2.2 or higher needed
Run Code Online (Sandbox Code Playgroud)
但我有reportlab 3.0
>>> import reportlab
>>> print reportlab.Version
3.0
Run Code Online (Sandbox Code Playgroud)
我发现这个try catch块中__init__.py
的xhtml2pdf
:
REQUIRED_INFO = """
****************************************************
IMPORT ERROR!
%s
****************************************************
The following Python packages are required for PISA:
- Reportlab Toolkit >= 2.2 <http://www.reportlab.org/>
- HTML5lib >= 0.11.1 <http://code.google.com/p/html5lib/>
Optional packages:
- pyPDF <http://pybrary.net/pyPdf/>
- PIL <http://www.pythonware.com/products/pil/>
""".lstrip()
log = logging.getLogger(__name__)
try:
from xhtml2pdf.util import REPORTLAB22
if not REPORTLAB22:
raise ImportError, "Reportlab Toolkit Version 2.2 …
Run Code Online (Sandbox Code Playgroud) 我正在使用Pisa将HTML转换为PDF(在Django项目中).处理跨越多个页面的表时,它非常慢:
一个200行的表需要150秒才能转换,而如果我把它分成更小的表需要15秒.
是否有建议由比萨处理的HTML表的提示或最佳实践?
以下代码给出错误:
Traceback (most recent call last):
File "pdf.py", line 14, in <module>
create_pdf(render_template('templates.htm'))
File "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 123, in render_template
ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'
Run Code Online (Sandbox Code Playgroud)
码:
from xhtml2pdf import pisa
from StringIO import StringIO
from flask import render_template,Flask
app=Flask(__name__)
app.debug=True
@app.route("/")
def create_pdf(pdf_data):
filename= "file.pdf"
pdf=pisa.CreatePDF( StringIO(pdf_data),file(filename, "wb"))
if __name__ == "__main__":
create_pdf(render_template('templates.htm'))
Run Code Online (Sandbox Code Playgroud) 首先,我是python,reportlab,xhtml2pdf的新手.我已经用reportlab完成了我的第一个pdf文件,但是我遇到了以下问题.
我需要两列中的大文本.
首先,我创建我的画布,创建我的故事,将我的大文本作为一个段落添加到故事中,创建我的框架,最后将故事添加到框架中.
c = Canvas("local.pdf")
storyExample = []
textExample = (""" This is a very large text Lorem Ipsum ... """)
storyExample.append(Paragraph(textExample, styleText))
frameExample = Frame(0, 0, 50, 50,showBoundary=0)
frameExample.addFromList(storyExample,c)
c.showPage()
c.save()
Run Code Online (Sandbox Code Playgroud)
奇迹般有效.但我需要在两列represantation中显示文本.
现在文本只是流动我的框架像:
|aaaaaaaaaaaaaaaaaaaa|
|bbbbbbbbbbbbbbbbbbbb|
|cccccccccccccccccccc|
|dddddddddddddddddddd|
Run Code Online (Sandbox Code Playgroud)
但我需要这样:
|aaaaaaaaa bbbbbbbbbb|
|aaaaaaaaa cccccccccc|
|bbbbbbbbb cccccccccc|
|bbbbbbbbb dddddddddd|
Run Code Online (Sandbox Code Playgroud)
我希望你理解我想说的话.
我正在使用 xhtml2pdf 将 html 转换为 pdf。
出于某种原因,它没有检测到任何 div 的宽度。我试过使用样式给宽度它仍然不起作用。我做错了什么?
<html>
<head>
</head>
<body>
<style>
div{
width:100pt;
height:100pt;
border:Solid red 1pt;
}
</style>
<div>
WOw a pdf
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,div 没有 100px 或 100pt 的宽度。
def myview(request):
options1 = ReportPropertyOption.objects.all()
for option in options1:
option.exterior_images = ReportExteriorImages.objects.filter(report = option)
option.interior_images = ReportInteriorImages.objects.filter(report = option)
option.floorplan_images = ReportFloorPlanImages.objects.filter(report = option)
html = render_to_string('report/export.html', { 'pagesize' : 'A4', }, context_instance=RequestContext(request,{'options1':options1}))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources )
if not pdf.err: …
Run Code Online (Sandbox Code Playgroud) 我正在关注 xhtml2pdf
指南。
我使用了示例 html 文件之一并保存为 test.html:
<html>
<head>
<style>
@page {
size: a4 portrait;
@frame header_frame { # Static Frame
-pdf-frame-content: header_content;
left: 50pt; width: 512pt; top: 50pt; height: 40pt;
}
@frame content_frame { # Content Frame
left: 50pt; width: 512pt; top: 90pt; height: 632pt;
}
@frame footer_frame { # Another static Frame
-pdf-frame-content: footer_content;
left: 50pt; width: 512pt; top: 772pt; height: 20pt;
}
}
</style>
</head>
<body>
<!-- Content for Static Frame 'header_frame' -->
<div id="header_content">Lyrics-R-Us</div>
<!-- …
Run Code Online (Sandbox Code Playgroud) 我正在使用Djang +使用xhtml2pdf.pisa使用html + css生成PDF.但是,我遇到了CSS的各种奇怪问题.
以下是我的代码:
from django.template.loader import render_to_string
import cStringIO as StringIO
import xhtml2pdf.pisa as pisa
import cgi, os
def fetch_resources(uri, rel):
path = os.path.join(settings.STATIC_ROOT, uri.replace(settings.STATIC_URL, ""))
return path
def test_pdf(request):
html = render_to_string('pdf/quote_sheet.html', { 'pagesize':'A4', }, context_instance=RequestContext(request))
result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), dest=result, link_callback=fetch_resources)
if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='application/pdf')
return HttpResponse('Gremlins ate your pdf! %s' % cgi.escape(html))
Run Code Online (Sandbox Code Playgroud)
我的模板:
<!DOCTYPE HTML PUBLIC "-//W3C/DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
{% load static from staticfiles %}
{% load i18n …
Run Code Online (Sandbox Code Playgroud) 我的问题是:我正在使用 xhtml2pdf 库从 html 创建 pdf 文件。创建 pdf 文件后,我使用 sendgrid API 通过电子邮件将该文件发送给用户。但是,我无法在 pdf 文件中保留嵌入的图像,因为应用程序返回给我“需要有效的文件名!” 信息。我在几个地方进行了研究,但找不到解决方案。使用的代码如下。
HTML 代码:
<img src="/static/media/logo.jpg" alt="Image">
Run Code Online (Sandbox Code Playgroud)
python代码(将html转换为pdf):
def link_callback(uri, rel):
"""
Convert HTML URIs to absolute system paths so xhtml2pdf can access those
resources
"""
# use short variable names
sUrl = settings.STATIC_URL
mUrl = settings.MEDIA_URL
mRoot = settings.MEDIA_ROOT
# convert URIs to absolute system paths
if uri.startswith(mUrl):
path = os.path.join(mRoot, uri.replace(mUrl, ""))
else:
return uri # handle absolute uri (ie: http://some.tld/foo.png)
# make sure that …
Run Code Online (Sandbox Code Playgroud) xhtml2pdf ×10
python ×8
django ×6
pisa ×5
flask ×2
pdf ×2
reportlab ×2
css ×1
html ×1
html-table ×1
pip ×1
python-3.x ×1
wkhtmltopdf ×1