Rails中使用wkhtmltopdf无法写入临时文件的问题排查
问题排查与解决方案
以下针对你在Rails中使用Terrapin调用wkhtmltopdf出现的写入错误,给出具体排查和修复方向:
1. 确保临时HTML文件被持久化到磁盘
你当前代码中tempHTML << html仅将内容写入内存缓冲区,并未真正保存到磁盘,导致wkhtmltopdf无法读取有效内容,进而触发写入失败。修改代码确保内容落地:
tempHTML = Tempfile.new(["pattern", ".html"]) tempHTML.write(html) tempHTML.flush # 强制将缓冲区内容写入磁盘 tempHTML.close # 关闭文件后wkhtmltopdf才能正常读取
更推荐用块式创建Tempfile,自动处理文件关闭:
Tempfile.open(["pattern", ".html"]) do |tempHTML| tempHTML.write(html) Tempfile.open(["pattern", ".pdf"]) do |tempPDF| pdfCommand.run(html_source: tempHTML.path, pdf_target: tempPDF.path) # 在此处理生成的PDF文件 end end
2. 给xvfb-run命令明确指定wkhtmltopdf完整路径
Terrapin设置的Terrapin::CommandLine.path不会作用于xvfb-run内部调用的wkhtmltopdf,直接在命令中写入完整路径避免找不到可执行文件:
pdfCommand = Terrapin::CommandLine.new("xvfb-run /usr/bin/wkhtmltopdf :html_source :pdf_target")
3. 调整临时PDF文件的权限
Tempfile默认权限为0600(仅当前用户可读可写),若xvfb-run以其他用户身份执行(如服务器的www-data),会导致无法写入。手动放宽权限:
tempPDF = Tempfile.new(["pattern", ".pdf"]) tempPDF.chmod(0644) # 允许其他用户写入
4. 启用Terrapin调试模式验证生成的命令
添加调试代码,查看Terrapin实际执行的命令是否与你手动在控制台运行的一致:
Terrapin::CommandLine.logger = Logger.new(STDOUT) Terrapin::CommandLine.debug = true
运行后会输出完整执行命令,检查路径、参数是否存在转义或缺失问题。
内容的提问来源于stack exchange,提问作者Daniel Lawton
相关产品推荐
相关产品推荐

