我正在使用Prawn从 HTML 源生成我的 PDF 文件。该 HTML 仅包含一些基本格式,例如粗体、斜体、下划线、有序列表和无序列表。对于前三个,Prawn 将负责:inline_format => true
在text
命令中使用。
我如何告诉 Prawn 理解ul
和ol
标记并将它们转换为 PDF 文件中的列表?我知道我应该使用一些帮手。有人遇到过这种情况吗?
谢谢!
我正在使用Prawn从 HTML 源生成我的 PDF 文件。该 HTML 仅包含一些基本格式,例如粗体、斜体、下划线、有序列表和无序列表。对于前三个,Prawn 将负责:inline_format => true
在text
命令中使用。
我如何告诉 Prawn 理解ul
和ol
标记并将它们转换为 PDF 文件中的列表?我知道我应该使用一些帮手。有人遇到过这种情况吗?
谢谢!
因此,Prawn 不提供内置的 HTML 解析,因此它不知道ul
andli
标签的含义。大虾的文本框可能是最接近的选择。
编辑:
--
为此,这里有一个小而可行的实现:
说html字符串是<ul><li>First line</li><li>Second line</li></ul>
使用任何 Ruby HTML 解析器,您都可以解析这些行。在这里,我使用了 Nokogiri。
require 'nokogiri'
require 'prawn'
Prawn::Document.generate "result.pdf" do |pdf|
Nokogiri::HTML("html_string_above").xpath('//li').each do |node|
pdf.text_box "#{node.inner_html}"
end
end
--
使用 html 到 pdf 转换 gem 来实现这一点会容易得多。看看WickedPDF项目。
我最终自己构建了一个小助手,它可能不是很干净,但似乎与整洁的 HTML 配合得很好
def parse_lists(body)
# add a bullet for each line in a list.
body = body.gsub(/<li>/, "<li>#{Prawn::Text::NBSP * 3}<font size='20'> • </font>")
# add a line break for any list element, since li, ol and ul will be later removed.
body.gsub(/<\/ul>/, "</ul><br>").gsub(/<\/li>/, "</li><br>").gsub(/<\/ol>/, "</ol><br>")
end
后来我将其与一些 HTML 清理一起使用,并从text parse_lists(body), :inline_format => true
Prawn 命令中调用。
我将 Kashyap 的答案标记为正确,因为它可能更加一致,但也留下了这个工作的狙击手,以防它帮助其他人。
一个好的方法是提供一种使用 Nokogiri预处理HTML 字符串的方法,只在文本中保留 Prawn 可以使用“inline_format”选项管理的基本标签:
def self.render_html_text(instr)
# Replacing <p> tag
outstr = instr.gsub('<p>',"\n")
outstr.gsub!('</p>',"\n")
# Replacing <ul> & <li> tags
doc = Nokogiri::HTML(outstr)
doc.search('//ul').each do |ul|
content = Nokogiri::HTML(ul.inner_html).xpath('//li').map{|n| "• #{n.inner_html}\n"}.join
ul.replace(content)
end
#removing some <html><body> tags inserted by Nokogiri
doc.at_xpath('//body').inner_html
end