以纵向而非横向呈现的 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 升级步骤不是这个问题的罪魁祸首。