You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WeasyPrint转换本地HTML为PDF遇错误,求代码修复方案

解决WeasyPrint转换本地HTML到PDF的NoneType错误

错误原因

你遇到的a bytes-like object is required, not 'NoneType'错误,是因为调用write_pdf()时传入文件路径参数后,该方法会直接将PDF写入指定文件,不会返回字节数据(返回值为None)。你后续尝试用open()写入这个None值,自然触发类型错误。

单文件转换修正代码

直接去掉多余的文件写入逻辑即可:

from weasyprint import HTML

def pdf_generate(html_file_path, pdf_file_path):
    try:
        html = HTML(filename=html_file_path)
        # 直接写入到目标路径,无需手动打开文件
        html.write_pdf(pdf_file_path)
        print(f'PDF已保存至: {pdf_file_path}')
    except Exception as e:
        print(f'转换失败: {str(e)}')

# 调用示例
pdf_generate('farm_management/scripts/56129.html', 'my_pdf_file.pdf')

批量转换代码(适配大量HTML文件)

针对你提到的大量本地HTML文件需求,这里提供批量转换脚本,自动遍历指定目录下的所有HTML文件并生成同名PDF:

from weasyprint import HTML
import os

def batch_html_to_pdf(source_dir, target_dir):
    # 确保目标目录存在,不存在则创建
    os.makedirs(target_dir, exist_ok=True)
    
    # 遍历源目录下的所有文件
    for filename in os.listdir(source_dir):
        # 只处理.html后缀的文件(不区分大小写)
        if filename.lower().endswith('.html'):
            html_full_path = os.path.join(source_dir, filename)
            # 生成对应的PDF文件名和路径
            pdf_filename = os.path.splitext(filename)[0] + '.pdf'
            pdf_full_path = os.path.join(target_dir, pdf_filename)
            
            try:
                HTML(filename=html_full_path).write_pdf(pdf_full_path)
                print(f'已完成转换: {html_full_path} -> {pdf_full_path}')
            except Exception as e:
                print(f'转换失败 [{html_full_path}]: {str(e)}')

# 调用示例:将source_dir下的所有HTML转存到target_dir
batch_html_to_pdf('farm_management/scripts', 'pdf_output')

额外注意事项

  • 确保WeasyPrint及其依赖(如GTK相关组件)已正确安装,否则可能出现渲染或转换失败的情况
  • 优先使用绝对路径指定文件位置,避免相对路径导致的文件找不到问题
  • 如果HTML中引用了本地图片、CSS等资源,确保资源路径正确,WeasyPrint会自动加载同目录下的资源,跨目录资源需调整HTML内的引用路径

内容的提问来源于stack exchange,提问作者Adarsh Srivastav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:12:10