pdfbeads 1.1.1 → 1.1.3

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
- SHA1:
3
- metadata.gz: 577a47277a3e474a47b740ce93ca89041402c4fb
4
- data.tar.gz: 88a1f950e31e41e47f79ef978d9e589e1b9724fb
2
+ SHA256:
3
+ metadata.gz: 198ab9ffc035604ce4cfb3528dbebfb7746d746de1a429089028102003e35480
4
+ data.tar.gz: e32b5a1de30aeb1bb715f0ea6417478f16f9ba9f229268a55ad3fd4ae9bc67ab
5
5
  SHA512:
6
- metadata.gz: 16ab45bd0c4d63d7c6f567f3df5e2dea2ecc1e9237ac9b5acfc9cd92e31a72a8df7ad184e5c7fd779cb990f58ff64dbb3027464c7579fd79d58fc270ac01c841
7
- data.tar.gz: b946c901407f06aeaf509988341759ba4f4cfc217067b00fb72ad5bc9ae60e4d1dd0729bb7a3761a6c06f71816dcb9398e2cde4335ee8a5620c1686e208fe901
6
+ metadata.gz: 485725e99d06c9216e238626b35ec73d7ea2c64513f5112c24448191b6a09ccef40ef58a24bac291a975c8881779a6e62450e629ebee4c89ec34be9d976b4ccb
7
+ data.tar.gz: f0f53d06628a9433684d77e175cf95446abeebaa54e14e59bb2a637666d06eaa559734a2bac5e43b3d69182d6afb8ef6627d356bcd6c5b3991200a5cd9e8e858
data/COPYING CHANGED
File without changes
data/ChangeLog CHANGED
@@ -77,4 +77,24 @@
77
77
 
78
78
  * hpricot is no longer developed, so switch to Nokagiri for hOCR processing.
79
79
 
80
+ * use String#encode instead of Iconv, when available
81
+
82
+ * Got tired from deps not being automatically resolved, so add them to
83
+ the gemspeck (the preferred method to install on Debian-based distributions
84
+ is now converting pdfbeads*.gem to a deb package with gem2deb).
85
+
80
86
  + English HTML documentation added.
87
+
88
+ 2016 Dec 20 (Alexey Kryukov) Version 1.1.2
89
+ * Add a missing String#encode call
90
+
91
+ 2020 Jan 05 (Alexey Kryukov) Version 1.1.2
92
+ * Respect the photometric interpretation of Group4-encoded tiff images
93
+ * Some JPEG images were erroneously treated as LZW-encoded
94
+
95
+ 2020 Jan 24 (Alexey Kryukov) Version 1.1.2
96
+ * Fixed the /BaseState field in the optional content dictionary, which caused files to be rejected by some viewers
97
+
98
+ 2021 Nov 24 (Alexey Kryukov) Version 1.1.3
99
+ * Fixed some errors/warnings produced by newer rmagick versions
100
+ * Bumped the required rmagick version up to 3.2.0
data/README CHANGED
File without changes
data/bin/pdfbeads CHANGED
@@ -32,7 +32,6 @@
32
32
  #######################################################################
33
33
 
34
34
  require 'optparse'
35
- require 'iconv'
36
35
  require 'time'
37
36
 
38
37
  require 'pdfbeads'
data/doc/pdfbeads.en.html CHANGED
@@ -498,31 +498,27 @@ files (hOCR is a HTML language extension, allowing to store information
498
498
  about exact positioning of characters and markup elements on the page) or
499
499
  imported from another PDF file.</p>
500
500
 
501
- <p>Для создания файлов в формате hOCR необходимо воспользоваться программой
502
- оптического распознавания символов, поддерживающей этот формат, например
503
- <a href="https://launchpad.net/cuneiform-linux/">Cuneiform</a> или
501
+ <p>In order to create hOCR files one should use an OCR application which
502
+ supports this output format, such as
503
+ <a href="https://launchpad.net/cuneiform-linux/">Cuneiform</a> or
504
504
  <a href="http://code.google.com/p/tesseract-ocr/">Tesseract</a>.
505
- Распознанный текст следует сохранить в той же директории, что и остальные
506
- файлы, относящиеся к проекту. При этом каждой распознанной странице должен
507
- соответствовать отдельный файл с тем же базовым именем, что и у исходного
508
- изображения, при расширении HTM(L) или HOCR. Обработка файлов hOCR
509
- осуществляется автоматически при условии, что интерпретатору Ruby доступно
510
- расширение Nokogiri.</p>
511
-
512
- <p>Иное возможное решение заключается в том, чтобы импортировать текстовый
513
- слой из другого PDF-файла (естественно, последний должен быть получен путем
514
- распознавания тех же самых изображений, которые предполагается затем обработать
515
- с помощью pdfbeads). Имя полученного файла следует передать pdfbeads с помощью
516
- ключа <tt>-T</tt> (полная форма&nbsp;&mdash; <tt>-text-pdf</tt>). Эта
517
- возможность особенно важна в тех случаях, когда приходится использовать для
518
- распознавания текста коммерческое приложение (например,
519
- <a href="http://www.abbyy.ru/finereader/">ABBYY Finereader</a>), в котором
520
- не предусмотрена поддержка формата hOCR. <strong>Внимание:</strong> при
521
- создании промежуточного PDF-файла в ABBYY Finereader следует использовать
522
- настройки &laquo;текст под изображением&raquo; или &laquo;текст поверх
523
- изображения&raquo;, поскольку при иных настройках размещение символов на
524
- странице может оказаться не вполне соответствующим исходному графическому
525
- файлу.</p>
505
+ The recognized text should be placed into the same directory as other project
506
+ files by a such way that each hOCR file should have the same base name as its
507
+ source image, while the extension should be either HTM(L) or HOCR. hOCR files
508
+ are automatically processed by pdfbeads if only the Nokogiri extension is
509
+ installed and accessible to the Ruby engine.</p>
510
+
511
+ <p>Another possible solution is to import an OCR layer from another PDF file
512
+ (naturally the later should be produced by recognizing the same set
513
+ of images which is supposed to be processed with pdfbeads). The path to the
514
+ file can be passed to pdfbeads via the <tt>-T</tt> (or <tt>-text-pdf</tt>)
515
+ option. This feature is especially important in those cases where one has
516
+ to use a commercial OCR application (such as
517
+ <a href="http://www.abbyy.ru/finereader/">ABBYY Finereader</a>), which
518
+ doesn't support the hOCR format. <strong>Warning:</strong> you may
519
+ need to experiment with your OCR application options related with PDF output
520
+ to get the best correspondance between the layout of the recognized
521
+ text and the source image.</p>
526
522
 
527
523
  <h3>Processing files with the right-to-left text direction</h3>
528
524
 
data/doc/pdfbeads.ru.html CHANGED
File without changes
@@ -49,7 +49,7 @@ module ImageInspector
49
49
  end
50
50
 
51
51
  # Parse image header and retrieve its basic properties. The code is inspired
52
- # by Sam Stephenson's snippet which demonstrates how to determine a JPEG
52
+ # by Sam Stephenson's snippet which demonstrates how to determine a JPEG
53
53
  # image size ( see http://snippets.dzone.com/posts/show/805) and Paul
54
54
  # Schreiber's code for TIFF (see
55
55
  # http://paulschreiber.com/blog/2010/06/10/tiff-file-dimensions-in-ruby/)
@@ -67,12 +67,12 @@ class ImageInspector::Image
67
67
  # Image format and compression method
68
68
  attr_reader :format, :compression
69
69
  # Return TIFF tags as a hash for TIFF images or JPEG images with EXIF
70
- # data. Otherwise this property is nil.
70
+ # data. Otherwise this property is nil.
71
71
  attr_reader :tags
72
72
 
73
73
  @@gc = (IO.method_defined? :getbyte) ? (:getbyte) : (:getc)
