2011-11-08 7 views
18

Ho un'app per rails 3.1 che crea documenti pdf con pdfkit e tutto funziona come specificato, tranne per il fatto che i pdf generati non hanno alcuno stile. Suppongo che wkhtmltopdf non abbia accesso ai miei fogli di stile e che non sia un problema più grande di quello. Qualcuno potrebbe avere un'idea di come consentire l'accesso a questi fogli di stile? Ho praticamente seguito railscast n. 220 sull'argomento, tuttavia ho dovuto creare un nuovo inizializzatore per far funzionare pdfkit con i binari 3.1.pdfkit non ha stile pdf

Questa è l'inizializzatore che ho dovuto usare per ottenere PDFKit a lavorare con le rotaie 3,1

ActionController::Base.asset_host = Proc.new { |source, request| 
    if request.env["REQUEST_PATH"].include? ".pdf" 
    "file://#{Rails.root.join('public')}" 
    else 
    "#{request.protocol}#{request.host_with_port}" 
    end 
} 

Il link al pdf è simile al seguente:

<%= link_to 'Download PDF', load_path(@load, :format => "pdf") %> 

Questo mi darà un link al pdf che non ha stile. gemma

<%= stylesheet_link_tag "application", :media => "all" %> 
+0

ho aggiunto un po 'di codice, se avete bisogno di una visuale o qualsiasi altra informazione, sarei felice di farlo. – tomciopp

+0

Sto avendo lo stesso problema. L'uso di Rails 3.1 e la pipeline di asset rende inutili tutti gli inizializzatori e gli hack sopra menzionati. Non riesco a capire un modo per aggirarlo. – Nuby

+0

Sei sicuro che ': media =>" tutto "' è specificato? Sono stato sorpreso di vedere che l'impostazione predefinita è solo 'schermo'. Un altro modo per controllare: se chiedi al tuo browser di stampare, la pagina è stilizzata? –

risposta

1

ho usato: PDFKit

Nel mio application.rb Ho configurato come tale:

config.middleware.use PDFKit::Middleware, :print_media_type => true 

Ho anche aggiunto questo per il mio layout/file di application.html.erb 'wicked_pdf' e i suoi aiutanti per includere i CSS nelle pagine. Internamente gli helper leggono solo tutti i file CSS e li includono nella pagina stessa. Quindi, se preferisci usare PdfKit, prova ad investigare come includere fogli di stile non in linea.

0

Ho eseguito correttamente PDFKit su Rails 3.1. Ho usato un different setup però.

All'inizio ho avuto lo stesso problema che hai fatto ma quello era perché stylesheet_link_tag ha un valore predefinito su media => "screen"; specificando esplicitamente media => "all" risolto.

+2

Ho specificato media => "tutto" nel file layouts/application.html.erb in modo che non dovrebbe essere il problema. Puoi approfondire ulteriormente la tua diversa configurazione in modo da poter vedere se questo farà funzionare? Hai controllato se questo funzionerà anche in un ambiente di produzione dato che hai solo modificato l'ambiente di sviluppo? – tomciopp

+0

@ demondeac11: ho visto che l'hai specificato, ma forse stai usando un altro layout? Hai verificato se chiedere a Chrome di stampare la tua pagina lo avrà in stile? Segui il link alla mia diversa configurazione. I setup per la produzione dipenderanno dal tuo ambiente e in genere avrai le tue risorse servite staticamente, magari da una CDN, o load balancer, ecc ... –

2

Mi sono imbattuto in questo problema, e sembra che quando la pipeline delle risorse è stata aggiunta in Rails 3.1, pdfkit ha un problema con i collegamenti del foglio di stile. Vedere lo GitHub issue su questo problema.

Ho finito per passare a wicked_pdf e sono davvero felice con esso. Hanno risolto questo problema e funziona bene su Rails 3.2.x (non ho provato 3.1.x).

2

Per me è stato un problema con l'installazione di ubuntu. Ho appena reinstallato dalla fonte:

# first, installing dependencies 
sudo aptitude install openssl build-essential xorg libssl-dev 

# for 64bits OS 
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-amd64.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-amd64.tar.bz2 
mv wkhtmltopdf-amd64 /usr/local/bin/wkhtmltopdf 
chmod +x /usr/local/bin/wkhtmltopdf 

# for 32bits OS 
wget http://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.9.9-static-i386.tar.bz2 
tar xvjf wkhtmltopdf-0.9.9-static-i386.tar.bz2 
mv wkhtmltopdf-i386 /usr/local/bin/wkhtmltopdf 
chmod +x /usr/local/bin/wkhtmltopdf 

E tutto ora funziona per me. Quindi il mio consiglio è di non installare wkhtmltopdf con questo comando sudo apt-get install wkhtmltopdf e installarlo dai sorgenti. Pieno instructions per il processo di installazione

2

So che stai cercando soluzione che renda pagina intera, solo promemoria per googling la gente che c'è ancora problemi soluzione libera

class DocumentController < ApplicationController 

    def show 
    @document = Document.last 
    # ... implement your respond_to 

    kit = PDFKit.new(@document.content, :page_size => 'Letter') 
    kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/pdf.css" 
    send_data kit.to_pdf, :filename => "#{@document.title}.pdf", :type => 'application/pdf' 
    end 

end 

ora il pdf.css deve essere css, quindi teoretically se è necessario caricare sass caricarlo da/beni pubblici pre-compilati/

+1

come carichiamo un file scss dal pubblico/assets nel dev env? –

+0

Usa 'Sass.compile (File.read (path_to_file))' quindi salva il file .css e passa il percorso all'istanza PDFKit. – hlcs

5

Rubare un paio di righe di codice middleware trovato alla https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/middleware.rb

È possibile utilizzare:

root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/" 
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2') 

Il mio esempio è:

html = render_to_string #render current action to string 
root = PDFKit.configuration.root_url || "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}/" 
html.gsub!(/(href|src)=(['"])\/([^\"']*|[^"']*)['"]/, '\1=\2' + root + '\3\2') 
kit = PDFKit.new(html, :print_media_type => true) 
+0

Grazie! Davvero utile! – NickGnd