2015-04-04 1 views
1

У меня есть 3 приложения Rails, который использует эти драгоценные камни:Rails 3 Злая PDF - включают в себя файлы в формате PDF Paperclip S3

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

Я использую wicked_pdf открыть PDF для costproject. costproject имеет HTML-страницу под названием viewproject.pdf.erb.

Я пытаюсь объединить нечестивый pdf с привязкой к стоимости проекта в один 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) дает мне:

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)

Спасибо за помощь!

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 

UPDATE2

Myst было правильным об использовании parse. Благодаря!

Я теперь с помощью этой строки в коде контроллера:

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

Я получаю эту ошибку:

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

Но, если я скопировать адрес HTTP и вставить в браузер Ф показывают вверх.

ответ

5

Я редактирую этот ответ, чтобы отразить проблему удаленных файлов 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 вложений у вас есть, по количеству пользователей приложение имеет, сетевой трафик, на вашей базе (одиночный/многопоточный) и других факторах.

Постоянное соединение должно резко снизить производительность, в основном из-за того, что установление соединений является дорогостоящим действием.

+0

Вы правы в использовании 'parse'. Но теперь у меня проблема, что она работает локально - потому что я сохраняю файлы вложений в Rails, но на Heroku я использую S3. Я пытаюсь использовать другой код для 'pdf << CombinePDF.new (attachment.attach.path) ' – Reddirt

+0

' pdf << CombinePDF.new (attachment.attach.url) 'не работает – Reddirt

+0

Как бы вы обычно получали доступ к необработанному содержимое файла с уровня S3? Он локально установлен? Используете ли вы конкретный API? – Myst

 Смежные вопросы

  • Нет связанных вопросов^_^