combine_pdf 1.0.22 → 1.0.23

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96825d0aa74bd673883c4d7dbf3884459ff27c2a3d7bd0c60875e0499c7b9aeb
4
- data.tar.gz: 985c39883f343bb5182344ccc31353103fbac89494000362973f08cdd379d2ac
3
+ metadata.gz: 94a057a85d5c2709211baa3ed7d7deaf73fe93d6bb39ef76e0441a166fb36926
4
+ data.tar.gz: c7dc7060c7abd51d84ee871b5f818d6e23a797eb424a8a7a963b0ae7f7324921
5
5
  SHA512:
6
- metadata.gz: 8575b612e1eb31775833faba8f310d84680d6ce27512d6a9c182e7598a743956da34e0321f0280d032e3e46b861dd2abdd88b297e65a652ec8e3e416ed9fb0a0
7
- data.tar.gz: 2026d924120f1798681842fee7a2eb0de78be6ac493dcbd4ffbb934c1c0135161ccbf29283fb0eec42b4ebab66f84b7fa3ac354a970fad9bc0ad302f64da7c7a
6
+ metadata.gz: 110074ae751586009d436dd4dc997c7d6bb71480d782270fe67834458cecc7479b58effc8102745a437c718426c97ca78d9ea3d2941355ba1ce8fc6f34ab2b8a
7
+ data.tar.gz: 4cf409946ba651fd474f7ff8a3dbf56442afd96b35fe73b68013a9a863e01e9d766a516ea4ddd4f5af7f2c47192abc0619321a6bc01c5a4e0dcd0e192701d168
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ language: ruby
data/CHANGELOG.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Change Log
2
2
 
3
- ***
3
+ #### Change log v.1.0.23 (2023-03-04)
4
+
5
+ **Feature**: merged PR #177 for the `raise_on_encrypted: true` option support. Credit to @leviwilson and @kimyu92 for the PR.
4
6
 
5
7
  #### Change log v.1.0.22
6
8
 
data/README.md CHANGED
@@ -39,7 +39,7 @@ Quick rundown:
39
39
 
40
40
  Some links will be lost when ripping pages out of PDF files and merging them with another PDF.
41
41
 
