2011-11-08 48 views
18

我有一個使用pdfkit創建pdf文檔的rails 3.1應用程序,並且除了生成的pdf沒有任何樣式的事實之外,所有工作都按照指定的方式工作。我假設wkhtmltopdf無法訪問我的樣式表,並且它不是一個比這更大的問題。任何人都不知道如何允許訪問這些樣式表?我基本上遵循了這個主題上的railscast#220,但是我不得不創建一個新的初始化器來讓pdfkit與rails 3.1一起工作。pdfkit沒有樣式pdfs

這是我不得不用得到pdfkit使用Rails初始化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 
} 

到PDF鏈接看起來是這樣的:

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

這會給我一個鏈接到沒有造型的pdf。

在我的application.rb中我已經配置pdfkit這樣:

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

我也添加到了我的佈局/ application.html.erb文件:

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

我增加了一些更多的代碼,如果你需要一個視覺或任何其他信息,我會很樂意效勞。 – tomciopp

+0

我遇到同樣的問題。使用Rails 3.1和資產管道渲染所有上述初始化器和黑客無用。無法找出解決辦法。 – Nuby

+0

你確定指定了':media =>「all」嗎?我很驚訝地發現默認只是「屏幕」。另一種檢查方法:如果您要求瀏覽器進行打印,頁面樣式是? –

回答

1

我已經使用寶石'wicked_pdf'及其幫助者將CSS包含在頁面中。內部助手只是讀取所有CSS文件並將其包含在頁面本身中。因此,如果您更喜歡使用PdfKit,請嘗試調查如何包含非內聯樣式表。

0

我已成功運行PDFKit on Rails 3.1。但我已經使用了different setup

起初我遇到了同樣的問題,但那是因爲stylesheet_link_tag的默認設置爲media => "screen";明確指定media => "all"修復它。

+2

我在layouts/application.html.erb文件中指定了media =>「all」,所以不應該成爲問題。你能詳細闡述一下你的不同設置嗎,這樣我就可以看到這是否會使這項工作成爲可能?你有沒有檢查過,看看它是否也能用於生產環境,因爲你只改變了開發環境? – tomciopp

+0

@ demondeac11:我看到你指定了它,但也許你正在使用另一種佈局?您是否檢查是否要求Chrome打印您的網頁將其設爲樣式?按照我的不同設置的鏈接。生產設置將取決於您的環境,通常您將擁有靜態資產(可能來自CDN或負載平衡器等)...... –

2

我也遇到了這個問題,看來當資產管道被添加到Rails 3.1中時,pdfkit在樣式錶鏈接中存在問題。有關此問題,請參閱GitHub issue

我結束了切換到wicked_pdf,我真的很高興。他們已經解決了這個問題,它在Rails 3.2.x上很好地工作(還沒有試過3.1.x)。

2

對我來說,這是與Ubuntu的安裝問題。我只是從源代碼重新安裝:

# 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 

現在一切正常。所以我的建議是不要通過此命令安裝wkhtmltopdf sudo apt-get install wkhtmltopdf並從源代碼安裝它。全instructions 安裝過程

2

我知道你正在尋找解決方案,它將使整個頁面,只是提醒人們使用Google仍然有問題免費解決方法

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 

現在的PDF文件。CSS必須是CSS,所以teoretically如果你需要加載青菜從預編譯的公共/資產加載/

+1

我們如何從開發環境中的公共/資產加載scss文件? –

+0

使用'Sass.compile(File.read(path_to_file))',然後保存.css文件並將路徑傳遞給PDFKit實例。 – hlcs

5

https://github.com/pdfkit/pdfkit/blob/master/lib/pdfkit/middleware.rb

發現中間件代碼偷了幾行,您可以使用:

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

我的例子是:

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

謝謝!真的有幫助! – NickGnd