Python使用pdfkit转换ABFSS路径HTML为PDF找不到文件问题咨询
问题原因分析
两次报错对应两个独立的问题:
No such file: abfss://xxx报错的核心原因是:pdfkit底层依赖的wkhtmltopdf仅支持读取本地文件系统路径,无法直接识别Azure Data Lake Storage Gen2的abfss协议路径。mssparkutils是Spark生态专门适配了ADLS存储的工具,因此可以正常写入读取abfss路径,但pdfkit无该适配能力,无法直接读取目标文件。No wkhtmltopdf executable found报错的核心原因是:pdfkit只是wkhtmltopdf工具的Python封装层,本身不携带wkhtmltopdf的二进制执行文件,运行环境中未提前安装该依赖。
解决步骤
第一步:安装wkhtmltopdf依赖
根据运行环境选择对应的安装命令,以常见的Debian/Ubuntu基础的Synapse Spark环境为例,在notebook开头执行:
!apt-get update && apt-get install -y wkhtmltopdf
安装完成后执行如下命令验证安装结果,获取wkhtmltopdf的执行路径:
!which wkhtmltopdf
返回结果一般为/usr/bin/wkhtmltopdf,后续调用pdfkit时可手动指定该路径避免识别失败:
import pdfkit # 替换为上一步获取到的实际路径 wk_config = pdfkit.configuration(wkhtmltopdf="/usr/bin/wkhtmltopdf")
第二步:中转处理ADLS文件
不要直接将abfss路径传入pdfkit,先通过mssparkutils将文件下载到本地临时目录处理,完成后再回传到ADLS即可,完整示例代码如下:
# 原ADLS存储路径 html_adls_path = "abfss://container@DataLakeName.dfs.core.windows.net/user/trusted-service-user/for_html/htmltest.html" pdf_adls_path = "abfss://container@DataLakeName.dfs.core.windows.net/user/trusted-service-user/for_html/htmltest.pdf" # 本地临时路径 local_html = "/tmp/htmltest.html" local_pdf = "/tmp/htmltest.pdf" # 下载HTML文件到本地 mssparkutils.fs.get(html_adls_path, local_html) # 执行PDF转换,替换为你自己的options配置 myoptions = {} pdfkit.from_file(local_html, local_pdf, options=myoptions, configuration=wk_config) # 转换完成后将PDF上传回ADLS mssparkutils.fs.put(local_pdf, pdf_adls_path, overwrite=True)
内容的提问来源于stack exchange,提问作者AlwaysWondering
相关产品推荐
相关产品推荐

