回答
我会与wicked_pdf
红宝石的宝石,它的自由结合使用wkhtmltopdf
shell工具 ,并使用QtWebKit的渲染你的HTML到PDF。例如,还为图表执行JavaScript。你可以找到有关安装的详细信息:https://github.com/mileszs/wicked_pdf
谢谢。我正在使用wicked_pdf rails插件。不过,我创建了一个新帖子。基本上我的问题是与页眉和页脚选项。我在Windows平台上使用rails 2.3.8。 – maxiperez
我有一个已经使用PrinceXML生产了几年的一个Rails应用程序。这是一个昂贵的 - 服务器许可证大约4K美元 - 但在PDF文件中呈现HTML + CSS做得非常好。我没有看过较新的解决方案,因为这个解决方案付费并且工作得很好。
对于它的价值,这里的一些代码,我适应from Subimage Interactive进行转换简单:
的lib/prince.rb
# Prince XML Ruby interface.
# http://www.princexml.com
#
# Library by Subimage Interactive - http://www.subimage.com
#
#
# USAGE
# -----------------------------------------------------------------------------
# prince = Prince.new()
# html_string = render_to_string(:template => 'some_document')
# send_data(
# prince.pdf_from_string(html_string),
# :filename => 'some_document.pdf'
# :type => 'application/pdf'
# )
#
class Prince
attr_accessor :exe_path, :style_sheets, :log_file
# Initialize method
#
def initialize()
# Finds where the application lives, so we can call it.
@exe_path = '/usr/local/bin/prince'
case Rails.env
when 'production', 'staging'
# use default hard-coded path
else
if File.exist?(@exe_path)
# use default hard-coded path
else
@exe_path = `which prince`.chomp
end
end
@style_sheets = ''
@log_file = "#{::Rails.root}/log/prince.log"
end
# Sets stylesheets...
# Can pass in multiple paths for css files.
#
def add_style_sheets(*sheets)
for sheet in sheets do
@style_sheets << " -s #{sheet} "
end
end
# Returns fully formed executable path with any command line switches
# we've set based on our variables.
#
def exe_path
# Add any standard cmd line arguments we need to pass
@exe_path << " --input=html --server --log=#{@log_file} "
@exe_path << @style_sheets
return @exe_path
end
# Makes a pdf from a passed in string.
#
# Returns PDF as a stream, so we can use send_data to shoot
# it down the pipe using Rails.
#
def pdf_from_string(string)
path = self.exe_path()
# Don't spew errors to the standard out...and set up to take IO
# as input and output
path << ' --silent - -o -'
# Show the command used...
#logger.info "\n\nPRINCE XML PDF COMMAND"
#logger.info path
#logger.info ''
# Actually call the prince command, and pass the entire data stream back.
pdf = IO.popen(path, "w+")
pdf.puts(string)
pdf.close_write
output = pdf.gets(nil)
pdf.close_read
return output
end
end
的lib/pdf_helper.rb
module PdfHelper
require 'prince'
private
def make_pdf(template_path, pdf_name, stylesheets = [], skip_base_pdf_stylesheet = false)
# application notices should never be included in PDFs, pull them from session here
notices = nil
if !flash.now[:notice].nil?
notices = flash.now[:notice]
flash.now[:notice] = nil
end
if !flash[:notice].nil?
notices = '' if notices.nil?
notices << flash[:notice]
flash[:notice] = nil
end
prince = Prince.new()
# Sets style sheets on PDF renderer.
stylesheet_base = "#{::Rails.root}/public/stylesheets"
prince.add_style_sheets(
"#{stylesheet_base}/application.css",
"#{stylesheet_base}/print.css"
)
prince.add_style_sheets("#{stylesheet_base}/pdf.css") unless skip_base_pdf_stylesheet
if 0 < stylesheets.size
stylesheets.each { |s| prince.add_style_sheets("#{stylesheet_base}/#{s}.css") }
end
# Set RAILS_ASSET_ID to blank string or rails appends some time after
# to prevent file caching, messing up local - disk requests.
ENV['RAILS_ASSET_ID'] = ''
html_string = render_to_string(:template => template_path, :layout => 'application')
# Make all paths relative, on disk paths...
html_string.gsub!("src=\"", "src=\"#{::Rails.root}/public")
html_string.gsub!("src=\"#{::Rails.root}/public#{::Rails.root}", "src=\"#{::Rails.root}")
# re-insert any application notices into the session
if !notices.nil?
flash[:notice] = notices
end
return prince.pdf_from_string(html_string)
end
def make_and_send_pdf(template_path, pdf_name, stylesheets = [], skip_base_pdf_stylesheet = false)
send_data(
make_pdf(template_path, pdf_name, stylesheets, skip_base_pdf_stylesheet),
:filename => pdf_name,
:type => 'application/pdf'
)
end
end
样本控制器动作
include PdfHelper
def pdf
index
make_and_send_pdf '/ads/index', "#{filename}.pdf"
end
您可以直接使用acts_as_flying_saucer library.For头现有的HTML转换为PDF和页脚,你可以参考 https://github.com/amardaxini/acts_as_flying_saucer/wiki/PDF-Header-Footer
- 1. 将html呈现为pdf
- 2. 如何让Rails为PDFKit呈现PDF特定的HTML?
- 3. 如何呈现HTML Django页面为PDF?
- 4. UIPrintPageRenderer呈现为PDF(字体呈现)
- 5. Rails的QR码呈现为HTML表格
- 6. Rails将html呈现为散列值
- 7. Rails的呈现在HTML
- 8. 将报告呈现为pdf
- 9. pdf.js呈现为PDF与base64
- 10. 从HTML中的其他域呈现PDF
- 11. 从定制Html呈现定制PDF
- 12. Rails:在一个请求中呈现html和js
- 13. 呈现多个HTML表
- 14. Rails:将HTML转换为PDF?
- 15. Rails 2.3.8问题
- 16. Rails 2.3.8 + mongrel
- 17. 如何将HTML呈现为jQuery.tmpl()中呈现的HTML?
- 18. 将HTML呈现为PNG/JPEG
- 19. 将HTML呈现为TIFF
- 20. 使用PhantomJS在DOMContentLoaded/Document Ready上将HTML呈现为PDF
- 21. 在Java中提取PDF文件并呈现为HTML
- 22. 当将HTML转换为PDF时页脚无法呈现
- 23. 使用可变数据呈现HTML并将其转换为PDF
- 24. 获取jspdf将html呈现为PDF需要帮助
- 25. 在rails中呈现HTML文件
- 26. 呈现HTML而不是JSON:Ruby on Rails
- 27. rails:404.html不在IE中呈现
- 28. jQuery从Rails视图呈现html
- 29. 呈现多个文件 - rails
- 30. 呈现一个html元素数组
虾使用wkhtmltopdf这是一个伟大的图书馆,即使是在待机独自一人:自由而直挺。 – apneadiving