Red*_*irt 1 ruby-on-rails paperclip wicked-pdf
我有一个使用这些宝石的Rails 3应用程序:
gem 'paperclip'
gem 'wicked_pdf'
gem 'combine_pdf'
Run Code Online (Sandbox Code Playgroud)
我正在用wicked_pdf一个pdf打开costproject.该costproject有所谓的HTML页面viewproject.pdf.erb.
我正在尝试将邪恶的pdf与costproject附件合并为一个pdf.
这是我的控制器代码:
def viewproject
@costproject = Costproject.find(params[:costproject_id])
respond_to do |format|
format.html
format.pdf do
pdf = CombinePDF.new
pdf2 = render_to_string pdf: "Costproject.pdf", template: "costprojects/viewproject", encoding: "UTF-8"
pdf << CombinePDF.new(pdf2)
@costproject.attachments.each do |attachment|
pdf << CombinePDF.new(attachment.attach.path)
end
send_data pdf.to_pdf, :disposition => 'inline', :type => "application/pdf"
end
end
end
Run Code Online (Sandbox Code Playgroud)
这条线pdf << CombinePDF.new(pdf2)给了我:
string contains null byte
Run Code Online (Sandbox Code Playgroud)
如果我看一下pdf2,就会这样开始 - 所以它看起来像一个pdf:
>> pdf2
=> "%PDF-1.4\n1 0 obj\n<<\n/Title (\xFE\xFF)\n/Producer (wkhtmltopdf)\n/CreationDate (D:20150405202628)\n>>\nendobj\n4 0 obj\n<<\n/Type /ExtGState\n/SA true\n/SM 0.02\n/ca 1.0\n/CA 1.0\n/AIS false\n/SMask /None>>\nendobj\n5 0 obj\n[/Pattern /DeviceRGB]\nendobj\n8 0 obj\n<<\n/Type /XObject\n/Subtype /Image\n/Width 71\n/Height 75\n/BitsPerComponent 8\n/ColorSpace /DeviceRGB\n/Length 9 0 R\n/Filter
Run Code Online (Sandbox Code Playgroud)
我也试过了 pdf << CombinePDF.new(pdf2.to_pdf)
谢谢您的帮助!
UPDATE1
作为测试,看看pdf2是否正常工作,我成功地做到了:
def viewproject
@costproject = Costproject.find(params[:costproject_id])
respond_to do |format|
format.html
format.pdf do
pdf2 = render_to_string pdf: "Costproject.pdf", template: "costprojects/viewproject", encoding: "UTF-8"
send_data pdf2, :disposition => 'inline', :type => "application/pdf"
end
end
end
Run Code Online (Sandbox Code Playgroud)
UPDATE2
使用时,Myst是正确的parse.谢谢!
我现在在控制器代码中使用这一行:
pdf << CombinePDF.new(attachment.attach.url)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
No such file or directory - http://s3.amazonaws.com/ ...
Run Code Online (Sandbox Code Playgroud)
但是,如果我复制http地址并粘贴到浏览器中,则显示pdf.
我正在编辑此答案以反映远程存储的PDF文件的问题.
我应该指出,如果没有与S3存储的持久连接并且不使用S3 API,以下解决方案将影响性能*.
正如我所指出的,CombinePDF.new方法与CombinePDF.load方法相同.它接受文件名并尝试打开该文件.CombinePDF.parse方法将接受原始PDF数据并将其解析为PDF对象.
在下面的代码中,我Net::HTTP.get(URI.parse(url))用来获取原始PDF数据.
我建议使用S3本机解决方案替换此解决方案,以便整个应用程序可以共享一个或多个持久连接.这是一个性能问题,可能对您不重要,也可能不重要.
require 'net/http'
def viewproject
@costproject = Costproject.find(params[:costproject_id])
respond_to do |format|
format.html
format.pdf do
pdf = CombinePDF.new
pdf2 = render_to_string pdf: "Costproject.pdf", template: "costprojects/viewproject", encoding: "UTF-8"
pdf << CombinePDF.parse(pdf2)
@costproject.attachments.each do |attachment|
pdf << CombinePDF.parse( Net::HTTP.get( URI.parse( attachment.attach.url ) ) )
end
send_data pdf.to_pdf, :disposition => 'inline', :type => "application/pdf"
end
end
end
Run Code Online (Sandbox Code Playgroud)
*性能影响取决于您拥有的PDF附件数量,应用程序用户数量,网络流量,框架(单线程/多线程)和其他因素.
持久连接应该以戏剧性的方式降低性能,主要是因为建立连接是一项昂贵的操作.
| 归档时间: |
|
| 查看次数: |
873 次 |
| 最近记录: |