大虾:用页码内容表(Prawn: Table of content with page number

2019-09-24 04:10发布

我需要创建与虾目录。 我有add_dest在我的代码函数调用,并在表的内容正确链接:

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

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

这工作,我得到它我转发到正确的页面点击链接。 不过,我需要有页码中的内容表。 我如何得到它打印出来?

Answer 1:

你应该阅读大纲章节中这个文件http://prawn.majesticseacreature.com/manual.pdf ,第96页。 它解释了如何创建TOC的例子。

UPDATE

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   


Answer 2:

我还需要创建一个动态的TOC。 我把一个快速尖峰需要一些清理工作,但确实几乎我想要的东西。 我没有包含可点击的链接,但他们可以很容易地添加。 此示例还假定被放置在文档的第二页上的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


Answer 3:

我会建议一个更简单的解决方案。

  1. 使用pdf.page_number存储在一个散你所有的章节的页数为您填充网页

  2. 在代码中,输出的内容填充页面后剩下的表。 通过在PDF浏览插入TOC到正确的位置的文档pdf.go_to_page(page_num)

例如:

render "pdf/frontpage", p: p
toc.merge!(p.page_number => "Section_Title")

p.start_new_page
toc.merge!(p.page_number => "Section_Title")
render "pdf/calendar"

p.start_new_page
toc.merge!(p.page_number => "Section_Title")
render "pdf/another_section"

p.go_to_page(1)
p.start_new_page
toc.merge!(p.page_number => "Table of Contents")
render "pdf/table_of_contents", table_of_contents: toc


文章来源: Prawn: Table of content with page numbers