0

我遇到的问题与这篇文章非常相似: pdfkit - python : 'str' object has no attribute decode

我正在通过网络应用程序运行 python 脚本。

使用 pip3,python 3.6 版安装后导入 pdfkit。

import pdfkit

def pdfkit(source, method):

if method == "string":

    try:
        options = {
            'page-size': 'A4',
            'margin-top': '0.75in',
            'margin-right': '0.75in',
            'margin-bottom': '0.75in',
            'margin-left': '0.75in',
        }
        config = pdfkit.configuration(wkhtmltopdf=bytes("/usr/local/bin/wkhtmltopdf", 'utf8'))
        pdf = pdfkit.from_string(source, False,options=options,configuration=config)
        return pdf

    except Exception as e:
        return str(e)
else:
    return "Error:  Not yet Supported"

我按照 UBUNTU 20.04 的这些说明安装了 wkhtmltopdf。它说这些是“无头的”,可以从命令行执行。事实上,它在使用 pdfkit 包装器时确实如此,但是当我尝试通过 python 脚本本身运行时它不起作用。

我得到的错误之一是:

{
   "pdf": "'function' object has no attribute 'configuration'"
}

除其他外,如果我删除配置,对于 from_string 也是如此。

只是想知道我是否需要导入其他一些模块,或者我是否需要系统上不同版本的 wkhtmltopdf。

我需要获取不同的二进制文件,还是按照此处的说明进行操作。这很令人困惑,因为有多种安装方法,CLI、.deb 包和使用 GitHub 上的信息。谢谢。

wkhtmltopdf/包装

用于 UBUNTU 的 wkhtmltopdf

4

1 回答 1

0

谢谢。发布答案是因为我想跟进并详细说明。

这是一个问题,函数名(Duh!):

仍然在玩它,但主要是工作。我刚开始使用 Python。真的很不错。希望我早点发现。

def getpdf(源,方法):

if method == "string":

    try:
        options = {
            'page-size': 'A4',
            'margin-top': '0.75in',
            'margin-right': '0.75in',
            'margin-bottom': '0.75in',
            'margin-left': '0.75in',
        }
        config = pdfkit.configuration(wkhtmltopdf=bytes("/usr/local/bin/wkhtmltopdf", 'utf8'))
        pdf = pdfkit.from_string(source, False,options=options)
        return pdf

    except Exception as e:
        return str(e)
#       pdf = pdfkit.from_string(html, False)
#       return pdf;
else:
    return "Error:  Not yet Supported"

def HTMLTOPDF(输出,uri,**请求):

if request['method'] != 'POST':
    output.SendMethodNotAllowed('POST')
else:
    query = json.loads(request['body'])
    pdf = getpdf(query['html'],query['method'])
    print (pdf)
    encoded = base64.b64encode(pdf)
    response = dict();
    response['pdf'] = pdf
    output.AnswerBuffer(encoded, 'text/html')

这现在大部分都在工作,事实上,我只是将编码结果返回为base64,或者似乎因为我通过请求得到的响应看起来像(JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo),我认为是PDF。我对将结果返回为 JSON 有点兴趣,因为我想传回其他内容,例如:

{"base64":encoded","status":"","error":""} 之类的。

我试过这样的事情:

    encoded = base64.b64encode(pdf)
    response = dict();
    response['pdf'] = encoded
    response['status'] = "status"
    output.AnswerBuffer(json.dumps(response, indent = 3), 'application/json')

我得到一个错误:

“字节”类型的对象不是 JSON 可序列化的

不过谢谢。至少我可以得到原始的base64,这可能真的更容易。

于 2020-08-21T02:46:46.627 回答