在大虾中使用列表

dav*_*idb 12 ruby-on-rails prawn

我正在使用prawn创建包含表格格式和一些列表的大量数据的pdf.列表的问题是我只是使用文本作为列表,因为没有语义等同于ul> li列表,就像我在webfrointend中使用它们一样.因此列表不合理.使用多行的列表点看起来很狡猾,因为我不适合列表图标.如何在虾中实现看起来不像垃圾的列表?

小智 25

Prawn是一个很好的PDF库,但问题是它自己的视图系统.有Prawn格式但不再维护.

我建议使用WickedPDF,它允许您在PDF中包含简单的ERB代码.

使用Prawn:另一个肮脏和丑陋的解决方案是没有边框的两列表,第一列包含list-bullet,第二列文本:

table([ ["•", "First Element"],
        ["•", "Second Element"],
        ["•", "Third Element"] ])
Run Code Online (Sandbox Code Playgroud)

  • 大!您还可以使用`cell_style:{borders:[]}`作为选项来摆脱边框并使其看起来像一个实际的列表. (2认同)

小智 9

我刚刚遇到了类似的问题并在Prawn中解决了与使用表格略有不同的方法:

["Item 1","Item 2","Item 3"].each() do |list-item|

  #create a bounding box for the list-item label
  #float it so that the cursor doesn't move down
  float do
    bounding_box [15,cursor], :width => 10 do
      text "•"
    end
  end

  #create a bounding box for the list-item content
  bounding_box [25,cursor], :width => 600 do
    text list-item
  end

  #provide a space between list-items
  move_down(5)

end
Run Code Online (Sandbox Code Playgroud)

这显然可以扩展(例如,您可以使用each_with_index()而不是每个()来编号.它还允许边界框中的任意内容(表中不允许).

  • 当 PDF 文档有多个页面时,此解决方案会出现问题:当文本转到下一页时,它会显示在底部。 (2认同)

Nic*_*now 5

一个很好的解决方案,既尊重光标位置,又像一个真正的列表一样用少量代码行呈现:

items = ["first","second","third"]
def bullet_list(items)
  start_new_page if cursor < 50
  items.each do |item|
    text_box "•", at: [13, cursor]
    indent(30) do
      text item
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

start_new_page 子句涵盖项目符号行项目可能需要进入下一页的情况。这将保持项目符号与项目符号内容保持一致。

示例 PDF 渲染屏幕截图:

示例渲染列表