以纵向而非横向呈现的 pdf 文件
pdf file rendered in portrait instead of landscape
我们正在使用王子 gem 在我们的 rails 4
应用程序上生成 pdf 文档。最近几天,生成的 pdf 以纵向模式呈现,而不是指定的横向模式;此功能多年来一直运行良好。
服务器上的 ruby/rails 版本进行了一些更新,但 pdf 生成代码本身没有任何更改。
一个有趣的方面是,当我在我的机器上本地测试时,pdf 是在开发服务器上以横向模式生成的 (Mac)。相同的代码在 staging/production 服务器 (Linux) 上以纵向模式生成 pdf。
相关代码:
来自 Gemfile
gem 'rails', '4.2.5.1'
gem 'princely', git: "git@github.com:mbleigh/princely.git"
....
PDF 渲染代码:
render :pdf => "ticket",
:template => "admin/tickets/print.pdf.erb",
:stylesheets => ["printpdf.css"]
app/assets/stylesheets/printpdf.css:
@page {
size: 8.5in 11in landscape;
margin: 5mm 5mm 5mm 5mm;
}
@page {
@bottom-right {
content: counter(page);
}
}
#pagebreak {
page-break-after: always;
}
执行的Princely命令(如日志所示):
PRINCE XML PDF COMMAND
/usr/local/bin/prince --input=html --server --log=/Users/prakash/Projects/main_project/log/prince.log -s /Users/prakash/Projects/main_project/app/assets/stylesheets/printpdf.css --silent - -o -
最近Rails版本由4.2.4
变更为4.2.5.1
,ruby版本由2.2.0
变更为2.3.0
。我在登台服务器上回滚了这两个更改,但恢复这些更改都没有修复纵向而不是横向问题。
如果有任何关于在哪里寻找此问题的根本原因以及如何解决的建议,我们将不胜感激。
如果您无法通过 princely 解决这个问题,请查看 combine_pdf,这里有一个旋转 pdf 文件并将其保存到另一个文件的示例。
require "combine_pdf"
pdf = CombinePDF.load("file.pdf")
pdf.pages.each {|p| p.orientation :landscape }
pdf.save 'my.pdf'
最终解决方案
由于 this issue,此问题已通过将 sprockets-rails
gem 从 3.0.0
降级到 2.3.3
来解决。
我是怎么到那里的
在 princexml
命令行实用程序生成的 prince.log
文件中发现一条错误消息,其中显示 printpdf.css: warning: can't open input file: No such file or directory
这让我意识到 princexml
命令行实用程序被传递 printpdf.css
作为 css 文件的值,而不是完全限定的路径:/Users/prakash/Projects/main_project/app/assets/stylesheets/printpdf.css
上演。
调试通过princely code,发现Rails.application.assets
在这里返回为nil。
我在这个练习中注意到的另一件有趣的事情:
将 rails 版本从 4.2.5.1
降级到 4.2.4
最初是为了回滚我的所有更改并没有将 sprockets-rails
gem 的版本降级到 2.3.3
;它仍然保持在 3.0.0
;因此我的结论是 rails 升级步骤不是这个问题的罪魁祸首。
我们正在使用王子 gem 在我们的 rails 4
应用程序上生成 pdf 文档。最近几天,生成的 pdf 以纵向模式呈现,而不是指定的横向模式;此功能多年来一直运行良好。
服务器上的 ruby/rails 版本进行了一些更新,但 pdf 生成代码本身没有任何更改。
一个有趣的方面是,当我在我的机器上本地测试时,pdf 是在开发服务器上以横向模式生成的 (Mac)。相同的代码在 staging/production 服务器 (Linux) 上以纵向模式生成 pdf。
相关代码:
来自 Gemfile
gem 'rails', '4.2.5.1'
gem 'princely', git: "git@github.com:mbleigh/princely.git"
....
PDF 渲染代码:
render :pdf => "ticket",
:template => "admin/tickets/print.pdf.erb",
:stylesheets => ["printpdf.css"]
app/assets/stylesheets/printpdf.css:
@page {
size: 8.5in 11in landscape;
margin: 5mm 5mm 5mm 5mm;
}
@page {
@bottom-right {
content: counter(page);
}
}
#pagebreak {
page-break-after: always;
}
执行的Princely命令(如日志所示):
PRINCE XML PDF COMMAND
/usr/local/bin/prince --input=html --server --log=/Users/prakash/Projects/main_project/log/prince.log -s /Users/prakash/Projects/main_project/app/assets/stylesheets/printpdf.css --silent - -o -
最近Rails版本由4.2.4
变更为4.2.5.1
,ruby版本由2.2.0
变更为2.3.0
。我在登台服务器上回滚了这两个更改,但恢复这些更改都没有修复纵向而不是横向问题。
如果有任何关于在哪里寻找此问题的根本原因以及如何解决的建议,我们将不胜感激。
如果您无法通过 princely 解决这个问题,请查看 combine_pdf,这里有一个旋转 pdf 文件并将其保存到另一个文件的示例。
require "combine_pdf"
pdf = CombinePDF.load("file.pdf")
pdf.pages.each {|p| p.orientation :landscape }
pdf.save 'my.pdf'
最终解决方案
由于 this issue,此问题已通过将 sprockets-rails
gem 从 3.0.0
降级到 2.3.3
来解决。
我是怎么到那里的
在 princexml
命令行实用程序生成的 prince.log
文件中发现一条错误消息,其中显示 printpdf.css: warning: can't open input file: No such file or directory
这让我意识到 princexml
命令行实用程序被传递 printpdf.css
作为 css 文件的值,而不是完全限定的路径:/Users/prakash/Projects/main_project/app/assets/stylesheets/printpdf.css
上演。
调试通过princely code,发现Rails.application.assets
在这里返回为nil。
我在这个练习中注意到的另一件有趣的事情:
将 rails 版本从 4.2.5.1
降级到 4.2.4
最初是为了回滚我的所有更改并没有将 sprockets-rails
gem 的版本降级到 2.3.3
;它仍然保持在 3.0.0
;因此我的结论是 rails 升级步骤不是这个问题的罪魁祸首。