我需要创建与虾目录。 我有add_dest
在我的代码函数调用,并在表的内容正确链接:
add_dest('Komplett', dest_fit(page_count - 1))
和
text "* <link anchor='Komplett'> Vollstaendiges Mitgliederverzeichnis </link>", :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[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
我会建议一个更简单的解决方案。
使用pdf.page_number
存储在一个散你所有的章节的页数为您填充网页
在代码中,输出的内容填充页面后剩下的表。 通过在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