如何在Rails中向指定打印机打印HTML格式内容?
实现Rails直接发送打印任务到Linux打印机的方案
嘿,这个需求完全可以实现!我给你两种实用的思路,一种是借助现成的gem简化流程,另一种是纯Ruby+系统命令手动搞定,都能满足你不渲染到浏览器、直接给printer_b发打印任务的需求:
一、推荐:用wicked_pdf转PDF+Linux系统命令打印
这种方式能保证打印样式的一致性,因为HTML转PDF后排版更稳定,适合需要精准样式的场景。
步骤1:准备依赖
- 在Gemfile中添加gem:
然后执行gem 'wicked_pdf'bundle install安装。 - 安装Linux上的HTML转PDF工具
wkhtmltopdf:- Debian/Ubuntu系:
sudo apt-get install wkhtmltopdf - RedHat/CentOS系:
sudo yum install wkhtmltopdf
- Debian/Ubuntu系:
步骤2:控制器中实现打印逻辑
在你的控制器里添加一个动作,负责渲染ERB模板、转PDF并发送到指定打印机:
def send_to_printer # 渲染toprint.html.erb成HTML字符串(可以传动态数据到模板) html_content = render_to_string( template: 'your_controller/toprint', # 替换成实际的模板路径 layout: false, # 不需要渲染应用的全局布局 locals: { data: @your_dynamic_data } # 如果模板需要动态数据,这里传递 ) # 把HTML转成PDF pdf_content = WickedPdf.new.pdf_from_string(html_content) # 创建临时PDF文件 temp_pdf = Tempfile.new(['print_job', '.pdf']) temp_pdf.write(pdf_content) temp_pdf.close # 调用Linux的lpr命令,指定printer_b发送打印任务 system("lpr -P printer_b #{temp_pdf.path}") # 返回响应提示任务已发送 render plain: "打印任务已发送到printer_b" end
二、纯Ruby+系统命令(无需额外gem)
如果不想引入新gem,也可以直接渲染HTML后,用wkhtmltopdf直接通过管道输出到打印机,跳过保存文件的步骤:
def send_to_printer # 渲染模板成HTML字符串 html_content = render_to_string( template: 'your_controller/toprint', layout: false, locals: { data: @your_dynamic_data } ) # 创建临时HTML文件 temp_html = Tempfile.new(['print_html', '.html']) temp_html.write(html_content) temp_html.close # 直接把HTML转成PDF并通过管道发送到printer_b system("wkhtmltopdf #{temp_html.path} - | lpr -P printer_b") render plain: "打印任务已发送到printer_b" end
关键注意事项
- 权限问题:运行Rails的进程(比如Puma、Unicorn)需要有执行
lpr命令的权限,并且能访问系统打印机。可以用lpstat -p printer_b验证打印机是否正常识别。 - 临时文件清理:
Tempfile会在进程结束后自动删除,如果你想手动清理,可以在调用完命令后加temp_pdf.unlink。 - 打印机状态检查:如果打印失败,可以用
lpq -P printer_b查看打印队列状态,排查问题。
内容的提问来源于stack exchange,提问作者Aleksandrus
相关产品推荐
相关产品推荐

