使用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
相关产品推荐
相关产品推荐