74
74
 
75
- # Set all image attributes to nil and open an image if an optional
75
+ # Set all image attributes to nil and open an image if an optional
76
76
  # argument is specified.
77
77
  def initialize( input=nil )
78
78
  clearData()
@@ -99,7 +99,7 @@ class ImageInspector::Image
99
99
  end
100
100
  end
101
101
 
102
- # Return image data (possibly compressed) for a previously initialized
102
+ # Return image data (possibly compressed) for a previously initialized
103
103
  # image as a sring. For JPEG and JPEG2000 this would be the whole image
104
104
  # as it is stored on the disk, while for TIFF and PNG all headers are
105
105
  # stripped and a raw data stream is returned.
@@ -169,7 +169,7 @@ class ImageInspector::Image
169
169
  sign = io.read( 2 )
170
170
  if sign.eql? "\xFF\xD8".to_binary
171
171
  @format = :JPEG
172
- @compression = :DCTDecode
172
+ @compression = :DCTDecode
173
173
  jpgExamine( io )
174
174
  return
175
175
  end
@@ -191,7 +191,7 @@ class ImageInspector::Image
191
191
  sign << io.read( 4 )
192
192
  if sign.eql? "\x00\x00\x00\x0CjP \x0D\x0A\x87\x0A".to_binary
193
193
  @format = :JPEG2000
194
- @compression = :JPXDecode
194
+ @compression = :JPXDecode
195
195
  j2kParseBox( io )
196
196
  return
197
197
  end
@@ -288,8 +288,8 @@ class ImageInspector::Image
288
288
 
289
289
  # We should not expect to find required image properties (such as width
290
290
  # or height) in EXIF data of a JPEG image.
291
- raise 'malformed TIFF: a required tag is missing' unless @format.eql? :JPEG or (
292
- @tags.has_key? 0x0100 and @tags.has_key? 0x0101 and
291
+ raise 'malformed TIFF: a required tag is missing' unless @format.eql? :JPEG or (
292
+ @tags.has_key? 0x0100 and @tags.has_key? 0x0101 and
293
293
  @tags.has_key? 0x0106 and @tags.has_key? 0x0111 and @tags.has_key? 0x0117 )
294
294
 
295
295
  unless @format.eql? :JPEG
@@ -325,16 +325,19 @@ class ImageInspector::Image
325
325
  end
326
326
  @tags.merge! tiffParseIFD( io,@tags[0x8769][0],intgr ) if @tags.has_key? 0x8769
327
327
 
328
- if @tags.has_key? 0x0103
329
- case @tags[0x0103][0]
330
- when 1
331
- @compression = :NoCompression
332
- when 3, 4
333
- @compression = :CCITTFaxDecode
334
- when 5
335
- @compression = :LZWDecode
336
- when 8, 32946
337
- @compression = :FlateDecode
328
+ # Strangely, got some JPEG's marked as LZW-decoded
329
+ unless @format.eql? :JPEG
330
+ if @tags.has_key? 0x0103
331
+ case @tags[0x0103][0]
332
+ when 1
333
+ @compression = :NoCompression
334
+ when 3, 4
335
+ @compression = :CCITTFaxDecode
336
+ when 5
337
+ @compression = :LZWDecode
338
+ when 8, 32946
339
+ @compression = :FlateDecode
340
+ end
338
341
  end
339
342
  end
340
343
 
@@ -134,7 +134,7 @@ class PDFBeads::PDFBuilder
134
134
  })
135
135
  @doc.addObject(ocBack)
