Prawn:带有页码的内容表

我需要用Prawn创建一个目录。 我的代码中有add_dest函数调用,内容表中有正确的链接:

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

 text "*  Vollstaendiges Mitgliederverzeichnis ", :inline_format = true 

这是有效的,我得到可点击的链接,将我转发到正确的页面。 但是,我需要在内容表中包含页码。 如何打印出来?

您应该阅读本文档中有关“大纲”的章节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 

我还需要创建一个动态TOC。 我把一个快速的尖峰放在一起,需要一些清理,但几乎可以做我想要的。 我没有包含可点击链接,但可以很容易地添加它们。 该示例还假设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  of ' 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 

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

  1. 在填充页面时,使用pdf.page_number将所有部分的页码存储在哈希中

  2. 在代码中,在填充其余页面后输出目录。 通过在PDF pdf.go_to_page(page_num)导航,将TOC插入到正确位置的文档中。

例如:

 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