ubuntu1604 && centos 7 python3.6 pdfkit html转pdf

1.安装wkhtmltopdf

pdfkit是python对wkhtmlpdf的封装所以需要在环境上先安装wkhtmltopdf包

下载地址: https://wkhtmltopdf.org/downloads.html

(1)uname -m 查看系统架构

(2)x86_64 ubuntu 16.04安装

(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>

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章