簡體   English   中英

Rails 3 Wicked PDF-包括回形針S3 pdf文件

[英]Rails 3 Wicked PDF - include Paperclip S3 pdf files

我有一個使用這些寶石的Rails 3應用程序:

gem 'paperclip'
gem 'wicked_pdf'
gem 'combine_pdf'

我使用wicked_pdf打開了一個pdf costproject costproject有一個名為viewproject.pdf.erb的HTML頁面。

我正在嘗試將邪惡的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

pdf << CombinePDF.new(pdf2)pdf << CombinePDF.new(pdf2)給我:

string contains null byte

如果我看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 

我也嘗試過pdf << CombinePDF.new(pdf2.to_pdf)

謝謝您的幫助!

更新1

作為測試,以查看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

更新2

關於使用parse Myst是正確的。 謝謝!

我現在在控制器代碼中使用此行:

pdf << CombinePDF.new(attachment.attach.url)

我收到此錯誤:

No such file or directory - http://s3.amazonaws.com/ ...

但是,如果我復制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

*性能影響取決於您擁有的PDF附件數量,應用程序擁有的用戶數量,網絡流量,框架(單線程/多線程)和其他因素。

持久連接應以戲劇性的方式減少性能下降,這主要是由於建立連接是一項昂貴的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM