109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
# File 'lib/combine_pdf.rb', line 109
def inject_to_page page = {Type: :Page, MediaBox: [0,0,612.0,792.0], Resources: {}, Contents: []}, stream = nil, top = true
return false unless page.is_a?(Hash) && stream.is_a?(Hash)
original_resources = page[:Resources]
if original_resources[:is_reference_only]
original_resources = original_resources[:referenced_object]
raise "Couldn't tap into resources dictionary, as it is a reference and isn't linked." unless original_resources
end
original_contents = page[:Contents]
original_contents = [original_contents] unless original_contents.is_a? Array
stream_resources = stream[:Resources]
if stream_resources[:is_reference_only]
stream_resources = stream_resources[:referenced_object]
raise "Couldn't tap into resources dictionary, as it is a reference and isn't linked." unless stream_resources
end
stream_contents = stream[:Contents]
stream_contents = [stream_contents] unless stream_contents.is_a? Array
flatten_resources_dictionaries stream_resources
flatten_resources_dictionaries original_resources
stream_resources.each do |key, new_val|
unless PRIVATE_HASH_KEYS.include? key if original_resources[key].nil?
original_resources[key] = new_val
elsif original_resources[key].is_a?(Hash) && new_val.is_a?(Hash)
new_val.update original_resources[key] original_resources[key].update new_val end end
end
original_resources[:ProcSet] = [:PDF, :Text, :ImageB, :ImageC, :ImageI]
if top page[:Contents] = original_contents
page[:Contents].push *stream_contents
else page[:Contents] = stream_contents
page[:Contents].push *original_contents
end
page
end
|