问题描述
我尝试使用 pdfkit 解决以下问题。
当我将 wkhtmltopdf 配置添加到我的应用程序时,即使索引页无法加载到浏览器中,我的应用程序也无法加载到浏览器中。但是当我从我的应用程序中删除 wkhtmltopdf 配置时,我的所有路由都可以正常工作,只有 HTML 到 pdf 的路由给了我以下错误。
OSError: No wkhtmltopdf executable found: "b''"
If this file exists please check that this process can read it. Otherwise please install wkhtmltopdf - https://github.com/JazzCore/python-pdfkit/wiki/Installing-wkhtmltopdf
配置:
config = pdfkit.configuration(wkhtmltopdf='C:\\Program Files\\wkhtmltopdf\\bin\\wkhtmltopdf.exe')
pdfkit.from_url('http://127.0.0.1:5000/leave_worker_pdf','output.pdf',configuration=config)
route.py 代码:
@app.route('/leave_worker_pdf',methods=['POST'])
def leave_worker_pdf():
leave_worker = LeaveWorker.query.all()
html = render_template("leave_worker_pdf.html",leave_worker=leave_worker)
pdf = pdfkit.from_string(html,False)
response = make_response(pdf)
response.headers["Content-Type"] = "application/pdf"
response.headers["Content-disposition"] = "inline; filename=output.pdf"
return response
HTML 标记:
<!DOCTYPE html>
<html lang="en">
<head>
<Meta charset="UTF-8">
<Meta http-equiv="X-UA-Compatible" content="IE=edge">
<Meta name="viewport" content="width=device-width,initial-scale=1.0">
<title></title>
</head>
<body>
<div class="container">
<h1 class="text-center mt-4">Leave Workers Details</h1>
<table class="table mt-4">
<thead class="table-dark">
<tr>
<th scope="col">Id</th>
<th scope="col">Name</th>
<th scope="col">Address</th>
<th scope="col">Contact</th>
<th scope="col">LeaveDate</th>
<th scope="col">Admin</th>
</tr>
</thead>
{% for worker in leave_worker %}
<tbody>
<tr>
<td> {{ worker.id }}</td>
<td> {{ worker.leave_worker_name }} </td>
<td> {{ worker.leave_worker_address }} </td>
<td> {{ worker.leave_worker_contact }} </td>
<td> {{ worker.leave_date.strftime('%Y-%m-%d') }} </td>
<td> {{ worker.admin.username }} </td>
</tr>
</tbody>
{% endfor %}
</table>
</div>
</body>
</html>
当我添加 wkhtmltopdf 配置时,页面无法加载到浏览器中。
即使是主页也无法加载到浏览器中。
当我从我的应用程序中删除 wkhtmltopdf 配置时,只有当我点击 pdf 时,我的所有路由才能正常工作,然后它给出错误。
错误:
解决方法
如果您在远程服务器上运行此 Flask 应用程序,则设置 wkhtmltopdf 可能会遇到困难。我无法这样做,不得不求助于使用 python 库 reportlab 来创建此解决方案。
如果您有兴趣将其作为解决方案,这里有一个 git repo 代码,来自写过一本关于 reportlab 的书的人。