136
136
  cat.addToDict('OCProperties',
137
- sprintf("<< /OCGs[%s %s] /D<< /Intent /View /BaseState (ON) /Order[%s %s] >>>>",
137
+ sprintf("<< /OCGs[%s %s] /D<< /Intent /View /BaseState /ON /Order[%s %s] >>>>",
138
138
  ref(ocFore.getID), ref(ocBack.getID), ref(ocFore.getID), ref(ocBack.getID)))
139
139
 
140
140
  page_objs = Array.new()
@@ -159,7 +159,11 @@ class PDFBeads::PDFBuilder
159
159
  nTree << "/P (#{ltitl.to_text}) "
160
160
  # Iconv::InvalidCharacter, Iconv::IllegalSequence, Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
161
161
  rescue
162
- ltitl = Iconv.iconv( "utf-16be", "utf-8", rng[:prefix] ).first
162
+ if rng[:prefix].respond_to? :encode
163
+ ltitl = rng[:prefix].encode( "utf-16be", "utf-8" )
164
+ else
165
+ ltitl = Iconv.iconv( "utf-16be", "utf-8", rng[:prefix] ).first
166
+ end
163
167
  # If there is no number (just prefix) then put a zero character after the prefix:
164
168
  # this makes acroread happy, but prevents displaying the number in evince
165
169
  unless rng.has_key? :style
@@ -399,11 +403,17 @@ class PDFBeads::PDFBuilder
399
403
  key = $1
400
404
  if keys.include? key
401
405
  begin
406
+ tmp_str = ''
402
407
  if $2.respond_to? :encode
403
- ret[key] = $2.encode( "utf-16be", "utf-8" )
408
+ tmp_str = $2.encode( "utf-16be", "utf-8" )
404
409
  else
405
- ret[key] = Iconv.iconv( "utf-16be", "utf-8", $2 ).first
410
+ tmp_str = Iconv.iconv( "utf-16be", "utf-8", $2 ).first
406
411
  end
412
+ # a parenthesis code in a formally correct utf-16 should nevertheless be escaped
413
+ ret[key] = tmp_str.to_binary
414
+ ret[key].gsub!( /\x5C/,"\x5C\x5C" )
415
+ ret[key].gsub!( /\x28/,"\x5C\x28" )
416
+ ret[key].gsub!( /\x29/,"\x5C\x29" )
407
417
  rescue
408
418
  $stderr.puts("Error: metadata should be specified in utf-8")
409
419
  end
@@ -651,7 +661,7 @@ class PDFBeads::PDFBuilder
651
661
  end
652
662
 
653
663
  def elementText( elem )
654
- # used to put some Iconv stuff here, but nokogiri makes this conversion itself
664
+ # used to put some Iconv stuff here, but nokogiri performs this conversion itself
655
665
  return elem.inner_text.strip
656
666
  end
657
667
 
@@ -893,15 +903,18 @@ class PDFBeads::PDFBuilder
893
903
 
894
904
  unless stencil.compression.eql? :CCITTFaxDecode and rows_per_strip >= height
895
905
  img = ImageList.new( path )
896
- imgdata = img.to_blob{
897
- self.format = 'TIFF'
898
- self.define( 'TIFF','rows-per-strip',height )
899
- self.compression = Group4Compression
906
+ imgdata = img.to_blob { |imd|
907
+ imd.format = 'TIFF'
908
+ imd.define( 'TIFF','rows-per-strip',height )
909
+ imd.compression = Group4Compression
900
910
  }
901
911
  stencil = ImageInspector.new( StringIO.new(imgdata) )
902
912
  img.destroy!
903
913
  end
904
914
  body = stencil.getRawData
915
+ photometric = 0
916
+ photometric = stencil.tags[0x106][0] if
917
+ stencil.format.eql? :TIFF and stencil.tags.has_key? 0x106
905
918
 
906
919
  xobj = XObj.new(Hash[
907
920
  'Type' => '/XObject',
@@ -913,8 +926,14 @@ class PDFBeads::PDFBuilder
913
926
  'ColorSpace' => '/DeviceGray',
914
927
  'BitsPerComponent' => '1',
915
928
  'Filter' => '/CCITTFaxDecode',
916
- 'DecodeParms' => "<< /Columns #{width} /K -1 >>"
929
+ 'DecodeParms' => "<< /Columns #{width} /K -1 >>",
917
930
  ], body)
931
+ if photometric == 1 then
932
+ # As ImageMask is always on, BlackIs1 actually doesn't work, while
933
+ # the Decode array does.
934
+ xobj.addToDict( 'BlackIs1', 'true' )
935
+ xobj.addToDict( 'Decode', '[1 0]' )
936
+ end
918
937
 
919
938
  return [ xobj,width,height,xres,yres ]
920
939
  end
@@ -966,10 +985,10 @@ class PDFBeads::PDFBuilder
966
985
  ( [ :FlateDecode,:LZWDecode,:CCITTFaxDecode ].include? insp.compression and insp.tags[0x0116][0] >= insp.height )))
