8

軌道4我能下載pdf文件有:生成PDF掛在使用PDFkit寶石

curl google.com | wkhtmltopdf - test.pdf 

所以這意味着,wkhtmlpdf安裝成功。

但是,當我嘗試通過訪問http://localhost:3000/contacts/1.pdf生成pdf文件時,它會掛起。在狀態欄顯示內容:Waiting for localhost...

Rails的服務器輸出:

Started GET "/contacts/1.pdf" for 127.0.0.1 at 2013-07-28 21:45:06 +0900 
    ActiveRecord::SchemaMigration Load (0.1ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Processing by ContactsController#show as HTML 
    Parameters: {"id"=>"1"} 
    Contact Load (0.3ms) SELECT "contacts".* FROM "contacts" WHERE "contacts"."id" = ? LIMIT 1 [["id", "1"]] 
    Rendered contacts/show.html.erb within layouts/application (1.4ms) 
Completed 200 OK in 99ms (Views: 57.0ms | ActiveRecord: 0.7ms) 

的Gemfile:

gem 'pdfkit' 

application.rb中:

config.middleware.use "PDFKit::Middleware" 

按照PDFKit railscast這應該是隻需添加即可生成pdf文件0 ...


UPDATE:

show.html.erb:

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @contact.name %> 
</p> 

<p> 
    <strong>Age:</strong> 
    <%= @contact.age %> 
</p> 

<%= link_to 'Edit', edit_contact_path(@contact) %> | 
<%= link_to 'Back', contacts_path %> 

佈局/ application.html.erb:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Pdftest</title> 
    <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> 
    <%= javascript_include_tag "application", "data-turbolinks-track" => true %> 
    <%= csrf_meta_tags %> 
</head> 
<body> 

<%= yield %> 

</body> 
</html> 

更新2:

感謝@Arman H幫助我弄清楚,我必須爲資產指定絕對路徑而不是相對路徑。當我刪除了以下幾行,我能夠生成PDF文件:

<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %> 
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> 

現在,我不能得到如何與絕對路徑替代這一點。看來這post是我需要的,但我仍然無法弄清楚這對我的情況會如何。

+0

它掛了多久? Rails控制檯中的'wkhtmltopdf'是否有錯誤?有時它似乎掛起,但它只是需要很長時間來處理PDF。在切斷請求之前,您已經運行了多久? –

+0

上面的問題在Mac OS x上有過。現在我在Linux Mint上也一樣。它仍然是「等待本地主機......」20分鐘,看起來這將是無止境的。我只需要按Ctrl + c取消服務器。 – Askar

+0

當我在40分鐘後關閉服務器時,它爲我生成了pdf文件。我在1分鐘後再次嘗試關閉服務器,在這種情況下,它顯示:命令失敗:/ usr/bin/wkhtmltopdf --page-size字母 - 邊距0.75in - 邊距 - 右邊0.75in - 邊緣底部0.75in -margin-left 0.75in --encoding UTF-8 --quiet - - – Askar

回答

8

問題是由於stylesheet_link_tagjavascript_include_tag使用相對URL,這往往會導致wkhtmltopdfwkhtmltopdf上運行在同一臺服務器加載資產時掛起。

使用絕對URL爲資產解決了問題。

asset_host在Rails的配置,這也影響stylesheet_link_tagjavascript_include_tag

# Modify asset host config setting in `config/application.rb` 
# Or create a new initializer: `config/initializers/wkhtmltopdf.rb` 
config.action_controller.asset_host = "http://mysite.com" 

# Or you can have different hosts for development (local) and production (CDN): 
# In `config/environments/development.rb` 
config.action_controller.asset_host = "http://localhost" 
# In `config/environments/production.rb` 
config.action_controller.asset_host = "http://d111111abcdef8.cloudfront.net" 
+0

謝謝!在配置中,我應該編輯哪個文件?我沒有任何主機名,我在本地運行應用程序。我應該在這種情況下指定什麼,而不是「http://mysite.com」? – Askar

+0

「localhost」或「127.0.0.1」(或者你從Rails控制檯獲得的任何本地IP地址)。 –

+0

應該編輯哪個文件以添加config.action_controller.asset_host =「http://mysite.com」? – Askar

3

設置config.action_controller.asset_host = "http://localhost" 在development.rb居然沒有爲我工作。也就是說,PDF生成可以工作,但是當呈現HTML時,資源不會通過。

我這裏遵循的方法:http://jguimont.com/post/2627758108/pdfkit-and-its-middleware-on-heroku

和它的工作對我來說就像魅力。希望這可以幫助某人。只需在config/intializers中拋出assets.rb,你就可以走了。

+0

這是更好的答案!謝謝!!!!! – Axil

+0

這意味着當地在哪裏?前端還是後端? – Axil

+0

你是從IP地址訪問'localhost',反之亦然?也就是說,你可能設置了'asset_host =「http:// localhost」',但試圖通過'http:// 127.0.0.1/my_app/some-route'生成? –

0

我有同樣的問題,其中我的日誌顯示頁面已經呈現,但沒有生成PDF並且瀏覽器會掛起。它最終與操作系統的兼容性,丟失的架構,寶石和依賴關係無關,而是我需要將Puma服務器(已設置爲1)的最大允許線程數提高到2或更多。這然後生成pdf的正常。