2012-05-09 1 views
10

イムは、多くのデータをテーブル形式といくつかのリストに含むpdfを作成するためにエビを使用しています。リストの問題は、私がwebfrointendで使っているようなul> liリストに相当する意味がないので、リストとしてテキストを使用しているということです。リストは正当化されません。複数の行を使用するリスト・ポイントは、リスト・アイコンには合わないので、不安定に見えます。私はどのようにして、クラップスのように見えないリストを実装することができますか?エビのリストを使用する

+0

あなたが何をしようとしたのですか? – tmaximini

+0

私はちょうどテキストとしてripmentリストを試しましたが、コメントが1つ以上の行を持つとすぐに治療と見えます。 – davidb

答えて

23

Prawnは良いPDFライブラリでしたが、問題は独自のビューシステムです。 Prawn-formatがありますが、これ以上管理されません。

WickedPDFを使用することをお勧めします。単純なERBコードをPDFに含めることができます。

エビを使用する:別の汚いと醜いソリューションは、国境ずに2列の表で、最初の列がリスト-弾丸、第2の列のテキストが含まれています:

table([ ["•", "First Element"], 
     ["•", "Second Element"], 
     ["•", "Third Element"] ]) 
+0

ありがとう、これは私のために働くと思う... – davidb

+1

素晴らしい! 'cell_style:{borders:[]}'をオプションとして使用して、枠線を取り除き実際のリストのようにすることもできます。 – Diego

9

私は同様の問題を抱えていましたそして、エビの中にテーブルを使用するよりもわずかに異なる方法でそれを解決:

["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 

これは明らかエクステ可能性がありたとえば、each()ではなくeach_with_index()で番号付きリストを行うことができます。また、バウンディングボックス内の任意のコンテンツを許可します(これはテーブルでは許可されません)。

+1

このソリューションでは、PDFドキュメントに複数のページがあるときに問題が発生します。テキストが次のページに移動すると、そのページが一番下に表示されます。 –

0

回り込みは、crmの回答に似た方法を作成することです。違いは、テキストが別のページに移動しても複数のレベルを持つことができないことです。

def bullet_item(level = 1, string) 
    indent (15 * level), 0 do 
     text "• " + string 
    end 
end 

単純にそうように、このメソッドを呼び出します。

bullet_item(1, "Text for bullet point 1") 
bullet_item(2, "Sub point") 

はリファクタリング気軽に。

4

Adob​​eの内蔵フォントで箇条書きを作成するには、\ u2022を使用します。

\u2022 This will be the first bullet item 
\u2022 blah blah blah 

エビはWinAnsiコードで(グリフ別名)シンボルをサポートしており、これらは、UTF-8でエンコードされなければなりません。詳細については、次の記事を参照してください。https://groups.google.com/forum/#!topic/prawn-ruby/axynpwaqK1g

サラウンドマニュアルには、サポートされているグリフの完全なリストがあります。

+1

なぜこの回答は認識されませんでしたか? @電源 - ちょうどこれを自分で使いました。あなたの構文では二重引用符でカプセル化されていると言わなければなりません。 – Tass

4

これはちょうど顧客のためにこれを行いました。 UL/OLのリストを含むフォーマット済みのHTMLをレンダリングしたいすべての人のために:

def render_html_text(text, pdf) 
    #render text (indented if inside ul) 
    indent = 0 #current indentation (absolute, e.g. n*indent_delta for level n) 
    indent_delta = 10 #indentation step per list level 
    states = [] #whether we have an ol or ul at level n 
    indices = [] #remembers at which index the ol list at level n, currently is 

    #while there is another list tag do 
    # => starting position of list tag is at i 
    # render everything that comes before the tag 
    # cut everything we have rendered from the whole text 
    #end 
    while (i = text.index /<\/?[ou]l>/) != nil do 
    part = text[0..i-1] 
    if indent == 0 #we're not in a list, but at the top level 
     pdf.text part, :inline_format => true 
    else 
     pdf.indent indent do 
     #render all the lis 
     part.gsub(/<\/li>/, '').split('<li>').each do |item| 
      next if item.blank? #split may return some ugly start and end blanks 

      item_text = if states.last == :ul 
         "• #{item}" 
         else # :ol 
         indices[indices.length-1] = indices.last + 1 
         "#{indices.last}. #{item}" 
         end 

      pdf.text item_text, :inline_format => true 
     end 
     end 
    end 

    is_closing = text[i+1] == '/' #closing tag? 
    if is_closing 
     indent -= indent_delta 
     i += '</ul>'.length 

     states.pop 
     indices.pop 
    else 
     pdf.move_down 10 if indent == 0 

     type_identifier = text[i+1] #<_u_l> or <_o_l> 
     states << if type_identifier == 'u' 
        :ul 
       elsif type_identifier == 'o' 
        :ol 
       else 
        raise "what means type identifier '#{type_identifier}'?" 
       end 
     indices << 0 

     indent += indent_delta 
     i += '<ul>'.length 
    end 

    text = text[i..text.length-1] #cut the text we just rendered 
    end 

    #render the last part 
    pdf.text text, :inline_format => true unless text.blank? 
end 
+1

ありがとうございました。 改善点: 'String#blank?'は純粋なRubyではありません。 '.strip == '''をクイックフィックスとして使用しました。 箇条書き項目をレンダリングするときに '#{item.strip}'に使用されます。そうしないと、箇条書きの後に行末が表示されてしまいます(おそらくHTMLマークアップの改行のためです) –

3

カーソルの位置を尊重するだけでなく、コードの行数の少ない真のリストのようにレンダリングする優れたソリューションです:

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 

start_new_page節では、行頭文字項目が次のページに移動する必要がある場合があります。これにより、弾丸を弾丸の内容で維持する。

例PDFレンダリングスクリーンショット:

Example Rendered List

関連する問題