42
- * Some encrypted PDF files (usually the ones you can't view without a password) will fail quietly instead of noisily.
42
+ * Some encrypted PDF files (usually the ones you can't view without a password) will fail quietly instead of noisily. If you prefer to choose the noisy route, you can specify the `raise_on_encrypted` option using `CombinePDF.load(pdf_file, raise_on_encrypted: true)` which will raise a `CombinePDF::EncryptionError`.
43
43
 
44
44
  * Sometimes the CombinePDF will raise an exception even if the PDF could be parsed (i.e., when PDF optional content exists)... I find it better to err on the side of caution, although for optional content PDFs an exception is avoidable using `CombinePDF.load(pdf_file, allow_optional_content: true)`.
45
45
 
data/Rakefile CHANGED
@@ -1,2 +1,9 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ task default: 'test'
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
2
9
 
data/combine_pdf.gemspec CHANGED
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  # spec.add_development_dependency "bundler", ">= 1.7"
25
25
  spec.add_development_dependency "rake", ">= 12.3.3"
26
26
  spec.add_development_dependency "minitest"
27
+ spec.add_development_dependency "minitest-around"
27
28
  end
@@ -33,7 +33,7 @@ module CombinePDF
33
33
  # they are mainly to used to know if the file is (was) encrypted and to get more details.
34
34
  attr_reader :info_object, :root_object, :names_object, :forms_object, :outlines_object, :metadata
35
35
 
36
- attr_reader :allow_optional_content
36
+ attr_reader :allow_optional_content, :raise_on_encrypted
37
37
  # when creating a parser, it is important to set the data (String) we wish to parse.
38
38
  #
39
39
  # <b>the data is required and it is not possible to set the data at a later stage</b>
@@ -58,6 +58,7 @@ module CombinePDF
58
58
  @version = nil
59
59
  @scanner = nil
60
60
  @allow_optional_content = options[:allow_optional_content]
61
+ @raise_on_encrypted = options[:raise_on_encrypted]
61
62
  end
62
63
 
63
64
  # parse the data in the new parser (the data already set through the initialize / new method)
@@ -96,6 +97,7 @@ module CombinePDF
96
97
  end
97
98
 
98
99
  if @root_object[:Encrypt]
100
+ raise EncryptionError, 'the file is encrypted' if @raise_on_encrypted
99
101
  # change_references_to_actual_values @root_object
100
102
  warn 'PDF is Encrypted! Attempting to decrypt - not yet fully supported.'
101
103
  decryptor = PDFDecrypt.new @parsed, @root_object
@@ -96,6 +96,7 @@ module CombinePDF
96
96
  parser ||= PDFParser.new('')
97
97
  raise TypeError, "initialization error, expecting CombinePDF::PDFParser or nil, but got #{parser.class.name}" unless parser.is_a? PDFParser
98
98
  @objects = parser.parse
99
+
99
100
  # remove any existing id's
100
101
  remove_old_ids
101
102
  # set data from parser
@@ -261,10 +262,12 @@ module CombinePDF
261
262
  next if !r
262
263
  r = r[:referenced_object] if r[:referenced_object]
263
264
  r = r[:Font]
264
- next if !r
265
+ next if !r
265
266
  r = r[:referenced_object] if r[:referenced_object]
266
267
  r.values.each do |f|
268
+ next if f.class != Hash
267
269
  f = f[:referenced_object] if f[:referenced_object]
270
+ next if f.class != Hash
268
271
  if (limit_to_type0 || f[:Subtype] == :Type0) && f[:Type] == :Font && !fonts_array.include?(f)
269
272
  fonts_array << f
270
273
  end
@@ -1,3 +1,3 @@
1
1
  module CombinePDF
2
- VERSION = '1.0.22'.freeze
2
+ VERSION = '1.0.23'.freeze
3
3
  end
data/test/automated CHANGED
@@ -5,7 +5,7 @@ $VERBOSE = true
5
5
  require 'benchmark'
6
6
  $LOAD_PATH.unshift File.expand_path(File.join('..', '..', 'lib'), __FILE__)
7
7
  require 'combine_pdf'
8
- require 'bundler/setup'
8
+ # require 'bundler/setup'
9
9
 
10
10
  # You can add fixtures and/or initialization code here to make experimenting
11
11
  # with your gem easier. You can also use a different console, if you like.
@@ -14,54 +14,54 @@ require 'bundler/setup'
14
14
  # require "pry"
15
15
  # Pry.start
16
16
 
17
- pdf = CombinePDF.load "./Ruby/test\ pdfs/filled_form.pdf"
17
+ pdf = CombinePDF.load "../../test\ pdfs/filled_form.pdf"
18
18
  pdf.save '01_check_radio_buttuns.pdf'
19
- pdf = CombinePDF.load "./Ruby/test\ pdfs/filled_form.pdf"
20
- pdf << CombinePDF.load("./Ruby/test\ pdfs/empty_form.pdf")
21
- pdf << CombinePDF.load("./Ruby/test\ pdfs/filled_form.pdf")
19
+ pdf = CombinePDF.load "../../test\ pdfs/filled_form.pdf"
20
+ pdf << CombinePDF.load("../../test\ pdfs/empty_form.pdf")
21
+ pdf << CombinePDF.load("../../test\ pdfs/filled_form.pdf")
22
22
  pdf.save '02_check_form_unification_middle_is_empty.pdf'
23
23
 
24
- pdf = CombinePDF.load "./Ruby/test\ pdfs/check_form_data__objstreams_w_versions.pdf"
24
+ pdf = CombinePDF.load "../../test\ pdfs/check_form_data__objstreams_w_versions.pdf"
25
25
  pdf.save '02_01_check_form_data_ordering_issue.pdf'
26
26
 
27
27
 
28
- pdf = CombinePDF.load './Ruby/test pdfs/share-font-background.pdf'
29
- pdf2 = CombinePDF.load './Ruby/test pdfs/share-font-foreground.pdf'
28
+ pdf = CombinePDF.load '../../test pdfs/share-font-background.pdf'
29
+ pdf2 = CombinePDF.load '../../test pdfs/share-font-foreground.pdf'
30
30
  i = 0
31
31
  pdf.pages.each { |pg| pg << pdf2.pages[i] }
32
32
  pdf.save '03_check_font_conflict.pdf'
33
33
 
34
- pdf = CombinePDF.load './Ruby/test pdfs/nil_1.pdf'
35
- pdf2 = CombinePDF.load './Ruby/test pdfs/nil_2.pdf'
34
+ pdf = CombinePDF.load '../../test pdfs/nil_1.pdf'
35
+ pdf2 = CombinePDF.load '../../test pdfs/nil_2.pdf'
36
36
  pdf << pdf2
37
37
  pdf.save '03_01_nil_value_conflict.pdf'
38
38
 
39
- pdf = CombinePDF.load './Ruby/test pdfs/space_after_streram_keyword.pdf'
39
+ pdf = CombinePDF.load '../../test pdfs/space_after_streram_keyword.pdf'
40
40
  pdf.save '03_02_extra_space_after_stream_keyword.pdf'
41
41
 
42
- pdf = CombinePDF.load './Ruby/test pdfs/nested_difference.pdf'
42
+ pdf = CombinePDF.load '../../test pdfs/nested_difference.pdf'
43
43
  pdf.save '03_03_nested_difference.pdf'
44
44
 
45
- pdf = CombinePDF.load './Ruby/test pdfs/names_go_haywire_0.pdf'
46
- pdf << CombinePDF.load('./Ruby/test pdfs/names_go_haywire_1.pdf')
45
+ pdf = CombinePDF.load '../../test pdfs/names_go_haywire_0.pdf'
46
+ pdf << CombinePDF.load('../../test pdfs/names_go_haywire_1.pdf')
47
47
  pdf.save '04_check_view_and_names_reference.pdf'
48
48
 
49
- pdf = CombinePDF.load('./Ruby/test pdfs/outlines/self_merge_err.pdf')
49
+ pdf = CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
50
50
  pdf.save '05_x1_scribus_test.pdf'
51
- pdf = CombinePDF.load('./Ruby/test pdfs/outlines/self_merge_err.pdf')
52
- pdf << CombinePDF.load('./Ruby/test pdfs/outlines/self_merge_err.pdf')
51
+ pdf = CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
52
+ pdf << CombinePDF.load('../../test pdfs/outlines/self_merge_err.pdf')
53
53
  pdf.save '05_x2_scribus_test.pdf'
54
- # pdf = CombinePDF.load "./Ruby/test pdfs/named_dest.pdf";nil
55
- # pdf.save '05_check_named_dest_links.pdf' # this will take a while
56
- # pdf = CombinePDF.load "./Ruby/test pdfs/named_dest.pdf";nil
57
- pdf << CombinePDF.load('./Ruby/test pdfs/named_dest.pdf'); nil
54
+ pdf = CombinePDF.load "../../test pdfs/outlines/named_dest.pdf";nil
55
+ pdf.save '05_check_named_dest_links.pdf' # this will take a while
56
+ pdf = CombinePDF.load "../../test pdfs/outlines/named_dest.pdf";nil
57
+ pdf << CombinePDF.load('../../test pdfs/outlines/named_dest.pdf'); nil
58
58
  pdf.save '05_1_timeless_check_named_dest_links.pdf' # never ends... :-(
59
59
 
60
- pdf = CombinePDF.load './Ruby/test pdfs/outline_small.pdf'
61
- pdf << CombinePDF.load('./Ruby/test pdfs/outline_small.pdf')
60
+ pdf = CombinePDF.load '../../test pdfs/outline_small.pdf'
61
+ pdf << CombinePDF.load('../../test pdfs/outline_small.pdf')
62
62
  pdf.save '06_check_links_to_second_copy.pdf'
63
63
 
64
- lists = %w(./Ruby/test\ pdfs/outlines/self_merge_err.pdf ./Ruby/test\ pdfs/outlines/big_toc.pdf ./Ruby/test\ pdfs/outlines/bigger_toc.pdf ./Ruby/test\ pdfs/outlines/named_dest_no_toc.pdf ./Ruby/test\ pdfs/outlines/named_dest_no_toc2.pdf ./Ruby/test\ pdfs/outlines/named_dest.pdf ./Ruby/test\ pdfs/outlines/named_dest2.pdf)
64
+ lists = %w(../../test\ pdfs/outlines/self_merge_err.pdf ../../test\ pdfs/outlines/big_toc.pdf ../../test\ pdfs/outlines/bigger_toc.pdf ../../test\ pdfs/outlines/named_dest_no_toc.pdf ../../test\ pdfs/outlines/named_dest_no_toc2.pdf ../../test\ pdfs/outlines/named_dest.pdf ../../test\ pdfs/outlines/named_dest2.pdf)
65
65
 
66
66
  i = 0
67
67
  lists.each do |n|
@@ -92,19 +92,19 @@ pdf.number_pages(start_at: 1,
92
92
 
93
93
  pdf.save('07_named destinations_numbered.pdf')
94
94
 
95
- CombinePDF.load("./Ruby/test\ pdfs/Scribus-unknown_err.pdf").save '08_1-unknown-err-empty-str.pdf'
96
- CombinePDF.load("./Ruby/test\ pdfs/Scribus-unknown_err2.pdf").save '08_2-unknown-err-empty-str.pdf'
97
- CombinePDF.load("./Ruby/test\ pdfs/Scribus-unknown_err3.pdf").save '08_3-unknown-err-empty-str.pdf'
98
- CombinePDF.load("./Ruby/test\ pdfs/xref_in_middle.pdf").save '08_4-xref-in-middle.pdf'
99
- CombinePDF.load("./Ruby/test\ pdfs/xref_split.pdf").save '08_5-xref-fragmented.pdf'
95
+ CombinePDF.load("../../test\ pdfs/Scribus-unknown_err.pdf").save '08_1-unknown-err-empty-str.pdf'
96
+ CombinePDF.load("../../test\ pdfs/Scribus-unknown_err2.pdf").save '08_2-unknown-err-empty-str.pdf'
97
+ CombinePDF.load("../../test\ pdfs/Scribus-unknown_err3.pdf").save '08_3-unknown-err-empty-str.pdf'
98
+ CombinePDF.load("../../test\ pdfs/xref_in_middle.pdf").save '08_4-xref-in-middle.pdf'
99
+ CombinePDF.load("../../test\ pdfs/xref_split.pdf").save '08_5-xref-fragmented.pdf'
100
100
 
101
- CombinePDF.load("/Users/2Be/Ruby/test\ pdfs/nil_object.pdf").save('09_nil_in_parsed_array.pdf')
101
+ CombinePDF.load("../../test\ pdfs/nil_object.pdf").save('09_nil_in_parsed_array.pdf')
102
102
 
103
- encrypted = [ "./Ruby/test\ pdfs/pdf-reader/encrypted_version4_revision4_128bit_aes_user_pass_apples_enc_metadata.pdf",
104
- "./Ruby/test\ pdfs/AESv2\ encrypted.pdf",
105
- "./Ruby/test\ pdfs/pdf-reader/encrypted_version2_revision3_128bit_rc4_blank_user_pass.pdf",
106
- "./Ruby/test\ pdfs/AES\ enc.pdf",
107
- "./Ruby/test\ pdfs/RC4\ enc.pdf"]
103
+ encrypted = [ "../../test\ pdfs/pdf-reader/encrypted_version4_revision4_128bit_aes_user_pass_apples_enc_metadata.pdf",
104
+ "../../test\ pdfs/AESv2\ encrypted.pdf",
105
+ "../../test\ pdfs/pdf-reader/encrypted_version2_revision3_128bit_rc4_blank_user_pass.pdf",
106
+ "../../test\ pdfs/AES\ enc.pdf",
107
+ "../../test\ pdfs/RC4\ enc.pdf"]
108
108
 
109
109
  encrypted.length.times do |i|
110
110
  fname = File.basename encrypted[i]
@@ -132,17 +132,17 @@ pdf.save('11_AcrobatReader_is_unique_page.pdf')
132
132
 
133
133
  puts GC.stat.inspect
134
134
  # unify = [
135
- # "./Ruby/test\ pdfs/AESv2\ encrypted.pdf",
136
- # "./Ruby/test\ pdfs/data-in-comment.pdf",
137
- # "./Ruby/test\ pdfs/file_name.pdf",
138
- # "./Ruby/test\ pdfs/garbage_after_eof.pdf",
139
- # "./Ruby/test\ pdfs/Many\ comments.pdf",
140
- # "./Ruby/test\ pdfs/nested\ contents\ array.PDF",
141
- # "./Ruby/test\ pdfs/nested_resources.pdf",
142
- # "./Ruby/test\ pdfs/original-missing-endobje.pdf",
143
- # "./Ruby/test\ pdfs/original-multi-issue.pdf",
144
- # "./Ruby/test\ pdfs/page_stap_nil_secure.pdf",
145
- # "./Ruby/test\ pdfs/referenced\ decryption.pdf",
135
+ # "../../test\ pdfs/AESv2\ encrypted.pdf",
136
+ # "../../test\ pdfs/data-in-comment.pdf",
137
+ # "../../test\ pdfs/file_name.pdf",
138
+ # "../../test\ pdfs/garbage_after_eof.pdf",
139
+ # "../../test\ pdfs/Many\ comments.pdf",
140
+ # "../../test\ pdfs/nested\ contents\ array.PDF",
141
+ # "../../test\ pdfs/nested_resources.pdf",
142
+ # "../../test\ pdfs/original-missing-endobje.pdf",
143
+ # "../../test\ pdfs/original-multi-issue.pdf",
144
+ # "../../test\ pdfs/page_stap_nil_secure.pdf",
145
+ # "../../test\ pdfs/referenced\ decryption.pdf",
146
146
  # '',
147
147
  # '',
148
148
  # '',
@@ -0,0 +1,48 @@
1
+ require 'bundler/setup'
2
+ require 'minitest/autorun'
3
+ require 'minitest/around/spec'
4
+ require 'combine_pdf'
5
+
6
+ describe 'CombinePDF.load' do
7
+ let(:options) { {} }
8
+
9
+ subject { CombinePDF.load "test/fixtures/files/#{file}", options }
10
+
11
+ describe 'raise_on_encrypted option' do
12
+ let(:file) { 'sample_encrypted_pdf.pdf' }
13
+ let(:options) { { raise_on_encrypted: raise_on_encrypted } }
14
+
15
+ describe 'when raise_on_encrypted: true' do
16
+ let(:raise_on_encrypted) { true }
17
+
18
+ describe 'with encrypted file' do
19
+ it('raises an CombinePDF::EncryptionError') do
20
+ error = assert_raises(CombinePDF::EncryptionError) { subject }
21
+ assert_match 'the file is encrypted', error.message
22
+ end
23
+ end
24
+
25
+ describe 'with unencrypted file' do
26
+ let(:file) { 'sample_pdf.pdf' }
27
+
28
+ it('has a PDF') { assert_instance_of CombinePDF::PDF, subject }
29
+ end
30
+ end
31
+
32
+ describe 'when raise_on_encrypted: false' do
33
+ let(:raise_on_encrypted) { false }
34
+
35
+ describe 'with encrypted file' do
36
+ it('does not raise an CombinePDF::EncryptionError') do
37
+ assert_instance_of CombinePDF::PDF, subject
38
+ end
39
+ end
40
+
41
+ describe 'with unencrypted file' do
42
+ let(:file) { 'sample_pdf.pdf' }
43
+
44
+ it('has a PDF') { assert_instance_of CombinePDF::PDF, subject }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,6 +1,4 @@
1
- require 'bundler/setup'
2
1
  require 'minitest/autorun'
3
- require 'combine_pdf/renderer'
4
2
 
5
3
  class CombinePDFRendererTest < Minitest::Test
6
4
 
Binary file
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: 1.0.22
4
+ version: 1.0.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boaz Segev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-27 00:00:00.000000000 Z
11
+ date: 2023-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-rc4
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-around
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: A nifty gem, in pure Ruby, to parse PDF files and combine (merge) them
70
84
  with other PDF files, number the pages, watermark them or stamp them, create tables,
71
85
  add basic text objects etc` (all using the PDF file format).
@@ -76,6 +90,7 @@ extensions: []
76
90
  extra_rdoc_files: []
77
91
  files:
78
92
  - ".gitignore"
93
+ - ".travis.yml"
79
94
  - CHANGELOG.md
80
95
  - Gemfile
81
96
  - LICENSE.txt
@@ -96,8 +111,11 @@ files:
96
111
  - lib/combine_pdf/renderer.rb
97
112
  - lib/combine_pdf/version.rb
98
113
  - test/automated
114
+ - test/combine_pdf/load_test.rb
99
115
  - test/combine_pdf/renderer_test.rb
100
116
  - test/console
117
+ - test/fixtures/files/sample_encrypted_pdf.pdf
118
+ - test/fixtures/files/sample_pdf.pdf
101
119
  - test/named_dest
102
120
  homepage: https://github.com/boazsegev/combine_pdf
103
121
  licenses:
@@ -118,12 +136,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
136
  - !ruby/object:Gem::Version
119
137
  version: '0'
120
138
  requirements: []
121
- rubygems_version: 3.2.3
139
+ rubygems_version: 3.3.26
122
140
  signing_key:
123
141
  specification_version: 4
124
142
  summary: Combine, stamp and watermark PDF files in pure Ruby.
125
143
  test_files:
126
144
  - test/automated
145
+ - test/combine_pdf/load_test.rb
127
146
  - test/combine_pdf/renderer_test.rb
128
147
  - test/console
148
+ - test/fixtures/files/sample_encrypted_pdf.pdf
149
+ - test/fixtures/files/sample_pdf.pdf
129
150
  - test/named_dest