rbpdf 1.18.4 → 1.18.5
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 +7 -7
- data/CHANGELOG +9 -0
- data/lib/rbpdf.rb +128 -91
- data/lib/rbpdf/version.rb +1 -1
- data/test/rbpdf_css_test.rb +276 -1
- data/test/rbpdf_dom_test.rb +31 -15
- data/test/rbpdf_html_func_test.rb +26 -0
- data/test/rbpdf_html_test.rb +428 -13
- metadata +173 -179
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
---
|
2
|
+
SHA512:
|
3
|
+
data.tar.gz: 58ee6415442d443f581733352686a7ce871a2cfe04b5bf683544ba7e8202b934f7258d0c403942b07c52c2a56ad6288f02fb1bb210c1ca94401ca092729da139
|
4
|
+
metadata.gz: fca83b46f3d2abdc1efea548a5a7c7963b1fbbbbdde7e6dbf7a1b279a80cb25bb628a4eba853eb064cdef79ea4ad514928b6d243f3b4c01bf42f03046c2a122f
|
5
|
+
SHA1:
|
6
|
+
data.tar.gz: a973c8fae4a4b576b68cd8e5a7dc3b73211e26ab
|
7
|
+
metadata.gz: c27e1dfa12f3cbfbf8cee92658d17a99cff0a1e0
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
1.18.5 2015-01-24
|
2
|
+
- Rails 4.2 and Ruby 2.2 supported.
|
3
|
+
- Fix Rails 4.2 (new HTML sanitizer) compatible.
|
4
|
+
- Method getHTMLUnitToUnits() and SetDisplayMode() was fixed, and the problem when dividing, by an integer was fixed.
|
5
|
+
- Remove Rails 4.2 deprecated ::ActionView::Base.sanitized_allowed_css_properties=.
|
6
|
+
- Fixed no left padding problem on tables.
|
7
|
+
- Fixed thead tag position problem on page break.
|
8
|
+
- fix case of missing HTML image (without height attribute) file.
|
9
|
+
|
1
10
|
1.18.4 2014-12-21
|
2
11
|
- utf8Bidi() Persion 0x200C(8204) and endedletter bug fixed.
|
3
12
|
- utf8Bidi() Bidirectional Algorithm X9/I1 rule BN(ZERO WIDTH NON-JOINER) bug fixed.
|
data/lib/rbpdf.rb
CHANGED
@@ -363,7 +363,6 @@ class RBPDF
|
|
363
363
|
@radiobutton_groups ||= []
|
364
364
|
@radio_groups ||= []
|
365
365
|
@textindent ||= 0
|
366
|
-
@nested_table = false
|
367
366
|
|
368
367
|
@start_transaction_y ||= 0
|
369
368
|
@in_thead ||= false
|
@@ -1340,7 +1339,7 @@ class RBPDF
|
|
1340
1339
|
#
|
1341
1340
|
def SetDisplayMode(zoom, layout='SinglePage', mode='UseNone')
|
1342
1341
|
#Set display mode in viewer
|
1343
|
-
if (zoom == 'fullpage' or zoom == 'fullwidth' or zoom == 'real' or zoom == 'default' or
|
1342
|
+
if (zoom == 'fullpage' or zoom == 'fullwidth' or zoom == 'real' or zoom == 'default' or zoom.is_a?(Numeric))
|
1344
1343
|
@zoom_mode = zoom
|
1345
1344
|
else
|
1346
1345
|
Error('Incorrect zoom display mode: ' + zoom)
|
@@ -2001,8 +2000,8 @@ class RBPDF
|
|
2001
2000
|
#barcode = getBarcode()
|
2002
2001
|
#if !barcode.empty?
|
2003
2002
|
# Ln(line_width)
|
2004
|
-
# barcode_width = ((getPageWidth() - ormargins['left'] - ormargins['right']) / 3).round
|
2005
|
-
# write1DBarcode(barcode, 'C128B', GetX(), cur_y + line_width, barcode_width, ((getFooterMargin() / 3) - line_width), 0.3, '', '')
|
2003
|
+
# barcode_width = ((getPageWidth() - ormargins['left'] - ormargins['right']) / 3.0).round
|
2004
|
+
# write1DBarcode(barcode, 'C128B', GetX(), cur_y + line_width, barcode_width, ((getFooterMargin() / 3.0) - line_width), 0.3, '', '')
|
2006
2005
|
#end
|
2007
2006
|
w_page = (@l.nil? or @l['w_page'].nil?) ? '' : @l['w_page']
|
2008
2007
|
if @pagegroups.empty?
|
@@ -2126,8 +2125,9 @@ class RBPDF
|
|
2126
2125
|
# set margins
|
2127
2126
|
prev_lMargin = @l_margin
|
2128
2127
|
prev_rMargin = @r_margin
|
2129
|
-
|
2130
|
-
@
|
2128
|
+
prev_cMargin = @c_margin
|
2129
|
+
@l_margin = @thead_margins['lmargin']
|
2130
|
+
@r_margin = @thead_margins['rmargin']
|
2131
2131
|
@c_margin = @thead_margins['cmargin']
|
2132
2132
|
if @rtl
|
2133
2133
|
@x = @w - @r_margin
|
@@ -2145,6 +2145,7 @@ class RBPDF
|
|
2145
2145
|
@lasth = 0
|
2146
2146
|
@l_margin = prev_lMargin
|
2147
2147
|
@r_margin = prev_rMargin
|
2148
|
+
@c_margin = prev_cMargin
|
2148
2149
|
end
|
2149
2150
|
end
|
2150
2151
|
protected :setTableHeader
|
@@ -2840,12 +2841,12 @@ class RBPDF
|
|
2840
2841
|
@font_size_pt = size;
|
2841
2842
|
@font_size = size.to_f / @k;
|
2842
2843
|
if !@current_font['desc'].nil? and !@current_font['desc']['Ascent'].nil? and (@current_font['desc']['Ascent'] > 0)
|
2843
|
-
@font_ascent = @current_font['desc']['Ascent'] * @font_size / 1000
|
2844
|
+
@font_ascent = @current_font['desc']['Ascent'] * @font_size / 1000.0
|
2844
2845
|
else
|
2845
2846
|
@font_ascent = 0.85 * @font_size
|
2846
2847
|
end
|
2847
2848
|
if !@current_font['desc'].nil? and !@current_font['desc']['Descent'].nil? and (@current_font['desc']['Descent'] <= 0)
|
2848
|
-
@font_descent = - @current_font['desc']['Descent'] * @font_size / 1000
|
2849
|
+
@font_descent = - @current_font['desc']['Descent'] * @font_size / 1000.0
|
2849
2850
|
else
|
2850
2851
|
@font_descent = 0.15 * @font_size
|
2851
2852
|
end
|
@@ -2870,7 +2871,7 @@ class RBPDF
|
|
2870
2871
|
fontdata = AddFont(font, style)
|
2871
2872
|
font = getFontBuffer(fontdata['fontkey'])
|
2872
2873
|
if font['desc'] and font['desc']['Descent'] and (font['desc']['Descent'] <= 0)
|
2873
|
-
descent = - font['desc']['Descent'] * sizek / 1000
|
2874
|
+
descent = - font['desc']['Descent'] * sizek / 1000.0
|
2874
2875
|
else
|
2875
2876
|
descent = 0.15 * sizek
|
2876
2877
|
end
|
@@ -2893,7 +2894,7 @@ class RBPDF
|
|
2893
2894
|
fontdata = AddFont(font, style)
|
2894
2895
|
font = getFontBuffer(fontdata['fontkey'])
|
2895
2896
|
if font['desc'] and font['desc']['Ascent'] and (font['desc']['Ascent'] > 0)
|
2896
|
-
ascent = font['desc']['Ascent'] * sizek / 1000
|
2897
|
+
ascent = font['desc']['Ascent'] * sizek / 1000.0
|
2897
2898
|
else
|
2898
2899
|
ascent = 0.85 * sizek
|
2899
2900
|
end
|
@@ -3401,46 +3402,46 @@ class RBPDF
|
|
3401
3402
|
case valign
|
3402
3403
|
when 'T'
|
3403
3404
|
# top
|
3404
|
-
y -= @line_width / 2
|
3405
|
+
y -= @line_width / 2.0
|
3405
3406
|
when 'B'
|
3406
3407
|
# bottom
|
3407
|
-
y -= (h - @font_ascent - @font_descent - @line_width / 2)
|
3408
|
+
y -= (h - @font_ascent - @font_descent - @line_width / 2.0)
|
3408
3409
|
else # 'M'
|
3409
3410
|
# center
|
3410
|
-
y -= (h - @font_ascent - @font_descent) / 2
|
3411
|
+
y -= (h - @font_ascent - @font_descent) / 2.0
|
3411
3412
|
end
|
3412
3413
|
when 'L'
|
3413
3414
|
# font baseline
|
3414
3415
|
case valign
|
3415
3416
|
when 'T'
|
3416
3417
|
# top
|
3417
|
-
y -= (@font_ascent + @line_width / 2)
|
3418
|
+
y -= (@font_ascent + @line_width / 2.0)
|
3418
3419
|
when 'B'
|
3419
3420
|
# bottom
|
3420
|
-
y -= (h - @font_descent - @line_width / 2)
|
3421
|
+
y -= (h - @font_descent - @line_width / 2.0)
|
3421
3422
|
else # 'M'
|
3422
3423
|
# center
|
3423
|
-
y -= (h + @font_ascent - @font_descent) / 2
|
3424
|
+
y -= (h + @font_ascent - @font_descent) / 2.0
|
3424
3425
|
end
|
3425
3426
|
when 'D'
|
3426
3427
|
# font bottom
|
3427
3428
|
case valign
|
3428
3429
|
when 'T'
|
3429
3430
|
# top
|
3430
|
-
y -= (@font_ascent + @font_descent + @line_width / 2)
|
3431
|
+
y -= (@font_ascent + @font_descent + @line_width / 2.0)
|
3431
3432
|
when 'B'
|
3432
3433
|
# bottom
|
3433
|
-
y -= (h - @line_width / 2)
|
3434
|
+
y -= (h - @line_width / 2.0)
|
3434
3435
|
else # 'M'
|
3435
3436
|
# center
|
3436
|
-
y -= (h + @font_ascent + @font_descent) / 2
|
3437
|
+
y -= (h + @font_ascent + @font_descent) / 2.0
|
3437
3438
|
end
|
3438
3439
|
when 'B'
|
3439
3440
|
# cell bottom
|
3440
3441
|
y -= h
|
3441
3442
|
when 'C'
|
3442
3443
|
# cell center
|
3443
|
-
y -= h / 2
|
3444
|
+
y -= h / 2.0
|
3444
3445
|
else # 'T'
|
3445
3446
|
# cell top
|
3446
3447
|
end
|
@@ -3449,13 +3450,13 @@ class RBPDF
|
|
3449
3450
|
case valign
|
3450
3451
|
when 'T'
|
3451
3452
|
# top
|
3452
|
-
basefonty = y + @font_ascent + @line_width / 2
|
3453
|
+
basefonty = y + @font_ascent + @line_width / 2.0
|
3453
3454
|
when 'B'
|
3454
3455
|
# bottom
|
3455
|
-
basefonty = y + h - @font_descent - @line_width / 2
|
3456
|
+
basefonty = y + h - @font_descent - @line_width / 2.0
|
3456
3457
|
else # 'M'
|
3457
3458
|
# center
|
3458
|
-
basefonty = y + (h + @font_ascent - @font_descent) / 2
|
3459
|
+
basefonty = y + (h + @font_ascent - @font_descent) / 2.0
|
3459
3460
|
end
|
3460
3461
|
|
3461
3462
|
if empty_string(w) or (w <= 0)
|
@@ -3482,7 +3483,7 @@ class RBPDF
|
|
3482
3483
|
s << sprintf('%.2f %.2f %.2f %.2f re %s ', xk, (@h - y) * k, w * k, -h * k, op)
|
3483
3484
|
end
|
3484
3485
|
if (border.is_a?(String))
|
3485
|
-
lm = @line_width / 2
|
3486
|
+
lm = @line_width / 2.0
|
3486
3487
|
if (border.include?('L'))
|
3487
3488
|
if @rtl
|
3488
3489
|
xk = (x - w) * k
|
@@ -3622,7 +3623,7 @@ class RBPDF
|
|
3622
3623
|
txt2 = txt2.gsub("\r", ' ')
|
3623
3624
|
case align
|
3624
3625
|
when 'C'
|
3625
|
-
dx = (w - width) / 2
|
3626
|
+
dx = (w - width) / 2.0
|
3626
3627
|
when 'R'
|
3627
3628
|
if @rtl
|
3628
3629
|
dx = @c_margin
|
@@ -3684,7 +3685,7 @@ class RBPDF
|
|
3684
3685
|
s<<' Q';
|
3685
3686
|
end
|
3686
3687
|
if link && ((link.is_a?(String) and !link.empty?) or (link.is_a?(Fixnum) and link != 0)) # Fixnum is PDF file Page No.
|
3687
|
-
Link(xdx, y + ((h - @font_size) / 2), width, @font_size, link, ns)
|
3688
|
+
Link(xdx, y + ((h - @font_size) / 2.0), width, @font_size, link, ns)
|
3688
3689
|
end
|
3689
3690
|
end
|
3690
3691
|
|
@@ -3834,12 +3835,12 @@ class RBPDF
|
|
3834
3835
|
starty = @y
|
3835
3836
|
if autopadding
|
3836
3837
|
# Adjust internal padding
|
3837
|
-
if @c_margin < (@line_width / 2)
|
3838
|
-
@c_margin = @line_width / 2
|
3838
|
+
if @c_margin < (@line_width / 2.0)
|
3839
|
+
@c_margin = @line_width / 2.0
|
3839
3840
|
end
|
3840
3841
|
# Add top space if needed
|
3841
3842
|
if (@lasth - @font_size) < @line_width
|
3842
|
-
@y += @line_width / 2
|
3843
|
+
@y += @line_width / 2.0
|
3843
3844
|
end
|
3844
3845
|
# add top padding
|
3845
3846
|
@y += @c_margin
|
@@ -3859,7 +3860,7 @@ class RBPDF
|
|
3859
3860
|
@y += @c_margin
|
3860
3861
|
# Add bottom space if needed
|
3861
3862
|
if (@lasth - @font_size) < @line_width
|
3862
|
-
@y += @line_width / 2
|
3863
|
+
@y += @line_width / 2.0
|
3863
3864
|
end
|
3864
3865
|
end
|
3865
3866
|
|
@@ -4085,8 +4086,8 @@ class RBPDF
|
|
4085
4086
|
end
|
4086
4087
|
if autopadding
|
4087
4088
|
# adjust internal padding
|
4088
|
-
if cellMargin < (lineWidth / 2)
|
4089
|
-
cellMargin = lineWidth / 2
|
4089
|
+
if cellMargin < (lineWidth / 2.0)
|
4090
|
+
cellMargin = lineWidth / 2.0
|
4090
4091
|
end
|
4091
4092
|
end
|
4092
4093
|
wmax = w - (2 * cellMargin)
|
@@ -4187,8 +4188,8 @@ class RBPDF
|
|
4187
4188
|
lineWidth = @line_width
|
4188
4189
|
end
|
4189
4190
|
# adjust internal padding
|
4190
|
-
if cellMargin < (lineWidth / 2)
|
4191
|
-
cellMargin = lineWidth / 2
|
4191
|
+
if cellMargin < (lineWidth / 2.0)
|
4192
|
+
cellMargin = lineWidth / 2.0
|
4192
4193
|
end
|
4193
4194
|
# add top and bottom space if needed
|
4194
4195
|
if (@lasth - @font_size) < lineWidth
|
@@ -4817,6 +4818,7 @@ class RBPDF
|
|
4817
4818
|
prev_x = @x
|
4818
4819
|
if checkPageBreak(h, y)
|
4819
4820
|
y = @y
|
4821
|
+
y += @c_margin if !empty_string(@thead) and !@in_thead ### fix ###
|
4820
4822
|
if @rtl
|
4821
4823
|
x += prev_x - @x
|
4822
4824
|
else
|
@@ -4950,7 +4952,7 @@ class RBPDF
|
|
4950
4952
|
if palign == 'L'
|
4951
4953
|
ximg = @l_margin
|
4952
4954
|
elsif palign == 'C'
|
4953
|
-
ximg = (@w + @l_margin - @r_margin - w) / 2
|
4955
|
+
ximg = (@w + @l_margin - @r_margin - w) / 2.0
|
4954
4956
|
elsif palign == 'R'
|
4955
4957
|
ximg = @w - @r_margin - w
|
4956
4958
|
else
|
@@ -4961,7 +4963,7 @@ class RBPDF
|
|
4961
4963
|
if palign == 'L'
|
4962
4964
|
ximg = @l_margin
|
4963
4965
|
elsif palign == 'C'
|
4964
|
-
ximg = (@w + @l_margin - @r_margin - w) / 2
|
4966
|
+
ximg = (@w + @l_margin - @r_margin - w) / 2.0
|
4965
4967
|
elsif palign == 'R'
|
4966
4968
|
ximg = @w - @r_margin - w
|
4967
4969
|
else
|
@@ -4999,7 +5001,7 @@ class RBPDF
|
|
4999
5001
|
@y = y
|
5000
5002
|
@x = @img_rb_x
|
5001
5003
|
when 'M'
|
5002
|
-
@y = y + (h/2).round
|
5004
|
+
@y = y + (h/2.0).round
|
5003
5005
|
@x = @img_rb_x
|
5004
5006
|
when 'B'
|
5005
5007
|
@y = @img_rb_y
|
@@ -5721,7 +5723,7 @@ protected
|
|
5721
5723
|
if @pagedim[n]['BoxColorInfo'][box]['C']
|
5722
5724
|
color = @pagedim[n]['BoxColorInfo'][box]['C']
|
5723
5725
|
out <<= ' /C ['
|
5724
|
-
out << sprintf(' %.3f %.3f %.3f', color[0]/255, color[1]/255, color[2]/255)
|
5726
|
+
out << sprintf(' %.3f %.3f %.3f', color[0]/255.0, color[1]/255.0, color[2]/255.0)
|
5725
5727
|
out << ' ]'
|
5726
5728
|
end
|
5727
5729
|
if @pagedim[n]['BoxColorInfo'][box]['W']
|
@@ -6028,7 +6030,7 @@ protected
|
|
6028
6030
|
annots << ' /C ['
|
6029
6031
|
pl['opt']['c'].each {|col|
|
6030
6032
|
col = col.to_i
|
6031
|
-
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255)
|
6033
|
+
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255.0)
|
6032
6034
|
annots << sprintf(" %.4f", color)
|
6033
6035
|
}
|
6034
6036
|
annots << ']'
|
@@ -6188,7 +6190,7 @@ protected
|
|
6188
6190
|
annots << ' /BC ['
|
6189
6191
|
pl['opt']['mk']['bc'].each {|col|
|
6190
6192
|
col = col.to_i
|
6191
|
-
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255)
|
6193
|
+
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255.0)
|
6192
6194
|
annots << sprintf(' %.2f', color)
|
6193
6195
|
}
|
6194
6196
|
annots << ']'
|
@@ -6197,7 +6199,7 @@ protected
|
|
6197
6199
|
annots << ' /BG ['
|
6198
6200
|
pl['opt']['mk']['bg'].each {|col|
|
6199
6201
|
col = col.to_i
|
6200
|
-
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255)
|
6202
|
+
color = col <= 0 ? 0 : (col >= 255 ? 1 : col / 255.0)
|
6201
6203
|
annots << sprintf(' %.2f', color)
|
6202
6204
|
}
|
6203
6205
|
annots << ']'
|
@@ -6923,7 +6925,7 @@ protected
|
|
6923
6925
|
out = '[/Separation /' + name.gsub(' ', '#20')
|
6924
6926
|
out << ' /DeviceCMYK <<'
|
6925
6927
|
out << ' /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0]'
|
6926
|
-
out << ' ' + sprintf('/C1 [%.4f %.4f %.4f %.4f] ', color['c']/100, color['m']/100, color['y']/100, color['k']/100)
|
6928
|
+
out << ' ' + sprintf('/C1 [%.4f %.4f %.4f %.4f] ', color['c']/100.0, color['m']/100.0, color['y']/100.0, color['k']/100.0)
|
6927
6929
|
out << ' /FunctionType 2 /Domain [0 1] /N 1>>]'
|
6928
6930
|
out << ' endobj'
|
6929
6931
|
out(out)
|
@@ -7074,8 +7076,8 @@ protected
|
|
7074
7076
|
out << ' /OpenAction [3 0 R /FitH null]'
|
7075
7077
|
elsif (@zoom_mode=='real')
|
7076
7078
|
out << ' /OpenAction [3 0 R /XYZ null null 1]'
|
7077
|
-
elsif
|
7078
|
-
out << ' /OpenAction [3 0 R /XYZ null null ' + (@zoom_mode/100) + ']'
|
7079
|
+
elsif @zoom_mode.is_a?(Numeric)
|
7080
|
+
out << ' /OpenAction [3 0 R /XYZ null null ' + (@zoom_mode/100.0).to_s + ']'
|
7079
7081
|
end
|
7080
7082
|
if @layout_mode and !empty_string(@layout_mode)
|
7081
7083
|
out << ' /PageLayout /' + @layout_mode
|
@@ -7393,7 +7395,7 @@ protected
|
|
7393
7395
|
#
|
7394
7396
|
def dolinethroughw(x, y, w)
|
7395
7397
|
linew = - @current_font['ut'] / 1000.0 * @font_size_pt
|
7396
|
-
return sprintf('%.2f %.2f %.2f %.2f re f', x * @k, (@h - y) * @k + linew + (@font_size_pt / 3), w * @k, linew)
|
7398
|
+
return sprintf('%.2f %.2f %.2f %.2f re f', x * @k, (@h - y) * @k + linew + (@font_size_pt / 3.0), w * @k, linew)
|
7397
7399
|
end
|
7398
7400
|
|
7399
7401
|
#
|
@@ -8890,7 +8892,7 @@ public
|
|
8890
8892
|
if border_style
|
8891
8893
|
SetLineStyle(border_style)
|
8892
8894
|
end
|
8893
|
-
myArc = 4 / 3 * (::Math.sqrt(2) - 1)
|
8895
|
+
myArc = 4 / 3.0 * (::Math.sqrt(2) - 1)
|
8894
8896
|
outPoint(x + rx, y)
|
8895
8897
|
xc = x + w - rx
|
8896
8898
|
yc = y + ry
|
@@ -10685,8 +10687,7 @@ protected
|
|
10685
10687
|
blocktags = ['blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','table','tr','td']
|
10686
10688
|
|
10687
10689
|
# remove all unsupported tags (the line below lists all supported tags)
|
10688
|
-
|
10689
|
-
html = "%s" % sanitize(html, :tags=> %w(a b blockquote body br dd del div dl dt em font h1 h2 h3 h4 h5 h6 hr i img li ol p pre small span strong sub sup table tablehead td th thead tr tt u ins ul), :attributes => %w(cellspacing cellpadding bgcolor color value width height src size colspan rowspan style align border face href dir class id nobr stroke strokecolor fill nested))
|
10690
|
+
html = sanitize_html(html)
|
10690
10691
|
|
10691
10692
|
# replace some blank characters
|
10692
10693
|
html.gsub!(/<pre/, '<xre') # preserve pre tag
|
@@ -10840,8 +10841,8 @@ protected
|
|
10840
10841
|
end
|
10841
10842
|
if (dom[key]['value'] == 'table') and !empty_string(dom[(dom[key]['parent'])]['thead'])
|
10842
10843
|
# remove the nobr attributes from the table header
|
10843
|
-
dom[(dom[key]['parent'])]['thead'] = dom[(dom[key]['parent'])]['thead'].gsub(' nobr="true"', '')
|
10844
|
-
dom[(dom[key]['parent'])]['thead'] << '</
|
10844
|
+
dom[(dom[key]['parent'])]['thead'] = dom[(dom[key]['parent'])]['thead'].gsub(' nobr="true"', '').sub(/<table([ >])/, '<table tablehead="1"\1')
|
10845
|
+
dom[(dom[key]['parent'])]['thead'] << '</table>'
|
10845
10846
|
end
|
10846
10847
|
else
|
10847
10848
|
# *** opening html tag
|
@@ -11278,13 +11279,16 @@ public
|
|
11278
11279
|
# [@see] Multicell(), writeHTML(), Cell()
|
11279
11280
|
#
|
11280
11281
|
def writeHTMLCell(w, h, x, y, html='', border=0, ln=0, fill=0, reseth=true, align='', autopadding=true)
|
11281
|
-
@nested_table = true
|
11282
11282
|
rtn = MultiCell(w, h, html, border, align, fill, ln, x, y, reseth, 0, true, autopadding, 0)
|
11283
|
-
@nested_table = false
|
11284
11283
|
return rtn
|
11285
11284
|
end
|
11286
11285
|
alias_method :write_html_cell, :writeHTMLCell
|
11287
11286
|
|
11287
|
+
def sanitize_html(html)
|
11288
|
+
html = "%s" % sanitize(html, :tags=> %w(a b blockquote body br dd del div dl dt em font h1 h2 h3 h4 h5 h6 hr i img li ol p pre small span strong sub sup table td th thead tr tt u ins ul), :attributes => %w(cellspacing cellpadding bgcolor color value width height src size colspan rowspan style align border face href dir class id nobr stroke strokecolor fill nested tablehead))
|
11289
|
+
end
|
11290
|
+
protected :sanitize_html
|
11291
|
+
|
11288
11292
|
#
|
11289
11293
|
# Allows to preserve some HTML formatting (limited support).
|
11290
11294
|
# IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting.
|
@@ -11454,8 +11458,18 @@ public
|
|
11454
11458
|
if (dom[key]['value'] == 'tr') and dom[key]['thead'] and dom[key]['thead']
|
11455
11459
|
if dom[key]['parent'] and dom[(dom[key]['parent'])]['thead'] and !empty_string(dom[(dom[key]['parent'])]['thead'])
|
11456
11460
|
@in_thead = true
|
11461
|
+
|
11462
|
+
prev_lMargin = @l_margin
|
11463
|
+
prev_rMargin = @r_margin
|
11464
|
+
@l_margin = @thead_margins['lmargin']
|
11465
|
+
@r_margin = @thead_margins['rmargin']
|
11466
|
+
|
11457
11467
|
# print table header (thead)
|
11458
11468
|
writeHTML(@thead, false, false, false, false, '')
|
11469
|
+
|
11470
|
+
@l_margin = prev_lMargin
|
11471
|
+
@r_margin = prev_rMargin
|
11472
|
+
|
11459
11473
|
if (@start_transaction_page == (@numpages - 1)) or (@y < @start_transaction_y) or checkPageBreak(@lasth, '', false)
|
11460
11474
|
# restore previous object
|
11461
11475
|
rollbackTransaction(true)
|
@@ -11555,7 +11569,7 @@ public
|
|
11555
11569
|
startlinepage = @page
|
11556
11570
|
startliney = @y
|
11557
11571
|
end
|
11558
|
-
@y += ((curfontsize * @cell_height_ratio / @k) + curfontascent - curfontdescent) / 2 - imgh
|
11572
|
+
@y += ((curfontsize * @cell_height_ratio / @k) + curfontascent - curfontdescent) / 2.0 - imgh
|
11559
11573
|
minstartliney = [@y, minstartliney].min
|
11560
11574
|
maxbottomliney = startliney + @font_size * @cell_height_ratio
|
11561
11575
|
end
|
@@ -11612,7 +11626,7 @@ public
|
|
11612
11626
|
startliney = @y
|
11613
11627
|
end
|
11614
11628
|
if !dom[key]['block']
|
11615
|
-
@y += (((curfontsize - fontsize) * @cell_height_ratio / @k) + curfontascent - fontascent - curfontdescent + fontdescent) / 2
|
11629
|
+
@y += (((curfontsize - fontsize) * @cell_height_ratio / @k) + curfontascent - fontascent - curfontdescent + fontdescent) / 2.0
|
11616
11630
|
if (dom[key]['value'] != 'sup') and (dom[key]['value'] != 'sub')
|
11617
11631
|
minstartliney = [@y, minstartliney].min
|
11618
11632
|
maxbottomliney = [@y + ((fontsize * @cell_height_ratio) / @k), maxbottomliney].max
|
@@ -11706,9 +11720,9 @@ public
|
|
11706
11720
|
mdiff = (tw - linew).abs
|
11707
11721
|
if plalign == 'C'
|
11708
11722
|
if @rtl
|
11709
|
-
t_x = -(mdiff / 2)
|
11723
|
+
t_x = -(mdiff / 2.0)
|
11710
11724
|
else
|
11711
|
-
t_x = (mdiff / 2)
|
11725
|
+
t_x = (mdiff / 2.0)
|
11712
11726
|
end
|
11713
11727
|
elsif (plalign == 'R') and !@rtl
|
11714
11728
|
# right alignment on LTR document
|
@@ -11955,6 +11969,7 @@ public
|
|
11955
11969
|
end
|
11956
11970
|
end
|
11957
11971
|
pbrk = checkPageBreak(@lasth)
|
11972
|
+
@y += @c_margin if pbrk and !dom[key]['tag'] and !empty_string(@thead) and !@in_thead ### fix ###
|
11958
11973
|
@newline = false
|
11959
11974
|
startlinex = @x
|
11960
11975
|
startliney = @y
|
@@ -12010,7 +12025,7 @@ public
|
|
12010
12025
|
else
|
12011
12026
|
wtmp = @w - @r_margin - @x
|
12012
12027
|
end
|
12013
|
-
if
|
12028
|
+
if cell or (dom[key]['attribute']['nested'] and (dom[key]['attribute']['nested'] == 'true'))
|
12014
12029
|
# add margin for nested tables
|
12015
12030
|
wtmp -= @c_margin
|
12016
12031
|
end
|
@@ -12028,10 +12043,12 @@ public
|
|
12028
12043
|
dom[table_el]['cols'] = dom[trid]['cols']
|
12029
12044
|
end
|
12030
12045
|
oldmargin = @c_margin
|
12046
|
+
currentcmargin = @c_margin
|
12031
12047
|
if !dom[(dom[trid]['parent'])]['attribute']['cellpadding'].nil?
|
12032
12048
|
currentcmargin = getHTMLUnitToUnits(dom[(dom[trid]['parent'])]['attribute']['cellpadding'], 1, 'px')
|
12033
|
-
|
12034
|
-
|
12049
|
+
end
|
12050
|
+
if currentcmargin < (@line_width / 2.0)
|
12051
|
+
currentcmargin = @line_width / 2.0
|
12035
12052
|
end
|
12036
12053
|
@c_margin = currentcmargin
|
12037
12054
|
if !dom[(dom[trid]['parent'])]['attribute']['cellspacing'].nil?
|
@@ -12082,7 +12099,7 @@ public
|
|
12082
12099
|
if dom[trid]['startx'].nil?
|
12083
12100
|
dom[trid]['startx'] = @x
|
12084
12101
|
else
|
12085
|
-
@x += (cellspacingx / 2)
|
12102
|
+
@x += (cellspacingx / 2.0)
|
12086
12103
|
end
|
12087
12104
|
if !dom[parentid]['attribute']['rowspan'].nil?
|
12088
12105
|
rowspan = dom[parentid]['attribute']['rowspan'].to_i
|
@@ -12182,7 +12199,7 @@ public
|
|
12182
12199
|
end
|
12183
12200
|
}
|
12184
12201
|
end
|
12185
|
-
@x += (cellspacingx / 2)
|
12202
|
+
@x += (cellspacingx / 2.0)
|
12186
12203
|
else
|
12187
12204
|
# opening tag (or self-closing tag)
|
12188
12205
|
if opentagpos.nil?
|
@@ -12218,7 +12235,7 @@ public
|
|
12218
12235
|
if pfontsize.is_a?(Numeric) and (pfontsize > 0) and curfontsize.is_a?(Numeric) and (curfontsize > 0) and (pfontsize != curfontsize)
|
12219
12236
|
pfontascent = getFontAscent(pfontname, pfontstyle, pfontsize)
|
12220
12237
|
pfontdescent = getFontDescent(pfontname, pfontstyle, pfontsize)
|
12221
|
-
@y += ((pfontsize - curfontsize) * @cell_height_ratio / @k + pfontascent - curfontascent - pfontdescent + curfontdescent) / 2
|
12238
|
+
@y += ((pfontsize - curfontsize) * @cell_height_ratio / @k + pfontascent - curfontascent - pfontdescent + curfontdescent) / 2.0
|
12222
12239
|
minstartliney = [@y, minstartliney].min
|
12223
12240
|
maxbottomliney = [@y + pfontsize * @cell_height_ratio / @k, maxbottomliney].max
|
12224
12241
|
end
|
@@ -12374,9 +12391,9 @@ public
|
|
12374
12391
|
mdiff = (tw - linew).abs
|
12375
12392
|
if plalign == 'C'
|
12376
12393
|
if @rtl
|
12377
|
-
t_x = -(mdiff / 2)
|
12394
|
+
t_x = -(mdiff / 2.0)
|
12378
12395
|
else
|
12379
|
-
t_x = (mdiff / 2)
|
12396
|
+
t_x = (mdiff / 2.0)
|
12380
12397
|
end
|
12381
12398
|
elsif (plalign == 'R') and !@rtl
|
12382
12399
|
# right alignment on LTR document
|
@@ -12500,12 +12517,30 @@ public
|
|
12500
12517
|
@thead = dom[key]['thead']
|
12501
12518
|
if @thead_margins.nil? or @thead_margins.empty?
|
12502
12519
|
@thead_margins ||= {}
|
12503
|
-
|
12520
|
+
|
12521
|
+
if dom[key]['attribute']['cellpadding']
|
12522
|
+
@thead_margins['cmargin'] = getHTMLUnitToUnits(dom[key]['attribute']['cellpadding'], 1, 'px')
|
12523
|
+
else
|
12524
|
+
@thead_margins['cmargin'] = @c_margin
|
12525
|
+
end
|
12526
|
+
if @thead_margins['cmargin'] < (@line_width / 2.0)
|
12527
|
+
@thead_margins['cmargin'] = @line_width / 2.0
|
12528
|
+
end
|
12529
|
+
if cell
|
12530
|
+
@thead_margins['lmargin'] = @l_margin + @c_margin
|
12531
|
+
@thead_margins['rmargin'] = @r_margin + @c_margin
|
12532
|
+
else
|
12533
|
+
@thead_margins['lmargin'] = @l_margin
|
12534
|
+
@thead_margins['rmargin'] = @r_margin
|
12535
|
+
end
|
12504
12536
|
end
|
12505
12537
|
end
|
12506
12538
|
end
|
12507
12539
|
if !tag['attribute']['cellpadding'].nil?
|
12508
12540
|
cp = getHTMLUnitToUnits(tag['attribute']['cellpadding'], 1, 'px')
|
12541
|
+
if cp < (@line_width / 2.0)
|
12542
|
+
cp = @line_width / 2.0
|
12543
|
+
end
|
12509
12544
|
@old_c_margin = @c_margin
|
12510
12545
|
@c_margin = cp
|
12511
12546
|
end
|
@@ -12526,7 +12561,7 @@ public
|
|
12526
12561
|
else
|
12527
12562
|
hrHeight = GetLineWidth()
|
12528
12563
|
end
|
12529
|
-
addHTMLVertSpace(hbz, (hrHeight / 2), cell, firstorlast)
|
12564
|
+
addHTMLVertSpace(hbz, (hrHeight / 2.0), cell, firstorlast)
|
12530
12565
|
x = GetX()
|
12531
12566
|
y = GetY()
|
12532
12567
|
wtmp = @w - @l_margin - @r_margin
|
@@ -12543,7 +12578,7 @@ public
|
|
12543
12578
|
Line(x, y, x + hrWidth, y)
|
12544
12579
|
SetLineWidth(prevlinewidth)
|
12545
12580
|
Ln('', cell)
|
12546
|
-
addHTMLVertSpace(hrHeight / 2, 0, cell, dom[key + 1].nil?)
|
12581
|
+
addHTMLVertSpace(hrHeight / 2.0, 0, cell, dom[key + 1].nil?)
|
12547
12582
|
when 'a'
|
12548
12583
|
if tag['attribute'].key?('href')
|
12549
12584
|
@href['url'] = get_sever_url(tag['attribute']['href'])
|
@@ -12594,11 +12629,6 @@ public
|
|
12594
12629
|
xpos += 2 * GetStringWidth(32.chr)
|
12595
12630
|
end
|
12596
12631
|
end
|
12597
|
-
if @rtl
|
12598
|
-
xpos -= @line_width * 1.5
|
12599
|
-
else
|
12600
|
-
xpos += @line_width * 1.5
|
12601
|
-
end
|
12602
12632
|
|
12603
12633
|
imglink = ''
|
12604
12634
|
if !@href['url'].nil? and !empty_string(@href['url'])
|
@@ -12636,8 +12666,8 @@ public
|
|
12636
12666
|
l_margin = @l_margin
|
12637
12667
|
r_margin = @r_margin
|
12638
12668
|
|
12639
|
-
SetLeftMargin(@l_margin + @
|
12640
|
-
SetRightMargin(@r_margin + @
|
12669
|
+
SetLeftMargin(@l_margin + @c_margin)
|
12670
|
+
SetRightMargin(@r_margin + @c_margin)
|
12641
12671
|
|
12642
12672
|
begin
|
12643
12673
|
# if (type == 'eps') or (type == 'ai')
|
@@ -12645,19 +12675,24 @@ public
|
|
12645
12675
|
# elsif type == 'svg'
|
12646
12676
|
# ImageSVG(tag['attribute']['src'], xpos, @y, iw, ih, imglink, align, '', border, true)
|
12647
12677
|
# else
|
12648
|
-
result_img = Image(tag['attribute']['src'], xpos, @y
|
12678
|
+
result_img = Image(tag['attribute']['src'], xpos, @y, iw, ih, '', imglink, align, false, 300, '', false, false, border, false, false, true)
|
12649
12679
|
# end
|
12650
12680
|
rescue => err
|
12651
12681
|
logger.error "pdf: Image: error: #{err.message}"
|
12652
12682
|
result_img = false
|
12653
12683
|
end
|
12654
|
-
|
12655
|
-
|
12684
|
+
|
12685
|
+
if result_img or ih != 0
|
12686
|
+
case align
|
12687
|
+
when 'T'
|
12688
|
+
@y = prevy
|
12689
|
+
when 'M'
|
12690
|
+
@y = (@img_rb_y + prevy - (tag['fontsize'] / @k)) / 2
|
12691
|
+
when 'B'
|
12692
|
+
@y = @img_rb_y - (tag['fontsize'] / @k)
|
12693
|
+
end
|
12694
|
+
else
|
12656
12695
|
@y = prevy
|
12657
|
-
when 'M'
|
12658
|
-
@y = (@img_rb_y + prevy - (tag['fontsize'] / @k)) / 2
|
12659
|
-
when 'B'
|
12660
|
-
@y = @img_rb_y - (tag['fontsize'] / @k)
|
12661
12696
|
end
|
12662
12697
|
|
12663
12698
|
# restore original margin values
|
@@ -12879,8 +12914,8 @@ public
|
|
12879
12914
|
end
|
12880
12915
|
end
|
12881
12916
|
end
|
12882
|
-
when 'table'
|
12883
|
-
if
|
12917
|
+
when 'table'
|
12918
|
+
if dom[(dom[key]['parent'])]['attribute']['tablehead'] and dom[(dom[key]['parent'])]['attribute']['tablehead'] == "1"
|
12884
12919
|
# closing tag used for the thead part
|
12885
12920
|
in_table_head = true
|
12886
12921
|
@in_thead = false
|
@@ -13051,8 +13086,10 @@ public
|
|
13051
13086
|
@thead_margins = {}
|
13052
13087
|
end
|
13053
13088
|
end
|
13054
|
-
if tag['block']
|
13055
|
-
|
13089
|
+
if tag['block']
|
13090
|
+
unless dom[(dom[key]['parent'])]['attribute']['tablehead'] and dom[(dom[key]['parent'])]['attribute']['tablehead'] == "1" ### fix ###
|
13091
|
+
addHTMLVertSpace(hbz / 2, 0, cell, (dom[key+1].nil? or (dom[key+1]['value'] != 'table'))) ### fix ###
|
13092
|
+
end
|
13056
13093
|
end
|
13057
13094
|
when 'a'
|
13058
13095
|
@href = {}
|
@@ -13253,11 +13290,11 @@ public
|
|
13253
13290
|
end
|
13254
13291
|
case unit
|
13255
13292
|
when '%' # percentage
|
13256
|
-
retval = (value * refsize) / 100
|
13293
|
+
retval = (value * refsize) / 100.0
|
13257
13294
|
when 'em' # relative-size
|
13258
13295
|
retval = value * refsize
|
13259
13296
|
when 'ex' # height of lower case 'x' (about half the font-size)
|
13260
|
-
retval = value * (refsize / 2)
|
13297
|
+
retval = value * (refsize / 2.0)
|
13261
13298
|
when 'in' # absolute-size
|
13262
13299
|
retval = (value * @dpi) / k
|
13263
13300
|
when 'cm' # centimeters
|
@@ -13372,23 +13409,23 @@ protected
|
|
13372
13409
|
when 'disc', 'circle'
|
13373
13410
|
fill = 'F' if listtype == 'disc'
|
13374
13411
|
fill << 'D'
|
13375
|
-
r = size / 6
|
13412
|
+
r = size / 6.0
|
13376
13413
|
lspace += 2 * r
|
13377
13414
|
if @rtl
|
13378
13415
|
@x += lspace
|
13379
13416
|
else
|
13380
13417
|
@x -= lspace
|
13381
13418
|
end
|
13382
|
-
Circle(@x + r, @y + @lasth / 2, r, 0, 360, fill, {'color'=>color}, color, 8)
|
13419
|
+
Circle(@x + r, @y + @lasth / 2.0, r, 0, 360, fill, {'color'=>color}, color, 8)
|
13383
13420
|
when 'square'
|
13384
|
-
l = size / 3
|
13421
|
+
l = size / 3.0
|
13385
13422
|
lspace += l
|
13386
13423
|
if @rtl
|
13387
13424
|
@x += lspace
|
13388
13425
|
else
|
13389
13426
|
@x -= lspace
|
13390
13427
|
end
|
13391
|
-
Rect(@x, @y + (@lasth - l)/ 2, l, l, 'F', {}, color)
|
13428
|
+
Rect(@x, @y + (@lasth - l)/ 2.0, l, l, 'F', {}, color)
|
13392
13429
|
|
13393
13430
|
# ordered types
|
13394
13431
|
# listcount[@listnum]
|