使用WeasyPrint转HTML为PDF遇错求修正(报错:需字节对象而非NoneType)
解决WeasyPrint转换HTML到PDF的报错问题
错误原因
你的代码里html.write_pdf(pdf_file_path)方法本身会直接将PDF内容写入指定路径的文件,它的返回值是None。你后续又尝试把这个None写入文件,就触发了a bytes-like object is required, not 'NoneType'错误。
修正方案
方案1:直接写入文件(最简方式)
直接调用write_pdf并传入输出路径,无需额外处理返回值:
def pdf_generate(): try: html_file_path = 'farm_management/scripts/56129.html' html = HTML(filename=html_file_path) pdf_file_path = 'my_pdf_file.pdf' # 直接将PDF写入指定路径 html.write_pdf(pdf_file_path) print(f'PDF file has been written to: {pdf_file_path}') except Exception as e: print(str(e))
方案2:获取字节数据后自行处理
如果需要先拿到PDF的字节内容(比如后续要上传、加密等),可以不传路径,接收返回的字节数据再写入文件:
def pdf_generate(): try: html_file_path = 'farm_management/scripts/56129.html' html = HTML(filename=html_file_path) pdf_file_path = 'my_pdf_file.pdf' # 获取PDF字节数据 pdf_bytes = html.write_pdf() with open(pdf_file_path, 'wb') as f: f.write(pdf_bytes) print(f'PDF file has been written to: {pdf_file_path}') except Exception as e: print(str(e))
批量转换大量HTML文件
如果要处理目录下所有HTML文件,可以用以下批量处理函数:
import os from weasyprint import HTML def batch_html_to_pdf(html_dir, output_dir): # 确保输出目录存在,不存在则创建 os.makedirs(output_dir, exist_ok=True) # 遍历目录下所有HTML文件 for filename in os.listdir(html_dir): if filename.lower().endswith('.html'): html_full_path = os.path.join(html_dir, filename) # 生成对应的PDF文件名 pdf_filename = os.path.splitext(filename)[0] + '.pdf' pdf_full_path = os.path.join(output_dir, pdf_filename) try: html = HTML(filename=html_full_path) html.write_pdf(pdf_full_path) print(f'转换完成:{pdf_full_path}') except Exception as e: print(f'转换失败 {html_full_path}: {str(e)}') # 使用示例:转换指定目录下所有HTML文件到输出目录 batch_html_to_pdf('farm_management/scripts', 'pdf_output')
内容的提问来源于stack exchange,提问作者Adarsh Srivastav
相关产品推荐
相关产品推荐

