0

我正在使用Prawn从 HTML 源生成我的 PDF 文件。该 HTML 仅包含一些基本格式,例如粗体、斜体、下划线、有序列表和无序列表。对于前三个,Prawn 将负责:inline_format => truetext命令中使用。

我如何告诉 Prawn 理解ulol标记并将它们转换为 PDF 文件中的列表?我知道我应该使用一些帮手。有人遇到过这种情况吗?

谢谢!

4

3 回答 3

2

因此,Prawn 不提供内置的 HTML 解析,因此它不知道ulandli标签的含义。大虾的文本框可能是最接近的选择。

编辑:

--

为此,这里有一个小而可行的实现:

说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项目。

于 2012-09-23T17:02:54.210 回答
1

我最终自己构建了一个小助手,它可能不是很干净,但似乎与整洁的 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 => truePrawn 命令中调用。

我将 Kashyap 的答案标记为正确,因为它可能更加一致,但也留下了这个工作的狙击手,以防它帮助其他人。

于 2012-09-26T01:25:04.240 回答
1

一个好的方法是提供一种使用 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
于 2018-03-25T15:46:11.343 回答