rbpdf 1.20.1 → 1.21.0

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: 22e946db75367837ee71cc634ce52b97bef9428b
4
- data.tar.gz: 5b32284cc5b1b9a226691dcb14898400eb7f9739
2
+ SHA256:
3
+ metadata.gz: a5ff3f6272253912bfd08cadee35bda912f4deae8c663fbadd6187f46e5e5710
4
+ data.tar.gz: 4339767a774386b3c18358965c101fcbcb2ba78ae67c05228292843b61a1a504
5
5
  SHA512:
6
- metadata.gz: 7180810606d801b53a8919fd0517156b96d128649ad690b7dddde93762ef2d289334f63ed1698ac5d679f688eb49923ee33b9da16202828327ce276ecac7c0ab
7
- data.tar.gz: 0dcdd44e2e39bf9e153f2a45b521425f7dc75a1af8ecc4c2993c82caf591c09ce5e00e53b4bc69868c886bd04b0aefa8ec1f3461e8d3f776732e1ade0bca08f7
6
+ metadata.gz: 45293dc5fac4368ed11ce0d9cb71b0326ce0823d84bde3d0f1a811cd9de000a73c4b147266b9ab0130c62a329c76aa4e10ba5428d007d6d88f6a1eb62abadd9b
7
+ data.tar.gz: 06a6c03c0f2a8bc45615c14a5c163dc2e5c88a2c76b970098dc7505c424aec7bfe15745ec6894443840d45d209a63e76a718ce13ab35f9ee8be79512362d8034
data/CHANGELOG CHANGED
@@ -1,3 +1,17 @@
1
+ 1.21.0 2023-02-13
2
+ - Support for Ruby 3.0.0, 3.1.0, 3.2.0. (Drop support for Ruby 2.2 and earlier.) #66
3
+ - Support Rails 6 and Rails 7. (Drop support for Rails 3.x, 4.x) #66, #72
4
+ - Fix RMagick 5.0 compatible. #66
5
+ - Infinite loop has been resolved. #68, #74
6
+ - Fixed a bug that caused the x position to shift when an <img> tag was behind a <li> tag in HTML. #74
7
+ - fix: Incorrect characters when copying out of a generated PDF with Unicode fonts. #71
8
+ - Suppresses output for Circle(), Ellipse(), PieSector(), and PieSectorXY() when the radius is 0. #67
9
+ - Don't change an object while iterating over it #59 (by thegcat)
10
+ - fix : bidi bug #56 (by ahorek)
11
+ - Avoid rdoc stack level too deep (SystemStackError) in gem install. #76
12
+ - PDF example output option OUTPUT=true added #70
13
+ - Make the image file path acquisition process extensible #58 (by yui-har)
14
+
1
15
  1.20.1 2019-08-21
2
16
  - fix license warning. (by pavel)
3
17
  - Removed test resource from distribution target in gemspec.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/naitoh/rbpdf.svg?branch=master)](https://travis-ci.org/naitoh/rbpdf)
1
+ [![Build Status](https://github.com/naitoh/rbpdf/workflows/test/badge.svg)](https://github.com/naitoh/rbpdf/actions)
2
2
 
3
3
  # RBPDF Template Plugin
4
4
 
@@ -59,6 +59,16 @@ RBPDF Japanese Example of simple use in .html.erb:
59
59
  %><%==@pdf.output()%>
60
60
  ```
61
61
 
62
+ PDF example output
63
+ ```
64
+ $ OUTPUT=true bundle exec rake test TEST=test/rbpdf_examples_test.rb
65
+ $ ls -1 *.pdf
66
+ example001.pdf
67
+ example002.pdf
68
+ example003.pdf
69
+ :
70
+ ```
71
+
62
72
  See the following files for sample of useage:
63
73
 
64
74
  test_unicode.rbpdf
data/lib/rbpdf/version.rb CHANGED
@@ -1,7 +1,7 @@
1
- # Copyright (c) 2011-2019 NAITOH Jun
1
+ # Copyright (c) 2011-2023 NAITOH Jun
2
2
  # Released under the MIT license
3
3
  # http://www.opensource.org/licenses/MIT
4
4
 
5
5
  module Rbpdf
6
- VERSION = "1.20.1"
6
+ VERSION = "1.21.0"
7
7
  end
data/lib/rbpdf.rb CHANGED
@@ -49,7 +49,7 @@
49
49
  require "rbpdf/version"
50
50
 
51
51
  require 'htmlentities'
52
- require 'rbpdf-font'
52
+ require 'rbpdf-font'
53
53
  require 'erb'
54
54
 
55
55
  begin
@@ -5030,7 +5030,7 @@ class RBPDF
5030
5030
  tmpname = Tempfile.new(File::basename(file), @@k_path_cache)
5031
5031
  tmpname.binmode
5032
5032
  jpeg_quality = @jpeg_quality
5033
- tmpname.print img.to_blob { self.quality = jpeg_quality }
5033
+ tmpname.print img.to_blob { |image| image.quality = jpeg_quality }
5034
5034
  else
5035
5035
  return false
5036
5036
  end
@@ -6796,9 +6796,12 @@ protected
6796
6796
  # sort glyphs by key
6797
6797
  #ksort(subsetglyphs)
6798
6798
  # add composite glyps to subsetglyphs and remove missing glyphs
6799
+ subsetglyphs_tmp = []
6799
6800
  subsetglyphs.each_with_index {|val, key|
6800
6801
  next if val.nil?
6802
+
6801
6803
  if indexToLoc[key]
6804
+ subsetglyphs_tmp[key] = val
6802
6805
  offset = table['glyf']['offset'] + indexToLoc[key]
6803
6806
  numberOfContours = getSHORT(font, offset); offset += 2
6804
6807
  if numberOfContours < 0 # composite glyph
@@ -6808,7 +6811,7 @@ protected
6808
6811
  glyphIndex = getUSHORT(font, offset); offset += 2
6809
6812
  if subsetglyphs[glyphIndex].nil? and indexToLoc[glyphIndex]
6810
6813
  # add missing glyphs
6811
- subsetglyphs[glyphIndex] = true
6814
+ subsetglyphs_tmp[glyphIndex] = true
6812
6815
  end
6813
6816
  # skip some bytes by case
6814
6817
  if (flags & 1) != 0
@@ -6827,10 +6830,10 @@ protected
6827
6830
  break if (flags & 32) == 0
6828
6831
  }
6829
6832
  end
6830
- else
6831
- subsetglyphs.delete_at(key)
6832
6833
  end
6833
6834
  }
6835
+ subsetglyphs = subsetglyphs_tmp
6836
+
6834
6837
  # build new glyf table with only used glyphs
6835
6838
  glyf = ''
6836
6839
  glyfSize = 0
@@ -7241,11 +7244,19 @@ protected
7241
7244
  out << ' /BaseFont /' + fontname + ''
7242
7245
  out << ' /Name /F' + font['i'].to_s
7243
7246
  out << ' /Encoding /' + font['enc']
7244
- out << ' /DescendantFonts [' + (@n + 1).to_s + ' 0 R]'
7247
+ out << " /ToUnicode #{@n + 1} 0 R"
7248
+ out << " /DescendantFonts [#{@n + 2} 0 R]"
7245
7249
  out << ' >>'
7246
7250
  out << ' endobj'
7247
7251
  out(out)
7248
7252
 
7253
+ # ToUnicode Object
7254
+ newobj()
7255
+ filter = @compress ? '/Filter /FlateDecode ' : ''
7256
+ stream = @compress ? Zlib::Deflate.deflate(@@cmap_identity_h) : @@cmap_identity_h
7257
+ stream = getrawstream(stream)
7258
+ out("<<#{filter}/Length #{stream.length}>> stream\n#{stream}\nendstream\nendobj")
7259
+
7249
7260
  # CIDFontType2
7250
7261
  # A CIDFont whose glyph descriptions are based on TrueType font technology
7251
7262
  newobj();
@@ -8076,18 +8087,27 @@ protected
8076
8087
  end
8077
8088
 
8078
8089
  #
8079
- # Format output stream
8090
+ # get raw output stream.
8080
8091
  # @param string :s string to output.
8081
8092
  # @param int :n object reference for encryption mode
8082
8093
  # @access protected
8083
8094
  #
8084
- def getstream(s, n=0)
8095
+ def getrawstream(s, n=0)
8085
8096
  if n <= 0
8086
8097
  # default to current object
8087
8098
  n = @n
8088
8099
  end
8089
- s = encrypt_data(n, s)
8090
- return "stream\n" + s + "\nendstream"
8100
+ encrypt_data(n, s)
8101
+ end
8102
+
8103
+ #
8104
+ # Format output stream
8105
+ # @param string :s string to output.
8106
+ # @param int :n object reference for encryption mode
8107
+ # @access protected
8108
+ #
8109
+ def getstream(s, n=0)
8110
+ "stream\n" + getrawstream(s, n=0) + "\nendstream"
8091
8111
  end
8092
8112
 
8093
8113
  #
@@ -8855,7 +8875,7 @@ public
8855
8875
  dash = style['dash']
8856
8876
  dash_string = ''
8857
8877
  if dash != 0 and dash != ''
8858
- if dash =~ /^.+,/
8878
+ if dash.is_a?(String) && dash =~ /^.+,/
8859
8879
  tab = dash.split(',')
8860
8880
  else
8861
8881
  tab = [dash]
@@ -9131,6 +9151,8 @@ public
9131
9151
  # [@since 4.9.019 (2010-04-26)]
9132
9152
  #
9133
9153
  def outellipticalarc(xc, yc, rx, ry, xang=0, angs=0, angf=360, pie=false, nc=2)
9154
+ return if rx == 0 && ry == 0
9155
+
9134
9156
  k = @k
9135
9157
  if nc < 2
9136
9158
  nc = 2
@@ -9768,7 +9790,7 @@ public
9768
9790
  end
9769
9791
  when @@k_pdf
9770
9792
  # X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override.
9771
- if remember.length
9793
+ unless remember.empty?
9772
9794
  last = remember.length - 1
9773
9795
  case remember[last][:num]
9774
9796
  when @@k_rle, @@k_lre, @@k_rlo, @@k_lro
@@ -10176,12 +10198,7 @@ public
10176
10198
  end
10177
10199
  end
10178
10200
  # remove marked characters
10179
- chardata2.each_with_index do |value, key|
10180
- if value[:char] == false
10181
- chardata2.delete_at(key)
10182
- end
10183
- end
10184
- chardata = chardata2
10201
+ chardata = chardata2.reject {|value| value[:char] == false }
10185
10202
  numchars = chardata.size
10186
10203
  chardata2 = nil
10187
10204
  arabicarr = nil
@@ -11024,16 +11041,20 @@ protected
11024
11041
  cssblocks[key] = block.split('{')
11025
11042
  }
11026
11043
  # split groups of selectors (comma-separated list of selectors)
11044
+ cssblocks_tmp = []
11027
11045
  cssblocks.each_with_index { |block, key|
11028
11046
  # index 0 contains the CSS selector, index 1 contains CSS properties
11029
11047
  if block[0].index(',')
11030
11048
  selectors = block[0].split(',')
11031
11049
  selectors.each {|sel|
11032
- cssblocks.push [sel.strip, block[1]]
11050
+ cssblocks_tmp.push [sel.strip, block[1]]
11033
11051
  }
11034
- cssblocks.delete_at(key)
11052
+ else
11053
+ cssblocks_tmp.push [block[0], block[1]]
11035
11054
  end
11036
11055
  }
11056
+ cssblocks = cssblocks_tmp
11057
+
11037
11058
  # covert array to selector => properties
11038
11059
  cssdata = {}
11039
11060
  cssblocks.each { |block|
@@ -11312,11 +11333,11 @@ protected
11312
11333
  while html_b =~ /<xre([^\>]*)>(.*?)\n(.*?)<\/pre>/mi
11313
11334
  # preserve newlines on <pre> tag
11314
11335
  html_b = html_b.gsub(/<xre([^\>]*)>(.*?)\n(.*?)<\/pre>/mi) do
11315
- if ($2 != '') and ($3 != '')
11336
+ if ($2 != '') and ($3 != '')
11316
11337
  "<xre#{$1}>#{$2}<br />#{$3}</pre>"
11317
- elsif ($2 == '') and ($3 != '')
11338
+ elsif ($2 == '') and ($3 != '')
11318
11339
  "<xre#{$1}>#{$3}</pre>"
11319
- elsif ($2 != '') and ($3 == '')
11340
+ elsif ($2 != '') and ($3 == '')
11320
11341
  "<xre#{$1}>#{$2}</pre>"
11321
11342
  else
11322
11343
  "<xre#{$1}></pre>"
@@ -12879,7 +12900,7 @@ public
12879
12900
  startlinepage = @page
12880
12901
  end
12881
12902
  end
12882
- elsif dom[key]['value'].strip.length > 0
12903
+ elsif dom[key]['value'].length > 0
12883
12904
  # print list-item
12884
12905
  if !empty_string(@lispacer)
12885
12906
  SetFont(pfontname, pfontstyle, pfontsize)
@@ -12898,7 +12919,7 @@ public
12898
12919
  end
12899
12920
  end
12900
12921
  # text
12901
- @htmlvspace = 0
12922
+ @htmlvspace = 0 unless dom[key]['value'].strip.length == 0
12902
12923
  if !@premode and isRTLTextDir()
12903
12924
  # reverse spaces order
12904
12925
  len1 = dom[key]['value'].length
@@ -13331,27 +13352,10 @@ public
13331
13352
  SetLeftMargin(@l_margin + @c_margin)
13332
13353
  SetRightMargin(@r_margin + @c_margin)
13333
13354
 
13334
- begin
13335
- if tag['attribute']['src'] =~ /^http/
13336
- tmpFile = get_image_file(tag['attribute']['src'])
13337
- img_file = tmpFile.path
13338
- else
13339
- img_file = tag['attribute']['src']
13340
- end
13341
- # if (type == 'eps') or (type == 'ai')
13342
- # ImageEps(img_file, xpos, @y, iw, ih, imglink, true, align, '', border, true)
13343
- # elsif type == 'svg'
13344
- # ImageSVG(img_file, xpos, @y, iw, ih, imglink, align, '', border, true)
13345
- # else
13346
- result_img = Image(img_file, xpos, @y, iw, ih, '', imglink, align, false, 300, '', false, false, border, false, false, true)
13347
- # end
13348
- rescue => err
13349
- logger.error "pdf: Image: error: #{err.message}"
13350
- result_img = false
13351
- ensure
13352
- # remove temp files
13353
- tmpFile.close(true) unless tmpFile.nil?
13354
- end
13355
+ result_img =
13356
+ proc_image_file(tag['attribute']['src']) do |img_file|
13357
+ Image(img_file, xpos, @y, iw, ih, '', imglink, align, false, 300, '', false, false, border, false, false, true)
13358
+ end
13355
13359
 
13356
13360
  if result_img or ih != 0
13357
13361
  case align
@@ -13487,6 +13491,25 @@ public
13487
13491
  end
13488
13492
  protected :openHTMLTagHandler
13489
13493
 
13494
+ def proc_image_file(src, &block)
13495
+ tmpFile = nil
13496
+ img_file =
13497
+ if src =~ /^http/
13498
+ tmpFile = get_image_file(src)
13499
+ tmpFile.path
13500
+ else
13501
+ src
13502
+ end
13503
+ yield img_file
13504
+ rescue => err
13505
+ logger.error "pdf: Image: error: #{err.message}"
13506
+ false
13507
+ ensure
13508
+ # remove temp files
13509
+ tmpFile.close(true) if tmpFile
13510
+ end
13511
+ private :proc_image_file
13512
+
13490
13513
  #
13491
13514
  # Process closing tags.
13492
13515
  # [@param array :dom] html dom array
data/lib/unicode_data.rb CHANGED
@@ -18326,6 +18326,35 @@ module Unicode_data
18326
18326
  382=>158 # zcaron2
18327
18327
  }
18328
18328
 
18329
+ #
18330
+ # ToUnicode map for Identity-H
18331
+ # CMapType : 1 = Convert to CID, 2 = Convert to Unicode
18332
+ #
18333
+ @@cmap_identity_h = <<-CMap
18334
+ /CIDInit /ProcSet findresource begin
18335
+ 12 dict begin
18336
+ begincmap
18337
+ /CMapName /Adobe-Identity-UCS def
18338
+ /CMapType 2 def
18339
+ /CIDSystemInfo <<
18340
+ /Registry (Adobe)
18341
+ /Ordering (UCS)
18342
+ /Supplement 0
18343
+ >> def
18344
+ /WMode 0 def
18345
+ 1 begincodespacerange
18346
+ <0000> <FFFF>
18347
+ endcodespacerange
18348
+
18349
+ 1 beginbfrange
18350
+ <0000> <ffff> <0000>
18351
+ endbfrange
18352
+ endcmap
18353
+ CMapName currentdict /CMap defineresource pop
18354
+ end
18355
+ end
18356
+ CMap
18357
+
18329
18358
  end
18330
18359
 
18331
18360
  #============================================================+
data/rbpdf.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
- # Copyright (c) 2011-2019 NAITOH Jun
2
+ # Copyright (c) 2011-2023 NAITOH Jun
3
3
  # Released under the MIT license
4
4
  # http://www.opensource.org/licenses/MIT
5
5
 
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  ["Rakefile", "rbpdf.gemspec", "Gemfile",
24
24
  "CHANGELOG", "test_unicode.rbpdf", "README.md", "LICENSE.TXT", "MIT-LICENSE",
25
25
  "utf8test.txt", "logo_example.png" ]
26
- spec.rdoc_options += [ '--exclude', 'lib/fonts/',
26
+ spec.rdoc_options += [ '--exclude', 'lib/core/mini_magick.rb',
27
27
  '--exclude', 'lib/htmlcolors.rb',
28
28
  '--exclude', 'lib/unicode_data.rb' ]
29
29
 
@@ -31,23 +31,12 @@ Gem::Specification.new do |spec|
31
31
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- if RUBY_VERSION == "1.8.7"
35
- spec.add_runtime_dependency "htmlentities", "= 4.3.1"
36
- else
37
- spec.add_runtime_dependency "htmlentities"
38
- end
34
+ spec.add_runtime_dependency "htmlentities"
39
35
  spec.add_runtime_dependency "rbpdf-font", "~> 1.19.0"
40
- spec.required_ruby_version = '>= 1.8.7'
36
+ spec.required_ruby_version = '>= 2.3.0'
41
37
 
42
38
  spec.add_development_dependency "bundler"
43
- if RUBY_VERSION <'1.9.3' # Ruby 1.8.7 or 1.9.2
44
- spec.add_development_dependency "rake", "<= 10.5"
45
- else
46
- spec.add_development_dependency "rake"
47
- end
48
- if RUBY_VERSION <'1.9' # Ruby 1.8.7
49
- spec.add_development_dependency "test-unit", "<= 3.1.5"
50
- else
51
- spec.add_development_dependency "test-unit", "~> 3.2"
52
- end
39
+ spec.add_development_dependency "rake"
40
+ spec.add_development_dependency "test-unit"
41
+ spec.add_development_dependency "webrick"
53
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbpdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.1
4
+ version: 1.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - NAITOH Jun
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-21 00:00:00.000000000 Z
11
+ date: 2023-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: htmlentities
@@ -70,16 +70,30 @@ dependencies:
70
70
  name: test-unit
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '3.2'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webrick
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '3.2'
96
+ version: '0'
83
97
  description: A template plugin allowing the inclusion of ERB-enabled RBPDF template
84
98
  files.
85
99
  email:
@@ -109,10 +123,10 @@ licenses:
109
123
  - MIT
110
124
  - LGPL-2.1-or-later
111
125
  metadata: {}
112
- post_install_message:
126
+ post_install_message:
113
127
  rdoc_options:
114
128
  - "--exclude"
115
- - lib/fonts/
129
+ - lib/core/mini_magick.rb
116
130
  - "--exclude"
117
131
  - lib/htmlcolors.rb
118
132
  - "--exclude"
@@ -123,16 +137,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
137
  requirements:
124
138
  - - ">="
125
139
  - !ruby/object:Gem::Version
126
- version: 1.8.7
140
+ version: 2.3.0
127
141
  required_rubygems_version: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="
130
144
  - !ruby/object:Gem::Version
131
145
  version: '0'
132
146
  requirements: []
133
- rubyforge_project:
134
- rubygems_version: 2.6.10
135
- signing_key:
147
+ rubygems_version: 3.3.7
148
+ signing_key:
136
149
  specification_version: 4
137
150
  summary: RBPDF via TCPDF.
138
151
  test_files: []