8

Ich bin in der Lage mit pdf-Datei zum Download:Erzeugungs pdf hängt an Schienen 4 mit PDFKit gem

curl google.com | wkhtmltopdf - test.pdf 

so bedeutet es, wkhtmlpdf Installation erfolgreich war.

Aber wenn ich versuche, PDF-Datei durch Zugriff auf http://localhost:3000/contacts/1.pdf zu generieren, hängt es. In der Statusleiste zeigt es: Waiting for localhost...

Rails Server Ausgabe:

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" 

Nach dem PDFKit railscast dies sein sollte, genug für das Generieren von PDF-Dateien, indem Sie einfachhinzufügen 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 %> 

Layouts/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> 

UPDATE 2:

Dank @Arman H für die Hilfe, um herauszufinden, dass ich absoluten Pfad für Assets anstelle von relativen angeben muss. Wenn ich die folgenden Zeilen entfernt war ich in der Lage PDF-Datei zu erzeugen:

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

Jetzt kann ich nicht bekommen, wie diese mit einem absoluten Pfade zu ersetzen. Es scheint, dass dies post ist, was ich brauche, aber ich kann immer noch nicht herausfinden, wie das für meinen Fall aussehen würde.

+0

Wie lange hängt es? Erhalten Sie irgendwelche Fehler von 'wkhtmltopdf' in der Rails-Konsole? Manchmal scheint es zu hängen, aber es dauert wirklich lange, das PDF zu verarbeiten. Wie lange hast du es laufen lassen, bevor du die Anfrage abgeschafft hast? –

+0

Das Problem oben hatte ich auf Mac OS x. Jetzt habe ich dasselbe auf Linux Mint. Es ist immer noch "Warten auf localhost ..." für 20 min und es scheint, dass dies endlos sein wird. Ich muss den Server nur mit Strg + C abbrechen. – Askar

+0

Wenn ich den Server nach 40 Minuten heruntergefahren habe, erzeugte er eine PDF-Datei für mich. Ich versuchte erneut, den Server nach 1 Minute herunterzufahren, in diesem Fall zeigte es: Befehl fehlgeschlagen:/usr/bin/wkhtmltopdf - Seitengröße Letter --margin-top 0,75 - margin-rechts 0,75 - margin-bottom 0.75in --margin-left 0.75in --encoding UTF-8 --quiet - - – Askar

Antwort

8

Die Emission war wegen stylesheet_link_tag und javascript_include_tag relative URLs verwenden, die oft wkhtmltopdf verursacht hängen, wenn Vermögenswerte aus dem gleichen Server laden, die wkhtmltopdf auf laufen.

Mit absolute URLs für Assets löste das Problem.

Set asset_host in Rails' config, die auch stylesheet_link_tag und javascript_include_tag beeinflusst: eigentlich nicht für mich arbeiten

# 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

Danke! In der Config, welche Datei soll ich bearbeiten? Ich habe keinen Hostnamen, ich betreibe die App lokal. Was soll ich in diesem Fall anstelle von "http://mysite.com" angeben? – Askar

+0

Entweder "localhost" oder "127.0.0.1" (oder die lokale IP, die Sie von der Rails-Konsole erhalten). –

+0

Welche Datei soll ich bearbeiten, um config.action_controller.asset_host = "http://mysite.com" hinzuzufügen? – Askar

3

Einstellung config.action_controller.asset_host = "http://localhost" in development.rb. Das heißt, die PDF-Generierung würde funktionieren, aber beim Rendern von HTML würden Assets nicht durchkommen.

folgte ich die Methode hier: http://jguimont.com/post/2627758108/pdfkit-and-its-middleware-on-heroku

und es wie ein Zauber für mich gearbeitet. Hoffe, das hilft jemandem. Werfen Sie einfach die Datei "assents.rb" in config/intialisers und schon können Sie loslegen.

+0

das ist die viel bessere antwort! Vielen Dank!!!!! – Axil

+0

das bedeutet lokal wo? Front oder Backend? – Axil

+0

Haben Sie von einer IP-Adresse auf 'localhost' zugegriffen, oder umgekehrt? Das heißt, vielleicht haben Sie 'asset_host =" http: // localhost "' gesetzt, aber haben versucht, über 'http: // 127.0.0.1/my_app/some-route' zu ​​generieren? –

0

Ich hatte das gleiche Problem, in dem mein Protokoll zeigte, dass die Seite gerendert hatte, aber keine pdf wurde generiert und der Browser würde hängen. Am Ende hatte es nichts mit OS-Kompatibilität, fehlenden Librariern, Gems oder Abhängigkeiten zu tun, sondern ich musste die maximal zulässige Thread-Anzahl für meinen Puma-Server (die auf 1 gesetzt wurde) auf 2 oder mehr erhöhen. Dies erzeugt dann PDF's als normal.