forked from prawnpdf/prawn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
document_state.rb
78 lines (64 loc) · 2.37 KB
/
document_state.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
module Prawn
module Core
class DocumentState #:nodoc:
def initialize(options)
normalize_metadata(options)
if options[:template]
@store = Prawn::Core::ObjectStore.new(:template => options[:template])
else
@store = Prawn::Core::ObjectStore.new(:info => options[:info])
end
@version = 1.3
@pages = []
@page = nil
@trailer = {}
@compress = options.fetch(:compress, false)
@encrypt = options.fetch(:encrypt, false)
@encryption_key = options[:encryption_key]
@optimize_objects = options.fetch(:optimize_objects, false)
@skip_encoding = options.fetch(:skip_encoding, false)
@before_render_callbacks = []
@on_page_create_callback = nil
end
attr_accessor :store, :version, :pages, :page, :trailer, :compress,
:encrypt, :encryption_key, :optimize_objects, :skip_encoding,
:before_render_callbacks, :on_page_create_callback
def populate_pages_from_store(document)
return 0 if @store.page_count <= 0 || @pages.size > 0
count = (1..@store.page_count)
@pages = count.map do |index|
orig_dict_id = @store.object_id_for_page(index)
Prawn::Core::Page.new(document, :object_id => orig_dict_id)
end
end
def normalize_metadata(options)
options[:info] ||= {}
options[:info][:Creator] ||= "Prawn"
options[:info][:Producer] ||= "Prawn"
info = options[:info]
end
def insert_page(page, page_number)
pages.insert(page_number, page)
store.pages.data[:Kids].insert(page_number, page.dictionary)
store.pages.data[:Count] += 1
end
def on_page_create_action(doc)
on_page_create_callback[doc] if on_page_create_callback
end
def before_render_actions(doc)
before_render_callbacks.each{ |c| c.call(self) }
end
def page_count
pages.length
end
def render_body(output)
store.compact if optimize_objects
store.each do |ref|
ref.offset = output.size
output << (@encrypt ? ref.encrypted_object(@encryption_key) :
ref.object)
end
end
end
end
end