7

エビで目次を作成する必要があります。コード内にadd_dest関数呼び出しがあり、目次には適切なリンクがあります。

add_dest('Komplett', dest_fit(page_count - 1))

text "* <link anchor='Komplett'> Vollstaendiges Mitgliederverzeichnis </link>", :inline_format = true

これは機能し、クリック可能なリンクを取得して、適切なページに転送します。ただし、目次にはページ番号が必要です。どうすれば印刷できますか?

4

4 に答える 4

3

このドキュメントhttp://prawn.majesticseacreature.com/manual.pdf、p.96のアウトラインに関する章を読む必要があります。TOCの作り方を例を挙げて説明しています。

アップデート

destinations, page_references = {}, {}

page_count.downto(1).each {|num| page_references[num] = state.store.object_id_for_page(num)}

dests.data.to_hash.each_value do |values|
    values.each do |value|
        value_array             = value.to_s.split(":")
        dest_name               = value_array[0]
        dest_id                 = value_array[1].split[0]
        destinations[dest_name] = Integer(dest_id)
    end 
end 

state.store.each do |reference| 
    if !(dest_name = destinations.key(reference.identifier)).nil?
        puts "Destination - #{dest_name} is on Page #{page_references.key(Integer(reference.data[0].to_s.split[0]))}"
    end 
end   
于 2012-10-16T17:00:53.317 に答える
3

また、動的な TOC を作成する必要もありました。いくつかのクリーンアップが必要ですが、私が望むほとんどのことを行う簡単なスパイクをまとめました。クリック可能なリンクは含めませんでしたが、簡単に追加できました。この例では、TOC がドキュメントの 2 ページ目に配置されていることも想定しています。

私が使用した基本的な戦略は、TOC をハッシュに格納することでした。TOC に表示するドキュメントに新しいセクションを追加するたびに、それをハッシュに追加します。

@toc[pdf.page_count] = "the toc text for this section"

次に、ドキュメントにページ番号を追加する前に、ハッシュを反復処理します。

number_of_toc_entries_per_page = 10
offset = (@toc.count.to_f / number_of_toc_entries_per_page).ceil
@toc.each_with_index do |(key, value), index| 
  pdf.start_new_page if index % number_of_toc_entries_per_page == 0
  pdf.text "#{value}.... page #{key + offset}", size: 38
end

とにかく、完全な例を以下に示します。お役に立てば幸いです。

require 'prawn'

class TocTest
  def self.create
    @toc = Hash.new
    @current_section_header_number = 0 # used to fake up section header's
    pdf = Prawn::Document.new

    add_title_page(pdf)
    21.times { add_a_content_page(pdf) }

    fill_in_toc(pdf)

    add_page_numbers(pdf)

    pdf.render_file './output/test.pdf'
  end

  def self.add_title_page(pdf)
    pdf.move_down 200
    pdf.text "This is my title page", size: 38, style: :bold, align: :center
  end

  def self.fill_in_toc(pdf)
    pdf.go_to_page(1)

    number_of_toc_entries_per_page = 10
    offset = (@toc.count.to_f / number_of_toc_entries_per_page).ceil
    @toc.each_with_index do |(key, value), index| 
      pdf.start_new_page if index % number_of_toc_entries_per_page == 0
      pdf.text "#{value}.... page #{key + offset}", size: 38
    end
  end

  def self.add_a_content_page(pdf)
    pdf.start_new_page
    toc_heading = grab_some_section_header_text

    @toc[pdf.page_count] = toc_heading

    pdf.text toc_heading, size: 38, style: :bold
    pdf.text "Here is the content for this section"
    # randomly span a section over 2 pages
    if [true, false].sample
      pdf.start_new_page
      pdf.text "The content for this section spans 2 pages"
    end
  end

  def self.add_page_numbers(pdf)
    page_number_string = 'page <page> of <total>'
    options = {
      at: [pdf.bounds.right - 175, 9], 
      width: 150, 
      align: :right, 
      size: 10,
      page_filter: lambda { |pg| pg > 1 }, 
      start_count_at: 2,
    }
    pdf.number_pages(page_number_string, options)
  end

  def self.grab_some_section_header_text
    "Section #{@current_section_header_number += 1}"
  end
end
于 2013-04-09T00:19:39.160 に答える