代码之家  ›  专栏  ›  技术社区  ›  cph

通过python pdfkit调用时,为什么会出现wkhtmltopdf IO错误?

  •  3
  • cph  · 技术社区  · 9 年前

    我正在尝试升级我的 wkhtmltopdf 打包到 0.12.2.1 没有任何运气。

    以下是我迄今为止所做的/尝试过的。有人更新了他们的设置吗?或者任何指针都会非常有用!谢谢

    开箱即用 Configuration Error 我硬编码,只是为了克服这个。

    # -*- coding: utf-8 -*-
    import subprocess
    import sys
    
    class Configuration(object):
        def __init__(self, wkhtmltopdf='', meta_tag_prefix='pdfkit-'):
            self.meta_tag_prefix = meta_tag_prefix
    
            self.wkhtmltopdf = wkhtmltopdf
    
            if not self.wkhtmltopdf:
                if sys.platform == 'win32':
                    self.wkhtmltopdf = subprocess.Popen(                    ['where', 'wkhtmltopdf'], stdout=subprocess.PIPE).communicate()[0].strip()
                else:
                    self.wkhtmltopdf = subprocess.Popen( ['which', 'wkhtmltopdf'], stdout=subprocess.PIPE).communicate()[0].strip()
    
            try:
                #with open(self.wkhtmltopdf) as f:
               with open("/usr/local/bin/wkhtmltopdf") as f:
                    pass
            except IOError:
                raise IOError('No wkhtmltopdf executable found: "%s"\n'
                              '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' % self.wkhtmltopdf)
    

    现在我遇到了这个错误,不知道如何继续。我尝试添加 shell=True 给上面的教皇,但这也没用。

    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/rq/worker.py", line 543, in perform_job
        rv = job.perform()
      File "/usr/local/lib/python2.7/dist-packages/rq/job.py", line 490, in perform
        self._result = self.func(*self.args, **self.kwargs)
      File "/home/worker-1/Desktop/Dropbox/changeaddress/facts/jobs.py", line 864, in job_sharepdfs
        mymovepdf_link = build_mymovepdf(account_uuid, addresschange_uuid)
      File "/home/worker-1/Desktop/Dropbox/changeaddress/facts/jobs.py", line 608, in build_mymovepdf
        s3file = pdfkit.from_string( output.getvalue() , False )
      File "/usr/local/lib/python2.7/dist-packages/pdfkit/api.py", line 68, in from_string
        return r.to_pdf(output_path)
      File "/usr/local/lib/python2.7/dist-packages/pdfkit/pdfkit.py", line 93, in to_pdf
        stderr=subprocess.PIPE)
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    
    2 回复  |  直到 9 年前
        1
  •  3
  •   Parag Tyagi    9 年前

    你必须设置 configuration 您的(路径) wkhtmltopdf 图书馆

    我创建了一个基本的助手函数,如下所示,

    import os
    import pdfkit
    
    WKHTMLTOPDF_PATH = '/usr/local/bin/wkhtmltopdf'
    
    def generate_pdf(html, static_path,  _path):
        config = pdfkit.configuration(wkhtmltopdf=WKHTMLTOPDF_PATH)
        _status = pdfkit.from_string(
            html,
            os.path.join(static_path, _path),
            configuration=config,
            options={
                'page-size': 'A4',
                'margin-top': '0',
                'margin-right': '0',
                'margin-left': '0',
                'margin-bottom': '0',
                'zoom': '1.2',
                'encoding': "UTF-8",
            })
        return _path if _status else ''
    

    使用:

    html = "<h1>Hello World !!!</h1>"
    static_path = "/static/"
    file_path = "pdfs/out.pdf"
    generate_pdf(html, static_path, file_path)
    
        2
  •  3
  •   Parag Tyagi    7 年前

    另一种解决方案(安装 wkhtmltopdf ):

    wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    tar xvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz
    sudo mv wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf
    sudo chmod +x /usr/local/bin/wkhtmltopdf