967
986
 
968
987
  img = ImageList.new( impath )
969
- imgdata = img.to_blob{
970
- self.format = 'PNG'
971
- self.quality = 95
972
- self.compression = ZipCompression
988
+ imgdata = img.to_blob { |imd|
989
+ imd.format = 'PNG'
990
+ imd.quality = 95
991
+ imd.compression = ZipCompression
973
992
  }
974
993
  insp = ImageInspector.new( StringIO.new(imgdata) )
975
994
  img.destroy!
File without changes
File without changes
File without changes
@@ -160,19 +160,19 @@ class PDFBeads::PageDataProvider < Array
160
160
 
161
161
  def writeImage( img,path,fmt )
162
162
  begin
163
- img.write( path ) do
163
+ img.write( path ) do |curimg|
164
164
  case fmt
165
165
  when 'JP2'
166
- self.define( 'JP2','mode','real' )
167
- self.define( 'JP2','numrlvls',4 )
168
- self.define( 'JP2','rate',0.015625 )
166
+ curimg.define( 'JP2','mode','real' )
167
+ curimg.define( 'JP2','numrlvls',4 )
168
+ curimg.define( 'JP2','rate',0.015625 )
169
169
  when 'JPG'
170
- self.quality = 50
170
+ curimg.quality = 50
171
171
  else
172
- self.compression = ZipCompression
173
- self.quality = 95
172
+ curimg.compression = ZipCompression
173
+ curimg.quality = 95
174
174
  end
175
- self.format = fmt
175
+ curimg.format = fmt
176
176
  end
177
177
  return true
178
178
  rescue
@@ -205,10 +205,10 @@ class PDFBeads::PageDataProvider < Array
205
205
  bitonal.colormap( j,crepl )
206
206
  end
207
207
  bitonal.compress_colormap!
208
- bitonal.write( cpath ) do
209
- self.format = 'TIFF'
210
- self.define( 'TIFF','rows-per-strip',img.rows )
211
- self.compression = Group4Compression
208
+ bitonal.write( cpath ) do |curimg|
209
+ curimg.format = 'TIFF'
210
+ curimg.define( 'TIFF','rows-per-strip',img.rows )
211
+ curimg.compression = Group4Compression
212
212
  end
213
213
  bitonal.destroy!
214
214
  created = true
@@ -230,10 +230,10 @@ class PDFBeads::PageDataProvider < Array
230
230
  binpath = "#{@basename}.black.tiff"
231
231
  if not File.exists? binpath or force
232
232
  im_copy = img.copy; bitonal = im_copy.threshold(QuantumRange/255*treshold); im_copy.destroy!
233
- bitonal.write( binpath ){
234
- self.format = 'TIFF'
235
- self.define( 'TIFF','rows-per-strip',img.rows )
236
- self.compression = Group4Compression
233
+ bitonal.write( binpath ) { |curimg|
234
+ curimg.format = 'TIFF'
235
+ curimg.define( 'TIFF','rows-per-strip',img.rows )
236
+ curimg.compression = Group4Compression
237
237
  }
238
238
  bitonal.destroy!
239
239
  map[:created] = true
@@ -324,7 +324,7 @@ class PDFBeads::PageDataProvider < Array
324
324
  PageData.fixResolution( img )
325
325
  mask.resize!( imw,imh ) if mask.columns != imw or mask.rows != imh
326
326
 
327
- no_fg = img.composite( mask,CenterGravity,CopyOpacityCompositeOp )
327
+ no_fg = img.composite( mask,CenterGravity,CopyAlphaCompositeOp )
328
328
  bg = no_fg.blur_channel( 0,6,AllChannels )
329
329
  bg.alpha( DeactivateAlphaChannel )
330
330
 
@@ -346,7 +346,7 @@ class PDFBeads::PageDataProvider < Array
346
346
  ksam = mask.negate
347
347
  mask.destroy!
348
348
 
349
- no_bg = img.composite( ksam,CenterGravity,CopyOpacityCompositeOp )
349
+ no_bg = img.composite( ksam,CenterGravity,CopyAlphaCompositeOp )
350
350
  fg = no_bg.clone
351
351
 
352
352
  # Resize the image to a tiny size and then back to the original size
@@ -403,8 +403,8 @@ class PDFBeads::PageDataProvider < Array
403
403
 
404
404
  # A hack for some Windows versions of RMagick, which throw an error the
405
405
  # first time when Magick.formats is accessed
406
+ retries = 2
406
407
  begin
407
- retries = 2
408
408
  mfmts = Magick.formats
409
409
  rescue
410
410
  retry if (retries -= 1 ) > 0
File without changes
data/lib/pdfbeads.rb CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  require 'zlib'
34
34
 
35
- require 'RMagick'
35
+ require 'rmagick'
36
36
  include Magick
37
37
 
38
38
  begin
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdfbeads
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Kryukov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-30 00:00:00.000000000 Z
11
+ date: 2021-11-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rmagick
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 2.13.0
19
+ version: 3.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 2.13.0
26
+ version: 3.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.5.10
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.5.10
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pdf-reader
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.0.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.0.0
55
55
  description: |2
@@ -70,45 +70,44 @@ extra_rdoc_files:
70
70
  - COPYING
71
71
  - ChangeLog
72
72
  files:
73
+ - COPYING
74
+ - ChangeLog
75
+ - README
76
+ - bin/pdfbeads
77
+ - doc/pdfbeads.en.html
78
+ - doc/pdfbeads.ru.html
79
+ - lib/imageinspector.rb
80
+ - lib/pdfbeads.rb
73
81
  - lib/pdfbeads/pdfbuilder.rb
74
- - lib/pdfbeads/pdfpage.rb
75
- - lib/pdfbeads/pdftoc.rb
82
+ - lib/pdfbeads/pdfdoc.rb
76
83
  - lib/pdfbeads/pdffont.rb
77
84
  - lib/pdfbeads/pdflabels.rb
78
- - lib/pdfbeads/pdfdoc.rb
79
- - lib/pdfbeads.rb
80
- - lib/imageinspector.rb
81
- - bin/pdfbeads
82
- - doc/pdfbeads.ru.html
83
- - doc/pdfbeads.en.html
84
- - README
85
- - COPYING
86
- - ChangeLog
85
+ - lib/pdfbeads/pdfpage.rb
86
+ - lib/pdfbeads/pdftoc.rb
87
87
  homepage: http://pdfbeads.rubyforge.org
88
88
  licenses:
89
- - GPL
89
+ - GPL-3.0+
90
90
  metadata: {}
91
- post_install_message:
91
+ post_install_message:
92
92
  rdoc_options: []
93
93
  require_paths:
94
94
  - lib
95
95
  required_ruby_version: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - '>='
97
+ - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: '0'
100
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  requirements:
106
- - RMagick, v2.13.0 or greater
106
+ - RMagick, v3.2.0 or greater
107
107
  - nokogiri, v1.5.10 or greater
108
108
  - PDF::Reader, v1.0.0 or greater
109
- rubyforge_project: PDFBeads
110
- rubygems_version: 2.0.3
111
- signing_key:
109
+ rubygems_version: 3.2.29
110
+ signing_key:
112
111
  specification_version: 4
113
112
  summary: PDFBeads -- convert scanned images to a single PDF file.
114
113
  test_files: []