集成wicked_pdf生成PDF提示failed to load PDF document如何解决
wicked_pdf生成PDF加载失败解决方案
1. 修正控制器render参数配置
你当前的render参数逻辑错误:pdf字段对应生成后的PDF文件名,不是待渲染的模板路径,缺失template参数指定渲染模板会导致wicked_pdf无法生成有效内容,最终得到损坏的PDF文件。
修改后的控制器代码参考:
def index respond_to do |format| format.html format.pdf do render pdf: "index", # 此处为生成PDF的文件名,无需加后缀 template: "控制器文件夹名/index.pdf.haml", # 替换为实际模板路径,例:控制器为ArticlesController则填articles/index.pdf.haml layout: 'pdf', # 布局无需写后缀,框架会自动匹配对应格式模板 page_size: 'A4', disposition: 'inline' end end end
2. 确认wkhtmltopdf可执行文件正常可用
在项目运行环境的终端执行命令:wkhtmltopdf --version
- 若能正常输出版本号则无问题
- 若提示命令不存在,二选一解决:
- 安装对应系统的wkhtmltopdf二进制安装包,之后在
config/initializers/wicked_pdf.rb中取消exe_path的注释,填写wkhtmltopdf实际执行路径 - 在Gemfile中添加
gem 'wkhtmltopdf-binary',执行bundle install后无需手动配置执行路径
- 安装对应系统的wkhtmltopdf二进制安装包,之后在
3. 验证模板&布局文件路径正确
确认两个文件路径正确:
index.pdf.haml存放在app/views/控制器文件夹名/目录下pdf.html.haml存放在app/views/layouts/目录下,若没有对应布局文件可先删除render中的layout参数,用默认布局测试
4. 排查渲染方法冲突
你之前为解决exception reentered错误添加的remove_method(:render)代码,可先临时注释后重启服务,测试是否是该代码导致的渲染冲突。
5. 排除浏览器兼容问题
将render中的disposition: 'inline'改为disposition: 'attachment',先将PDF下载到本地打开,若本地打开正常则说明是浏览器内置PDF阅读器的兼容问题。
内容的提问来源于stack exchange,提问作者Shruikan
相关产品推荐
相关产品推荐

