prawn-templates 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pdf/core/document_state.rb +35 -0
- data/lib/pdf/core/errors.rb +8 -0
- data/lib/pdf/core/object_store.rb +21 -0
- data/lib/pdf/core/page.rb +33 -0
- data/lib/prawn/document/internals.rb +21 -0
- data/lib/prawn/templates.rb +25 -17
- data/lib/prawn/text.rb +25 -0
- data/prawn-templates.gemspec +9 -7
- metadata +48 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a07d63a03e5331fe73c2df7df5cb23b9fc1c42a2
|
4
|
+
data.tar.gz: 252d06574afa170bc89c6c3560de1933bd2b2195
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7640f9e16b2ea3a256e550cf459f510a49be182788c3de6b763e2f78cf12d1bbf999b79a2c858b25751337a7b13d616b372e26f4c4a2829724e2de190ae5fd9c
|
7
|
+
data.tar.gz: 13cd410a9d90943de5d6162e38a64fa1d41fc560a885c9d20c3c0a2b895d57e0c13f391ddea592076e370c1a4bd959b1dce3af35a02d931cac2efc093681f28b
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module PDF
|
2
|
+
module Core
|
3
|
+
class DocumentState #:nodoc:
|
4
|
+
def initialize(options)
|
5
|
+
normalize_metadata(options)
|
6
|
+
|
7
|
+
if options[:template]
|
8
|
+
if options[:print_scaling]
|
9
|
+
@store = PDF::Core::ObjectStore.new(:template => options[:template], :print_scaling => options[:print_scaling])
|
10
|
+
else
|
11
|
+
@store = PDF::Core::ObjectStore.new(:template => options[:template])
|
12
|
+
end
|
13
|
+
@store.info.data.merge!(options[:info]) if options[:info]
|
14
|
+
else
|
15
|
+
if options[:print_scaling]
|
16
|
+
@store = PDF::Core::ObjectStore.new(:info => options[:info], :print_scaling => options[:print_scaling])
|
17
|
+
else
|
18
|
+
@store = PDF::Core::ObjectStore.new(:info => options[:info])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
@version = 1.3
|
23
|
+
@pages = []
|
24
|
+
@page = nil
|
25
|
+
@trailer = options.fetch(:trailer, {})
|
26
|
+
@compress = options.fetch(:compress, false)
|
27
|
+
@encrypt = options.fetch(:encrypt, false)
|
28
|
+
@encryption_key = options[:encryption_key]
|
29
|
+
@skip_encoding = options.fetch(:skip_encoding, false)
|
30
|
+
@before_render_callbacks = []
|
31
|
+
@on_page_create_callback = nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PDF
|
2
|
+
module Core
|
3
|
+
class ObjectStore #:nodoc:
|
4
|
+
def initialize(opts = {})
|
5
|
+
@objects = {}
|
6
|
+
@identifiers = []
|
7
|
+
|
8
|
+
load_file(opts[:template]) if opts[:template]
|
9
|
+
|
10
|
+
@info ||= ref(opts[:info] || {}).identifier
|
11
|
+
@root ||= ref(:Type => :Catalog).identifier
|
12
|
+
if opts[:print_scaling] == :none
|
13
|
+
root.data[:ViewerPreferences] = { :PrintScaling => :None }
|
14
|
+
end
|
15
|
+
if pages.nil?
|
16
|
+
root.data[:Pages] = ref(:Type => :Pages, :Count => 0, :Kids => [])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module PDF
|
2
|
+
module Core
|
3
|
+
class Page #:nodoc:
|
4
|
+
# As per the PDF spec, each page can have multiple content streams. This will
|
5
|
+
# add a fresh, empty content stream this the page, mainly for use in loading
|
6
|
+
# template files.
|
7
|
+
#
|
8
|
+
def new_content_stream
|
9
|
+
return if in_stamp_stream?
|
10
|
+
|
11
|
+
unless dictionary.data[:Contents].is_a?(Array)
|
12
|
+
dictionary.data[:Contents] = [content]
|
13
|
+
end
|
14
|
+
@content = document.ref({})
|
15
|
+
dictionary.data[:Contents] << document.state.store[@content]
|
16
|
+
document.open_graphics_state
|
17
|
+
end
|
18
|
+
|
19
|
+
def init_from_object(options)
|
20
|
+
@dictionary = options[:object_id].to_i
|
21
|
+
dictionary.data[:Parent] = document.state.store.pages if options[:page_template]
|
22
|
+
|
23
|
+
unless dictionary.data[:Contents].is_a?(Array) # content only on leafs
|
24
|
+
@content = dictionary.data[:Contents].identifier
|
25
|
+
end
|
26
|
+
|
27
|
+
@stamp_stream = nil
|
28
|
+
@stamp_dictionary = nil
|
29
|
+
@imported_page = true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Prawn
|
2
|
+
class Document
|
3
|
+
module Internals
|
4
|
+
delegate [ :open_graphics_state ] => :renderer
|
5
|
+
|
6
|
+
# adds a new, empty content stream to each page. Used in templating so
|
7
|
+
# that imported content streams can be left pristine
|
8
|
+
#
|
9
|
+
def fresh_content_streams(options = {})
|
10
|
+
(1..page_count).each do |i|
|
11
|
+
go_to_page i
|
12
|
+
state.page.new_content_stream
|
13
|
+
apply_margin_options(options)
|
14
|
+
generate_margin_box
|
15
|
+
use_graphic_settings(options[:template])
|
16
|
+
forget_text_rendering_mode!
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/prawn/templates.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# This is free software. See LICENSE and COPYING files for details.
|
2
2
|
require 'pdf/reader'
|
3
|
+
require 'pdf/core'
|
4
|
+
require 'prawn/text'
|
5
|
+
|
6
|
+
require_relative "../pdf/core/document_state"
|
7
|
+
require_relative "../pdf/core/errors"
|
8
|
+
require_relative "../pdf/core/object_store"
|
9
|
+
require_relative "../pdf/core/page"
|
10
|
+
require_relative "text"
|
11
|
+
require_relative "document/internals"
|
3
12
|
|
4
13
|
module Prawn
|
5
14
|
# @private
|
@@ -10,27 +19,30 @@ module Prawn
|
|
10
19
|
fresh_content_streams(options)
|
11
20
|
go_to_page(1)
|
12
21
|
end
|
13
|
-
|
22
|
+
|
14
23
|
## FIXME: This is going to be terribly brittle because
|
15
24
|
# it copy-pastes the start_new_page method. But at least
|
16
25
|
# it should only run when templates are used.
|
17
|
-
|
18
26
|
def start_new_page(options = {})
|
19
27
|
return super unless options[:template]
|
20
28
|
|
21
29
|
if last_page = state.page
|
22
30
|
last_page_size = last_page.size
|
23
31
|
last_page_layout = last_page.layout
|
24
|
-
last_page_margins = last_page.margins
|
32
|
+
last_page_margins = last_page.margins.dup
|
25
33
|
end
|
26
34
|
|
27
|
-
page_options = {
|
28
|
-
|
29
|
-
|
35
|
+
page_options = {
|
36
|
+
:size => options[:size] || last_page_size,
|
37
|
+
:layout => options[:layout] || last_page_layout,
|
38
|
+
:margins => last_page_margins
|
39
|
+
}
|
30
40
|
if last_page
|
31
41
|
new_graphic_state = last_page.graphic_state.dup if last_page.graphic_state
|
32
|
-
|
42
|
+
|
43
|
+
# erase the color space so that it gets reset on new page for fussy pdf-readers
|
33
44
|
new_graphic_state.color_space = {} if new_graphic_state
|
45
|
+
|
34
46
|
page_options.merge!(:graphic_state => new_graphic_state)
|
35
47
|
end
|
36
48
|
|
@@ -93,13 +105,9 @@ module Prawn
|
|
93
105
|
elsif File.file?(input.to_s)
|
94
106
|
StringIO.new(File.binread(input.to_s))
|
95
107
|
else
|
96
|
-
|
108
|
+
fail ArgumentError, "input must be an IO-like object or a filename"
|
97
109
|
end
|
98
110
|
|
99
|
-
# unless File.file?(filename)
|
100
|
-
# raise ArgumentError, "#{filename} does not exist"
|
101
|
-
# end
|
102
|
-
|
103
111
|
hash = indexed_hash(input, io)
|
104
112
|
ref = hash.page_references[page_num - 1]
|
105
113
|
|
@@ -174,7 +182,7 @@ module Prawn
|
|
174
182
|
def load_file(template)
|
175
183
|
unless (template.respond_to?(:seek) && template.respond_to?(:read)) ||
|
176
184
|
File.file?(template)
|
177
|
-
|
185
|
+
fail ArgumentError, "#{template} does not exist"
|
178
186
|
end
|
179
187
|
|
180
188
|
hash = PDF::Reader::ObjectHash.new(template)
|
@@ -184,7 +192,7 @@ module Prawn
|
|
184
192
|
|
185
193
|
if hash.trailer[:Encrypt]
|
186
194
|
msg = "Template file is an encrypted PDF, it can't be used as a template"
|
187
|
-
|
195
|
+
fail PDF::Core::Errors::TemplateError, msg
|
188
196
|
end
|
189
197
|
|
190
198
|
if src_info
|
@@ -212,12 +220,12 @@ module Prawn
|
|
212
220
|
@loaded_objects ||= {}
|
213
221
|
case object
|
214
222
|
when ::Hash then
|
215
|
-
object.each { |key,value| object[key] = load_object_graph(hash, value) }
|
223
|
+
object.each { |key, value| object[key] = load_object_graph(hash, value) }
|
216
224
|
object
|
217
225
|
when Array then
|
218
|
-
object.map { |item| load_object_graph(hash, item)}
|
226
|
+
object.map { |item| load_object_graph(hash, item) }
|
219
227
|
when PDF::Reader::Reference then
|
220
|
-
unless @loaded_objects.
|
228
|
+
unless @loaded_objects.key?(object.id)
|
221
229
|
@loaded_objects[object.id] = ref(nil)
|
222
230
|
new_obj = load_object_graph(hash, hash[object])
|
223
231
|
if new_obj.kind_of?(PDF::Reader::Stream)
|
data/lib/prawn/text.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Prawn
|
2
|
+
module Text #:nodoc:
|
3
|
+
def text_rendering_mode(mode = nil)
|
4
|
+
return (defined?(@text_rendering_mode) && @text_rendering_mode || :fill) if mode.nil?
|
5
|
+
unless MODES.key?(mode)
|
6
|
+
fail ArgumentError, "mode must be between one of #{MODES.keys.join(', ')} (#{mode})"
|
7
|
+
end
|
8
|
+
original_mode = self.text_rendering_mode
|
9
|
+
if original_mode == :unknown
|
10
|
+
original_mode = :fill
|
11
|
+
add_content "\n#{MODES[:fill]} Tr"
|
12
|
+
end
|
13
|
+
|
14
|
+
if original_mode == mode
|
15
|
+
yield
|
16
|
+
else
|
17
|
+
@text_rendering_mode = mode
|
18
|
+
add_content "\n#{MODES[mode]} Tr"
|
19
|
+
yield
|
20
|
+
add_content "\n#{MODES[original_mode]} Tr"
|
21
|
+
@text_rendering_mode = original_mode
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/prawn-templates.gemspec
CHANGED
@@ -3,19 +3,21 @@ Gem::Specification.new do |spec|
|
|
3
3
|
spec.version = File.read(File.expand_path('VERSION', File.dirname(__FILE__))).strip
|
4
4
|
spec.platform = Gem::Platform::RUBY
|
5
5
|
spec.summary = "Prawn::Templates allows using PDFs as templates in Prawn"
|
6
|
-
spec.files = Dir.glob("{lib}/**/**/*") +
|
7
|
-
["prawn-templates.gemspec"]
|
6
|
+
spec.files = Dir.glob("{lib}/**/**/*") + ["prawn-templates.gemspec"]
|
8
7
|
spec.require_path = "lib"
|
9
8
|
spec.required_ruby_version = '>= 1.9.3'
|
10
9
|
spec.required_rubygems_version = ">= 1.3.6"
|
10
|
+
spec.licenses = %w(PRAWN GPL-2.0 GPL-3.0)
|
11
11
|
|
12
|
-
spec.authors = ["Gregory Brown","Brad Ediger","Daniel Nelson","Jonathan Greenberg","James Healy"]
|
13
|
-
spec.email = ["gregory.t.brown@gmail.com","brad@bradediger.com","dnelson@bluejade.com","greenberg@entryway.net","jimmy@deefa.com"]
|
12
|
+
spec.authors = ["Gregory Brown", "Brad Ediger", "Daniel Nelson", "Jonathan Greenberg", "James Healy", "Burkhard Vogel"]
|
13
|
+
spec.email = ["gregory.t.brown@gmail.com", "brad@bradediger.com", "dnelson@bluejade.com", "greenberg@entryway.net", "jimmy@deefa.com", "b.vogel@buddyandselly.com"]
|
14
14
|
spec.add_dependency('pdf-reader', '~>1.3')
|
15
|
-
spec.add_dependency('prawn', '>=
|
16
|
-
spec.
|
15
|
+
spec.add_dependency('prawn', '>= 2.1.0')
|
16
|
+
spec.add_dependency('pdf-core', '>= 0.5.0')
|
17
|
+
spec.add_development_dependency('pdf-inspector', '~> 1.2.0')
|
17
18
|
spec.add_development_dependency('rspec')
|
18
19
|
spec.add_development_dependency('rake')
|
19
|
-
spec.
|
20
|
+
spec.add_development_dependency('rubocop', '0.30.1')
|
21
|
+
spec.homepage = "https://github.com/prawnpdf/prawn-templates"
|
20
22
|
spec.description = "Prawn::Templates allows using PDFs as templates in Prawn"
|
21
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prawn-templates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregory Brown
|
@@ -9,10 +9,11 @@ authors:
|
|
9
9
|
- Daniel Nelson
|
10
10
|
- Jonathan Greenberg
|
11
11
|
- James Healy
|
12
|
+
- Burkhard Vogel
|
12
13
|
autorequire:
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
|
-
date:
|
16
|
+
date: 2016-04-03 00:00:00.000000000 Z
|
16
17
|
dependencies:
|
17
18
|
- !ruby/object:Gem::Dependency
|
18
19
|
name: pdf-reader
|
@@ -34,28 +35,42 @@ dependencies:
|
|
34
35
|
requirements:
|
35
36
|
- - ">="
|
36
37
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
38
|
+
version: 2.1.0
|
38
39
|
type: :runtime
|
39
40
|
prerelease: false
|
40
41
|
version_requirements: !ruby/object:Gem::Requirement
|
41
42
|
requirements:
|
42
43
|
- - ">="
|
43
44
|
- !ruby/object:Gem::Version
|
44
|
-
version:
|
45
|
+
version: 2.1.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: pdf-core
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 0.5.0
|
53
|
+
type: :runtime
|
54
|
+
prerelease: false
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.5.0
|
45
60
|
- !ruby/object:Gem::Dependency
|
46
61
|
name: pdf-inspector
|
47
62
|
requirement: !ruby/object:Gem::Requirement
|
48
63
|
requirements:
|
49
64
|
- - "~>"
|
50
65
|
- !ruby/object:Gem::Version
|
51
|
-
version: 1.
|
66
|
+
version: 1.2.0
|
52
67
|
type: :development
|
53
68
|
prerelease: false
|
54
69
|
version_requirements: !ruby/object:Gem::Requirement
|
55
70
|
requirements:
|
56
71
|
- - "~>"
|
57
72
|
- !ruby/object:Gem::Version
|
58
|
-
version: 1.
|
73
|
+
version: 1.2.0
|
59
74
|
- !ruby/object:Gem::Dependency
|
60
75
|
name: rspec
|
61
76
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,6 +99,20 @@ dependencies:
|
|
84
99
|
- - ">="
|
85
100
|
- !ruby/object:Gem::Version
|
86
101
|
version: '0'
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: rubocop
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - '='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 0.30.1
|
109
|
+
type: :development
|
110
|
+
prerelease: false
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - '='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 0.30.1
|
87
116
|
description: Prawn::Templates allows using PDFs as templates in Prawn
|
88
117
|
email:
|
89
118
|
- gregory.t.brown@gmail.com
|
@@ -91,14 +120,24 @@ email:
|
|
91
120
|
- dnelson@bluejade.com
|
92
121
|
- greenberg@entryway.net
|
93
122
|
- jimmy@deefa.com
|
123
|
+
- b.vogel@buddyandselly.com
|
94
124
|
executables: []
|
95
125
|
extensions: []
|
96
126
|
extra_rdoc_files: []
|
97
127
|
files:
|
128
|
+
- lib/pdf/core/document_state.rb
|
129
|
+
- lib/pdf/core/errors.rb
|
130
|
+
- lib/pdf/core/object_store.rb
|
131
|
+
- lib/pdf/core/page.rb
|
132
|
+
- lib/prawn/document/internals.rb
|
98
133
|
- lib/prawn/templates.rb
|
134
|
+
- lib/prawn/text.rb
|
99
135
|
- prawn-templates.gemspec
|
100
|
-
homepage:
|
101
|
-
licenses:
|
136
|
+
homepage: https://github.com/prawnpdf/prawn-templates
|
137
|
+
licenses:
|
138
|
+
- PRAWN
|
139
|
+
- GPL-2.0
|
140
|
+
- GPL-3.0
|
102
141
|
metadata: {}
|
103
142
|
post_install_message:
|
104
143
|
rdoc_options: []
|
@@ -116,9 +155,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
155
|
version: 1.3.6
|
117
156
|
requirements: []
|
118
157
|
rubyforge_project:
|
119
|
-
rubygems_version: 2.
|
158
|
+
rubygems_version: 2.5.1
|
120
159
|
signing_key:
|
121
160
|
specification_version: 4
|
122
161
|
summary: Prawn::Templates allows using PDFs as templates in Prawn
|
123
162
|
test_files: []
|
124
|
-
has_rdoc:
|