combine_pdf 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/combine_pdf/page_methods.rb +4 -7
- data/lib/combine_pdf/pdf_public.rb +43 -9
- data/lib/combine_pdf/renderer.rb +8 -8
- data/lib/combine_pdf/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60f4dfc06ecb66c5c876b69028868bbd5bb7cde9
|
4
|
+
data.tar.gz: 5a0944cbfdbc39283fbb62a2205f5897ecbb6dd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fea4291167b6d5f0585bba371467e552dafbc32aeb957312a28fda7e0431bac20f35c49ee64bf36fac0b7c18ce5d1c89097db18e3af8170318c6401a56c07af7
|
7
|
+
data.tar.gz: 329afc35c2754b77b77fec6606be4e6938f535bff5e7bc1e0f1b02bf75dbf077174221448ec86cbcf0109a42e77446a9041079a75fc727bc16503b93d5151b8d
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,18 @@
|
|
2
2
|
|
3
3
|
***
|
4
4
|
|
5
|
+
Change log v.0.2.1
|
6
|
+
|
7
|
+
**fix**: better page stamping... or, at least more secure (we hope).
|
8
|
+
|
9
|
+
**feature**: added the PDF#stamp shortcut method. Credit to Tania (@taniarv) for the concept.
|
10
|
+
|
11
|
+
**fix**: possible string encoding issues could have arose when strings were rendered to PDF format. Credit to Tania (@taniarv) for exposing the issue.
|
12
|
+
|
13
|
+
**feature**: Metadata is now easiyer to set by allowing fast access to the Information header when using PDF#save and PDF#to_pdf. Credit to Tania (@taniarv) for code.
|
14
|
+
|
15
|
+
***
|
16
|
+
|
5
17
|
Change log v.0.2.0
|
6
18
|
|
7
19
|
Refractoring of code and API overhall.
|
@@ -73,15 +73,12 @@ module CombinePDF
|
|
73
73
|
if top # if this is a stamp (overlay)
|
74
74
|
insert_content CONTENT_CONTAINER_START, 0
|
75
75
|
insert_content CONTENT_CONTAINER_MIDDLE
|
76
|
-
|
76
|
+
self[:Contents].concat obj[:Contents]
|
77
77
|
insert_content CONTENT_CONTAINER_END
|
78
78
|
else #if this was a watermark (underlay? would be lost if the page was scanned, as white might not be transparent)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
obj[:Contents].each {|c| insert_content c }
|
83
|
-
insert_content CONTENT_CONTAINER_MIDDLE
|
84
|
-
old_contents.each { |c| insert_content c }
|
79
|
+
insert_content CONTENT_CONTAINER_MIDDLE, 0
|
80
|
+
insert_content CONTENT_CONTAINER_START, 0
|
81
|
+
self[:Contents].insert 1, *obj[:Contents]
|
85
82
|
insert_content CONTENT_CONTAINER_END
|
86
83
|
end
|
87
84
|
init_contents
|
@@ -106,7 +106,7 @@ module CombinePDF
|
|
106
106
|
|
107
107
|
# general globals
|
108
108
|
@set_start_id = 1
|
109
|
-
@info[:Producer] = "Ruby CombinePDF #{CombinePDF::VERSION} Library
|
109
|
+
@info[:Producer] = "Ruby CombinePDF #{CombinePDF::VERSION} Library"
|
110
110
|
@info.delete :CreationDate
|
111
111
|
@info.delete :ModDate
|
112
112
|
end
|
@@ -149,8 +149,8 @@ module CombinePDF
|
|
149
149
|
# file_name:: is a string or path object for the output.
|
150
150
|
#
|
151
151
|
# **Notice!** if the file exists, it **WILL** be overwritten.
|
152
|
-
def save(file_name)
|
153
|
-
IO.binwrite file_name, to_pdf
|
152
|
+
def save(file_name, options = {})
|
153
|
+
IO.binwrite file_name, to_pdf(options)
|
154
154
|
end
|
155
155
|
|
156
156
|
# Formats the data to PDF formats and returns a binary string that represents the PDF file content.
|
@@ -158,7 +158,7 @@ module CombinePDF
|
|
158
158
|
# This method is used by the save(file_name) method to save the content to a file.
|
159
159
|
#
|
160
160
|
# use this to export the PDF file without saving to disk (such as sending through HTTP ect').
|
161
|
-
def to_pdf
|
161
|
+
def to_pdf options = {}
|
162
162
|
#reset version if not specified
|
163
163
|
@version = 1.5 if @version.to_f == 0.0
|
164
164
|
#set creation date for merged file
|
@@ -193,6 +193,9 @@ module CombinePDF
|
|
193
193
|
out << "/Size #{indirect_object_count.to_s}"
|
194
194
|
if @info.is_a?(Hash)
|
195
195
|
PRIVATE_HASH_KEYS.each {|key| @info.delete key} # make sure the dictionary is rendered inline, without stream
|
196
|
+
@info[:CreationDate] = @info[:ModDate] = Time.now.strftime "D:%Y%m%d%H%M%S%:::z'00"
|
197
|
+
@info[:Subject] = options[:subject] if options[:subject]
|
198
|
+
@info[:Producer] = options[:producer] if options[:producer]
|
196
199
|
out << "/Info #{object_to_pdf @info}"
|
197
200
|
end
|
198
201
|
out << ">>\nstartxref\n#{xref_location.to_s}\n%%EOF"
|
@@ -336,16 +339,16 @@ module CombinePDF
|
|
336
339
|
#
|
337
340
|
# options:: a Hash of options setting the behavior and format of the page numbers:
|
338
341
|
# - :number_format a string representing the format for page number. defaults to ' - %s - ' (allows for letter numbering as well, such as "a", "b"...).
|
339
|
-
# - :
|
342
|
+
# - :location an Array containing the location for the page numbers, can be :top, :buttom, :top_left, :top_right, :bottom_left, :bottom_right or :center (:center == full page). defaults to [:top, :buttom].
|
340
343
|
# - :start_at a Fixnum that sets the number for first page number. also accepts a letter ("a") for letter numbering. defaults to 1.
|
341
344
|
# - :margin_from_height a number (PDF points) for the top and buttom margins. defaults to 45.
|
342
345
|
# - :margin_from_side a number (PDF points) for the left and right margins. defaults to 15.
|
343
|
-
#
|
346
|
+
# - :page_range a range of pages to be numbered (i.e. (2..-1) ) defaults to all the pages (nil). Remember to set the :start_at to the correct value.
|
347
|
+
# the options Hash can also take all the options for {Page_Methods#textbox}.
|
344
348
|
# defaults to font: :Helvetica, font_size: 12 and no box (:border_width => 0, :box_color => nil).
|
345
349
|
def number_pages(options = {})
|
346
350
|
opt = {
|
347
351
|
number_format: ' - %s - ',
|
348
|
-
number_location: [:top, :bottom],
|
349
352
|
start_at: 1,
|
350
353
|
font_size: 12,
|
351
354
|
font: :Helvetica,
|
@@ -353,12 +356,15 @@ module CombinePDF
|
|
353
356
|
margin_from_side: 15
|
354
357
|
}
|
355
358
|
opt.update options
|
359
|
+
opt[:number_location] ||= opt[:stamp_location] ||= opt[:location] ||= [:top, :bottom]
|
356
360
|
page_number = opt[:start_at]
|
357
|
-
|
361
|
+
format_repeater = opt[:number_format].count('%')
|
362
|
+
(opt[:page_range] ? pages[opt[:page_range]] : pages).each do |page|
|
358
363
|
# Get page dimensions
|
359
364
|
mediabox = page[:CropBox] || page[:MediaBox] || [0, 0, 595.3, 841.9]
|
360
365
|
# set stamp text
|
361
|
-
text = opt[:number_format] % page_number
|
366
|
+
text = opt[:number_format] % (Array.new(format_repeater) {page_number})
|
367
|
+
# text = opt[:number_format] % page_number
|
362
368
|
# compute locations for text boxes
|
363
369
|
text_dimantions = page.dimensions_of( text, opt[:font], opt[:font_size] )
|
364
370
|
box_width = text_dimantions[0] * 1.2
|
@@ -392,8 +398,36 @@ module CombinePDF
|
|
392
398
|
if opt[:number_location].include? :bottom_right
|
393
399
|
page.textbox text, {x: right_position, y: bottom_position }.merge(opt)
|
394
400
|
end
|
401
|
+
if opt[:number_location].include? :center
|
402
|
+
page.textbox text, opt
|
403
|
+
end
|
395
404
|
page_number = page_number.succ
|
396
405
|
end
|
406
|
+
|
407
|
+
end
|
408
|
+
# This method stamps all (or some) of the pages is the PDF with the requested stamp.
|
409
|
+
#
|
410
|
+
# The method accept:
|
411
|
+
# stamp:: either a String or a PDF page. If this is a String, you can add formating to add page numbering (i.e. "page number %i"). otherwise remember to escape any percent ('%') sign (i.e. "page \%number not shown\%").
|
412
|
+
# options:: an options Hash.
|
413
|
+
#
|
414
|
+
# If the stamp is a String, than all the options used by {#number_pages} or {Page_Methods#textbox} can be used.
|
415
|
+
#
|
416
|
+
# If the stamp is a PDF page, only :page_range and :underlay (to reverse-stamp) are valid options.
|
417
|
+
def stamp_pages stamp, options = {}
|
418
|
+
case stamp
|
419
|
+
when String
|
420
|
+
number_pages({number_format: stamp}.merge(options))
|
421
|
+
when Page_Methods
|
422
|
+
# stamp = stamp.copy(true)
|
423
|
+
if options[:underlay]
|
424
|
+
(options[:page_range] ? pages[options[:page_range]] : pages).each {|p| p >> stamp}
|
425
|
+
else
|
426
|
+
(options[:page_range] ? pages[options[:page_range]] : pages).each {|p| p << stamp}
|
427
|
+
end
|
428
|
+
else
|
429
|
+
raise TypeError, "expecting a String or a PDF page as the stamp."
|
430
|
+
end
|
397
431
|
end
|
398
432
|
|
399
433
|
end
|
data/lib/combine_pdf/renderer.rb
CHANGED
@@ -34,11 +34,7 @@ module CombinePDF
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
object.force_encoding(Encoding::ASCII_8BIT)
|
39
|
-
if !object.force_encoding(Encoding::ASCII_8BIT).match(/[^D\:\d\+\-\Z\']/) #if format is set to Literal
|
40
|
-
#### can be better...
|
41
|
-
replacement_hash = {
|
37
|
+
STRING_REPLACEMENT_HASH = {
|
42
38
|
"\x0A" => "\\n",
|
43
39
|
"\x0D" => "\\r",
|
44
40
|
"\x09" => "\\t",
|
@@ -48,9 +44,13 @@ module CombinePDF
|
|
48
44
|
"\x29" => "\\)",
|
49
45
|
"\x5C" => "\\\\"
|
50
46
|
}
|
51
|
-
|
52
|
-
|
53
|
-
|
47
|
+
32.times {|i| STRING_REPLACEMENT_HASH[i.chr] ||= "\\#{i}"}
|
48
|
+
(256-128).times {|i| STRING_REPLACEMENT_HASH[(i + 127).chr] ||= "\\#{i+127}"}
|
49
|
+
|
50
|
+
def format_string_to_pdf(object)
|
51
|
+
# object.force_encoding(Encoding::ASCII_8BIT)
|
52
|
+
if !object.match(/[^D\:\d\+\-\Z\']/) #if format is set to Literal
|
53
|
+
("(" + ([].tap {|out| object.bytes.each {|byte| STRING_REPLACEMENT_HASH[ byte.chr ] ? (STRING_REPLACEMENT_HASH[ byte.chr ].bytes.each {|b| out << b}) : out << byte } }).pack('C*') + ")").force_encoding(Encoding::ASCII_8BIT)
|
54
54
|
else
|
55
55
|
# A hexadecimal string shall be written as a sequence of hexadecimal digits (0–9 and either A–F or a–f)
|
56
56
|
# encoded as ASCII characters and enclosed within angle brackets (using LESS-THAN SIGN (3Ch) and GREATER- THAN SIGN (3Eh)).
|
data/lib/combine_pdf/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: combine_pdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boaz Segev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-rc4
|
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
version: '0'
|
102
102
|
requirements: []
|
103
103
|
rubyforge_project:
|
104
|
-
rubygems_version: 2.4.
|
104
|
+
rubygems_version: 2.4.7
|
105
105
|
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Combine, stamp and watermark PDF files in pure Ruby.
|