1.安装wkhtmltopdf
pdfkit是python对wkhtmlpdf的封装所以需要在环境上先安装wkhtmltopdf包
(1)uname -m 查看系统架构
(2)x86_64 ubuntu 16.04安装
- 选择 Ubuntu 16.04 (xenial) amd6,先右键复制下载链接。
- 下载: wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox_0.12.5-1.xenial_amd64.deb
- dpkg -i wkhtmltox_0.12.5-1.xenial_amd64.deb
(3)x86_64 centos 7 安装
- 选择 CentOS 7 x86_64 / i686, 先右键复制下载链接。
- 下载:wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm
- 尝试安装: rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
- 出错,需要依赖
- error: Failed dependencies:
libXext is needed by wkhtmltox-1:0.12.5-1.centos7.x86_64
libXrender is needed by wkhtmltox-1:0.12.5-1.centos7.x86_64
xorg-x11-fonts-75dpi is needed by wkhtmltox-1:0.12.5-1.centos7.x86_64
xorg-x11-fonts-Type1 is needed by wkhtmltox-1:0.12.5-1.centos7.x86_64- 安装依赖 yum install -y libXext libXrender xorg-x11-fonts-75dpi xorg-x11-fonts-Type1
- 再次安装 rpm -ivh wkhtmltox-0.12.5-1.centos7.x86_64.rpm
(4)测试
wkhtmltopdf "www.baidu.com" test.pdf
2. 安装pdfkit
pip install pdfkit
3. python编码
为了实现 web界面 "导出文件为pdf" 这个功能,我使用的是restful,tornado框架。
导出文件,需要设置header的content-type,Content-Disposition。
MIME:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
Content-Disposition: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
(1)content-type : application/pdf
(2)Content-Disposition: "attachment; filename.pdf"
@Route(r'contract/exporttopdf')
class ExportContractHandler(BaseContractHandler):
@coroutine
def get(self):
# 查询保存的html string
html_str = yield self.query_contract_edit_info()
# 转换为pdf,设置标题
pdf = self.pdfkit_str(html_str=html_str, title="my contract")
# 设置头,为附件下载, 并设置好下载文件名字
self.set_header("content_type", "application/pdf")
self.set_header("Content-Disposition", 'attachment; filename=contract-{}.pdf'.format(int(time.time())))
self.write(pdf)
@staticmethod
def pdfkit_str(html_str, title):
options = {
"title": title, # 文档标题
'page-size': 'A4', # A4纸
'margin-top': '0in',
'margin-right': '0in',
'margin-bottom': '0in',
'margin-left': '0in',
'encoding': "UTF-8", # 中文
# 'custom-header': [
# ('Accept-Encoding', 'gzip')
# ],
'quiet': '', # 默认将显示所有wkhtmltopdf输出,不想看到需传递quiet选项
# 'cookie': [
# ('cookie-name1', 'cookie-value1'),
# ('cookie-name2', 'cookie-value2'),
# ],
# "header-right": "Page [page] of [toPage]", # 第几页
# 'no-outline': None, # 不要目录,大纲深度失效
# 'outline-depth': 5, # 大纲的深度
# 'enable-forms': True # 表单
}
cover = "" # 封面
css = "" # css样式
toc = '' # 目录
pdfkit.from_string(
html_str,
'temp.pdf',
options=options,
cover=cover,
css=css,
toc=toc
)
try:
with open('temp.pdf', "rb") as f:
return f.read()
except:
raise Exception("Read pdf file error")
4. 中文字体问题
一测发现中文全部是口!这怎么回事?
原因之一:原来是缺少中文字体!
这里有一文章可参考解决:
https://www.ostechnix.com/install-microsoft-windows-fonts-ubuntu-16-04/
我是采用拷贝window下的字体到服务器解决
安装中文字体:
1.查看目前安装字体: fc-list
2.创建目录: mkdir /usr/share/fonts/zh_CN
3.拷贝windows下 C:\Windows\Fonts 的中文字体到 /usr/share/fonts/zh_CN
4.执行 fc-cache -fv
5.查看是否已安装 fc-list
解决后:
在centos系统上,试了一下中文还是有问题!NO!但还是解决了。
原因2: 需要在html的字符集设置为utf8
<head><meta charset="UTF-8"></head>