98 |
98 |
attr_accessor :color_flag
|
99 |
99 |
|
100 |
100 |
attr_accessor :default_table_columns
|
|
101 |
|
|
102 |
attr_accessor :max_table_columns
|
101 |
103 |
|
102 |
104 |
attr_accessor :default_font
|
103 |
105 |
|
... | ... | |
141 |
143 |
|
142 |
144 |
attr_accessor :links
|
143 |
145 |
|
144 |
|
attr_accessor :listordered
|
|
146 |
attr_accessor :list_ordered
|
145 |
147 |
|
146 |
|
attr_accessor :listcount
|
|
148 |
attr_accessor :list_count
|
147 |
149 |
|
148 |
|
attr_accessor :lispacer
|
|
150 |
attr_accessor :li_spacer
|
149 |
151 |
|
150 |
152 |
attr_accessor :n
|
151 |
153 |
|
... | ... | |
226 |
228 |
@diffs ||= []
|
227 |
229 |
@color_flag ||= false
|
228 |
230 |
@default_table_columns ||= 4
|
|
231 |
@table_columns ||= 0
|
|
232 |
@max_table_columns ||= []
|
|
233 |
@tr_id ||= 0
|
|
234 |
@max_td_page ||= []
|
|
235 |
@max_td_y ||= []
|
|
236 |
@t_columns ||= 0
|
229 |
237 |
@default_font ||= "FreeSans" if unicode
|
230 |
238 |
@default_font ||= "Helvetica"
|
231 |
239 |
@draw_color ||= '0 G'
|
... | ... | |
248 |
256 |
@is_unicode = unicode
|
249 |
257 |
@lasth ||= 0
|
250 |
258 |
@links ||= []
|
251 |
|
@listordered ||= false
|
252 |
|
@listcount ||= 0
|
253 |
|
@lispacer ||= ""
|
|
259 |
@list_ordered ||= []
|
|
260 |
@list_count ||= []
|
|
261 |
@li_spacer ||= ""
|
|
262 |
@li_count ||= 0
|
|
263 |
@spacer ||= ""
|
|
264 |
@quote_count ||= 0
|
|
265 |
@prevquote_count ||= 0
|
|
266 |
@quote_top ||= []
|
|
267 |
@quote_page ||= []
|
254 |
268 |
@n ||= 2
|
255 |
269 |
@offsets ||= []
|
256 |
270 |
@orientation_changes ||= []
|
... | ... | |
272 |
286 |
@tempfontsize ||= 10
|
273 |
287 |
@text_color ||= '0 g'
|
274 |
288 |
@underline ||= false
|
|
289 |
@deleted ||= false
|
275 |
290 |
@ws ||= 0
|
276 |
291 |
|
277 |
292 |
#Standard Unicode fonts
|
... | ... | |
737 |
752 |
Open();
|
738 |
753 |
end
|
739 |
754 |
family=@font_family;
|
740 |
|
style=@font_style + (@underline ? 'U' : '');
|
|
755 |
style=@font_style + (@underline ? 'U' : '') + (@deleted ? 'D' : '');
|
741 |
756 |
size=@font_size_pt;
|
742 |
757 |
lw=@line_width;
|
743 |
758 |
dc=@draw_color;
|
... | ... | |
1312 |
1327 |
|
1313 |
1328 |
style=style.upcase
|
1314 |
1329 |
style=style.gsub('U','');
|
|
1330 |
style=style.gsub('D','');
|
1315 |
1331 |
if (style == 'IB')
|
1316 |
1332 |
style = 'BI';
|
1317 |
1333 |
end
|
... | ... | |
1394 |
1410 |
# #Removes bold
|
1395 |
1411 |
# :pdf->SetFont('');
|
1396 |
1412 |
# #Times bold, italic and underlined 14
|
1397 |
|
# :pdf->SetFont('Times','BIU');
|
|
1413 |
# :pdf->SetFont('Times','BIUD');
|
1398 |
1414 |
# </pre><br />
|
1399 |
1415 |
# If the file corresponding to the requested font is not found, the error "Could not include font metric file" is generated.
|
1400 |
1416 |
# @param string :family Family font. It can be either a name defined by AddFont() or one of the standard families (case insensitive):<ul><li>Courier (fixed-width)</li><li>Helvetica or Arial (synonymous; sans serif)</li><li>Times (serif)</li><li>Symbol (symbolic)</li><li>ZapfDingbats (symbolic)</li></ul>It is also possible to pass an empty string. In that case, the current family is retained.
|
... | ... | |
1426 |
1442 |
else
|
1427 |
1443 |
@underline=false;
|
1428 |
1444 |
end
|
|
1445 |
if (style.include?('D'))
|
|
1446 |
@deleted=true;
|
|
1447 |
style= style.gsub('D','');
|
|
1448 |
else
|
|
1449 |
@deleted=false;
|
|
1450 |
end
|
1429 |
1451 |
if (style=='IB')
|
1430 |
1452 |
style='BI';
|
1431 |
1453 |
end
|
... | ... | |
1573 |
1595 |
#Output a string
|
1574 |
1596 |
s=sprintf('BT %.2f %.2f Td (%s) Tj ET', x * @k, (@h-y) * @k, escapetext(txt));
|
1575 |
1597 |
if (@underline and (txt!=''))
|
1576 |
|
s += ' ' + dounderline(x, y, txt);
|
|
1598 |
s += ' ' + dolinetxt(x, y, txt);
|
1577 |
1599 |
end
|
1578 |
1600 |
if (@color_flag)
|
1579 |
1601 |
s='q ' + @text_color + ' ' + s + ' Q';
|
... | ... | |
1661 |
1683 |
k=@k;
|
1662 |
1684 |
if ((@y + h) > @page_break_trigger and !@in_footer and AcceptPageBreak())
|
1663 |
1685 |
#Automatic page break
|
1664 |
|
x = @x;
|
1665 |
|
ws = @ws;
|
1666 |
|
if (ws > 0)
|
1667 |
|
@ws = 0;
|
1668 |
|
out('0 Tw');
|
|
1686 |
if @pages[@page+1].nil?
|
|
1687 |
x = @x;
|
|
1688 |
ws = @ws;
|
|
1689 |
if (ws > 0)
|
|
1690 |
@ws = 0;
|
|
1691 |
out('0 Tw');
|
|
1692 |
end
|
|
1693 |
AddPage(@cur_orientation);
|
|
1694 |
@x = x;
|
|
1695 |
if (ws > 0)
|
|
1696 |
@ws = ws;
|
|
1697 |
out(sprintf('%.3f Tw', ws * k));
|
|
1698 |
end
|
|
1699 |
else
|
|
1700 |
@page += 1;
|
|
1701 |
@y=@t_margin;
|
1669 |
1702 |
end
|
1670 |
|
AddPage(@cur_orientation);
|
1671 |
|
@x = x;
|
1672 |
|
if (ws > 0)
|
1673 |
|
@ws = ws;
|
1674 |
|
out(sprintf('%.3f Tw', ws * k));
|
1675 |
|
end
|
1676 |
1703 |
end
|
|
1704 |
|
1677 |
1705 |
if (w == 0)
|
1678 |
1706 |
w = @w - @r_margin - @x;
|
1679 |
1707 |
end
|
... | ... | |
1717 |
1745 |
txt2 = escapetext(txt);
|
1718 |
1746 |
s<<sprintf('BT %.2f %.2f Td (%s) Tj ET', (@x + dx) * k, (@h - (@y + 0.5 * h + 0.3 * @font_size)) * k, txt2);
|
1719 |
1747 |
if (@underline)
|
1720 |
|
s<<' ' + dounderline(@x + dx, @y + 0.5 * h + 0.3 * @font_size, txt);
|
|
1748 |
s<<' ' + dolinetxt(@x + dx, @y + 0.5 * h + 0.3 * @font_size, txt);
|
1721 |
1749 |
end
|
|
1750 |
if (@deleted)
|
|
1751 |
s<<' ' + dolinetxt(@x + dx, @y + 0.3 * h + 0.2 * @font_size, txt);
|
|
1752 |
end
|
1722 |
1753 |
if (@color_flag)
|
1723 |
1754 |
s<<' Q';
|
1724 |
1755 |
end
|
... | ... | |
1760 |
1791 |
# save current position
|
1761 |
1792 |
prevx = @x;
|
1762 |
1793 |
prevy = @y;
|
|
1794 |
prevpage = @page;
|
1763 |
1795 |
|
1764 |
1796 |
#Output text with automatic or explicit line breaks
|
1765 |
1797 |
|
... | ... | |
1876 |
1908 |
@x = @l_margin;
|
1877 |
1909 |
elsif (ln == 0)
|
1878 |
1910 |
# go to the top-right of the cell
|
|
1911 |
@page = prevpage;
|
1879 |
1912 |
@y = prevy;
|
1880 |
1913 |
@x = prevx + w;
|
1881 |
1914 |
elsif (ln == 2)
|
... | ... | |
2075 |
2108 |
else
|
2076 |
2109 |
@y += h;
|
2077 |
2110 |
end
|
|
2111 |
|
|
2112 |
k=@k;
|
|
2113 |
if (@y > @page_break_trigger and !@in_footer and AcceptPageBreak())
|
|
2114 |
#Automatic page break
|
|
2115 |
if @pages[@page+1].nil?
|
|
2116 |
x = @x;
|
|
2117 |
ws = @ws;
|
|
2118 |
if (ws > 0)
|
|
2119 |
@ws = 0;
|
|
2120 |
out('0 Tw');
|
|
2121 |
end
|
|
2122 |
AddPage(@cur_orientation);
|
|
2123 |
@x = x;
|
|
2124 |
if (ws > 0)
|
|
2125 |
@ws = ws;
|
|
2126 |
out(sprintf('%.3f Tw', ws * k));
|
|
2127 |
end
|
|
2128 |
else
|
|
2129 |
@page += 1;
|
|
2130 |
@y=@t_margin;
|
|
2131 |
end
|
|
2132 |
end
|
|
2133 |
|
2078 |
2134 |
end
|
2079 |
2135 |
alias_method :ln, :Ln
|
2080 |
2136 |
|
... | ... | |
2473 |
2529 |
|
2474 |
2530 |
def putType0(font)
|
2475 |
2531 |
#Type0
|
|
2532 |
newobj();
|
2476 |
2533 |
out('<</Type /Font')
|
2477 |
2534 |
out('/Subtype /Type0')
|
2478 |
2535 |
out('/BaseFont /'+font['name']+'-'+font['cMap'])
|
... | ... | |
2525 |
2582 |
out('/Width ' + info['w'].to_s);
|
2526 |
2583 |
out('/Height ' + info['h'].to_s);
|
2527 |
2584 |
if (info['cs']=='Indexed')
|
2528 |
|
out('/ColorSpace [/Indexed /DeviceRGB ' + (info['pal'].length/3-1) + ' ' + (@n+1) + ' 0 R]');
|
|
2585 |
out('/ColorSpace [/Indexed /DeviceRGB ' + (info['pal'].length/3-1).to_s + ' ' + (@n+1).to_s + ' 0 R]');
|
2529 |
2586 |
else
|
2530 |
2587 |
out('/ColorSpace /' + info['cs']);
|
2531 |
2588 |
if (info['cs']=='DeviceCMYK')
|
... | ... | |
2553 |
2610 |
#Palette
|
2554 |
2611 |
if (info['cs']=='Indexed')
|
2555 |
2612 |
newobj();
|
2556 |
|
pal=(@compress) ? gzcompress(info['pal']) : :info['pal'];
|
|
2613 |
pal=(@compress) ? gzcompress(info['pal']) : info['pal'];
|
2557 |
2614 |
out('<<' + filter + '/Length ' + pal.length.to_s + '>>');
|
2558 |
2615 |
putstream(pal);
|
2559 |
2616 |
out('endobj');
|
... | ... | |
2766 |
2823 |
end
|
2767 |
2824 |
|
2768 |
2825 |
#
|
2769 |
|
# Underline text
|
|
2826 |
# Underline and Deleted text
|
2770 |
2827 |
# @access protected
|
2771 |
2828 |
#
|
2772 |
|
def dounderline(x, y, txt)
|
|
2829 |
def dolinetxt(x, y, txt)
|
2773 |
2830 |
up = @current_font['up'];
|
2774 |
2831 |
ut = @current_font['ut'];
|
2775 |
2832 |
w = GetStringWidth(txt) + @ws * txt.count(' ');
|
... | ... | |
3350 |
3407 |
|
3351 |
3408 |
#
|
3352 |
3409 |
# Allows to preserve some HTML formatting.<br />
|
3353 |
|
# Supports: h1, h2, h3, h4, h5, h6, b, u, i, a, img, p, br, strong, em, font, blockquote, li, ul, ol, hr, td, th, tr, table, sup, sub, small
|
|
3410 |
# Supports: h1, h2, h3, h4, h5, h6, b, u, i, a, img, p, br, strong, em, ins, del, font, blockquote, li, ul, ol, hr, td, th, tr, table, sup, sub, small
|
3354 |
3411 |
# @param string :html text to display
|
3355 |
3412 |
# @param boolean :ln if true add a new line after text (default = true)
|
3356 |
3413 |
# @param int :fill Indicates if the background must be painted (1) or transparent (0). Default value: 0.
|
... | ... | |
3364 |
3421 |
end
|
3365 |
3422 |
|
3366 |
3423 |
@href = nil
|
3367 |
|
@style = {}
|
3368 |
|
html.gsub!(/[\t\r\n\f]/, "")#\0\x0B
|
|
3424 |
@style = "";
|
|
3425 |
@t_cells = [[]];
|
|
3426 |
@table_id = 0;
|
|
3427 |
|
|
3428 |
# pre calculate
|
3369 |
3429 |
html.split(/(<[^>]+>)/).each do |element|
|
3370 |
3430 |
if "<" == element[0,1]
|
3371 |
3431 |
#Tag
|
3372 |
3432 |
if (element[1, 1] == '/')
|
|
3433 |
closedHTMLTagCalc(element[2..-2].downcase);
|
|
3434 |
else
|
|
3435 |
#Extract attributes
|
|
3436 |
# get tag name
|
|
3437 |
tag = element.scan(/([a-zA-Z0-9]*)/).flatten.delete_if {|x| x.length == 0}
|
|
3438 |
tag = tag[0].downcase;
|
|
3439 |
|
|
3440 |
# get attributes
|
|
3441 |
attr_array = element.scan(/([^=\s]*)=["\']?([^"\']*)["\']?/)
|
|
3442 |
attrs = {}
|
|
3443 |
attr_array.each do |name, value|
|
|
3444 |
attrs[name.downcase] = value;
|
|
3445 |
end
|
|
3446 |
openHTMLTagCalc(tag, attrs);
|
|
3447 |
end
|
|
3448 |
end
|
|
3449 |
end
|
|
3450 |
@table_id = 0;
|
|
3451 |
|
|
3452 |
html.split(/(<[A-Za-z!?\/][^>]*?>)/).each do |element|
|
|
3453 |
if "<" == element[0,1]
|
|
3454 |
#Tag
|
|
3455 |
if (element[1, 1] == '/')
|
3373 |
3456 |
closedHTMLTagHandler(element[2..-2].downcase);
|
3374 |
3457 |
else
|
3375 |
3458 |
#Extract attributes
|
... | ... | |
3389 |
3472 |
else
|
3390 |
3473 |
#Text
|
3391 |
3474 |
if (@href)
|
|
3475 |
element.gsub!(/[\t\r\n\f]/, "");
|
3392 |
3476 |
addHtmlLink(@href, element, fill);
|
3393 |
3477 |
elsif (@tdbegin)
|
3394 |
|
if ((element.strip.length > 0) and (element != " "))
|
3395 |
|
Cell(@tdwidth, @tdheight, unhtmlentities(element.strip), @tableborder, 0, @tdalign, @tdfill);
|
3396 |
|
elsif (element == " ")
|
3397 |
|
Cell(@tdwidth, @tdheight, '', @tableborder, 0, @tdalign, @tdfill);
|
|
3478 |
element.gsub!(/[\t\r\n\f]/, "");
|
|
3479 |
element.gsub!(/ /, " ");
|
|
3480 |
base_page = @page;
|
|
3481 |
base_x = @x;
|
|
3482 |
base_y = @y;
|
|
3483 |
|
|
3484 |
MultiCell(@tdwidth, @tdheight, unhtmlentities(element.strip), @tableborder, @tdalign, @tdfill, 1);
|
|
3485 |
tr_end = @t_cells[@table_id][@tr_id][@td_id]['j1'] + 1;
|
|
3486 |
if @max_td_page[tr_end].nil? or (@max_td_page[tr_end] < @page)
|
|
3487 |
@max_td_page[tr_end] = @page
|
|
3488 |
@max_td_y[tr_end] = @y
|
|
3489 |
elsif (@max_td_page[tr_end] == @page)
|
|
3490 |
@max_td_y[tr_end] = @y if @max_td_y[tr_end].nil? or (@max_td_y[tr_end] < @y)
|
3398 |
3491 |
end
|
3399 |
|
elsif ((element.strip.length > 0) and (element != " "))
|
|
3492 |
|
|
3493 |
@page = base_page;
|
|
3494 |
@x = base_x + @tdwidth;
|
|
3495 |
@y = base_y;
|
|
3496 |
elsif (element.strip.length > 0)
|
|
3497 |
if @pre_state != true
|
|
3498 |
element.gsub!(/[\t\r\n\f]/, "");
|
|
3499 |
element.gsub!(/ /, " ");
|
|
3500 |
end
|
3400 |
3501 |
Write(@lasth, unhtmlentities(element), '', fill);
|
3401 |
3502 |
end
|
3402 |
3503 |
end
|
... | ... | |
3422 |
3523 |
# @param int :fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0.
|
3423 |
3524 |
# @see Cell()
|
3424 |
3525 |
#
|
3425 |
|
def writeHTMLCell(w, h, x, y, html='', border=0, ln=0, fill=0)
|
|
3526 |
def writeHTMLCell(w, h, x, y, html='', border=0, ln=1, fill=0)
|
3426 |
3527 |
|
3427 |
3528 |
if (@lasth == 0)
|
3428 |
3529 |
#set row height
|
... | ... | |
3446 |
3547 |
w = @fw - x - @r_margin;
|
3447 |
3548 |
end
|
3448 |
3549 |
|
|
3550 |
b=0;
|
|
3551 |
if (border)
|
|
3552 |
if (border==1)
|
|
3553 |
border='LTRB';
|
|
3554 |
b='LRT';
|
|
3555 |
b2='LR';
|
|
3556 |
elsif border.is_a?(String)
|
|
3557 |
b2='';
|
|
3558 |
if (border.include?('L'))
|
|
3559 |
b2<<'L';
|
|
3560 |
end
|
|
3561 |
if (border.include?('R'))
|
|
3562 |
b2<<'R';
|
|
3563 |
end
|
|
3564 |
b=(border.include?('T')) ? b2 + 'T' : b2;
|
|
3565 |
end
|
|
3566 |
end
|
|
3567 |
|
3449 |
3568 |
# store original margin values
|
3450 |
3569 |
l_margin = @l_margin;
|
3451 |
3570 |
r_margin = @r_margin;
|
... | ... | |
3461 |
3580 |
|
3462 |
3581 |
currentY = GetY();
|
3463 |
3582 |
|
|
3583 |
@auto_page_break = false;
|
3464 |
3584 |
# check if a new page has been created
|
3465 |
3585 |
if (@page > pagenum)
|
3466 |
3586 |
# design a cell around the text on first page
|
3467 |
3587 |
currentpage = @page;
|
3468 |
3588 |
@page = pagenum;
|
3469 |
3589 |
SetY(GetPageHeight() - restspace - GetBreakMargin());
|
3470 |
|
h = restspace - 1;
|
3471 |
|
Cell(w, h, "", border, ln, 'L', 0);
|
|
3590 |
Cell(w, restspace - 1, "", b, 0, 'L', 0);
|
|
3591 |
b = b2;
|
|
3592 |
@page += 1;
|
|
3593 |
while @page < currentpage
|
|
3594 |
SetY(@t_margin); # put cursor at the beginning of text
|
|
3595 |
Cell(w, @page_break_trigger - @t_margin, "", b, 0, 'L', 0);
|
|
3596 |
@page += 1;
|
|
3597 |
end
|
|
3598 |
if (border.is_a?(String) and border.include?('B'))
|
|
3599 |
b<<'B';
|
|
3600 |
end
|
3472 |
3601 |
# design a cell around the text on last page
|
3473 |
|
@page = currentpage;
|
3474 |
|
h = currentY - @t_margin;
|
3475 |
3602 |
SetY(@t_margin); # put cursor at the beginning of text
|
3476 |
|
Cell(w, h, "", border, ln, 'L', 0);
|
|
3603 |
Cell(w, currentY - @t_margin, "", b, 0, 'L', 0);
|
3477 |
3604 |
else
|
3478 |
|
h = [h, (currentY - y)].max;
|
3479 |
3605 |
SetY(y); # put cursor at the beginning of text
|
3480 |
3606 |
# design a cell around the text
|
3481 |
|
Cell(w, h, "", border, ln, 'L', 0);
|
|
3607 |
Cell(w, [h, (currentY - y)].max, "", border, 0, 'L', 0);
|
3482 |
3608 |
end
|
|
3609 |
@auto_page_break = true;
|
3483 |
3610 |
|
3484 |
3611 |
# restore original margin values
|
3485 |
3612 |
SetLeftMargin(l_margin);
|
3486 |
3613 |
SetRightMargin(r_margin);
|
3487 |
3614 |
|
3488 |
|
if (ln)
|
3489 |
|
Ln(0);
|
|
3615 |
@lasth = h
|
|
3616 |
|
|
3617 |
# move cursor to specified position
|
|
3618 |
if (ln == 0)
|
|
3619 |
# go to the top-right of the cell
|
|
3620 |
@x = x + w;
|
|
3621 |
@y = y;
|
|
3622 |
elsif (ln == 1)
|
|
3623 |
# go to the beginning of the next line
|
|
3624 |
@x = @l_margin;
|
|
3625 |
@y = currentY;
|
|
3626 |
elsif (ln == 2)
|
|
3627 |
# go to the bottom-left of the cell (below)
|
|
3628 |
@x = x;
|
|
3629 |
@y = currentY;
|
3490 |
3630 |
end
|
3491 |
3631 |
end
|
3492 |
3632 |
alias_method :write_html_cell, :writeHTMLCell
|
3493 |
3633 |
|
3494 |
3634 |
#
|
|
3635 |
# Check html table tag position.
|
|
3636 |
#
|
|
3637 |
# @param array :table potision array
|
|
3638 |
# @param int :current tr tag id number
|
|
3639 |
# @param int :current td tag id number
|
|
3640 |
# @access private
|
|
3641 |
# @return int : next td_id position.
|
|
3642 |
# value 0 mean that can use position.
|
|
3643 |
#
|
|
3644 |
def checkTableBlockingCellPosition(table, tr_id, td_id )
|
|
3645 |
0.upto(tr_id) do |j|
|
|
3646 |
0.upto(@t_cells[table][j].size - 1) do |i|
|
|
3647 |
if @t_cells[table][j][i]['i0'] <= td_id and td_id <= @t_cells[table][j][i]['i1']
|
|
3648 |
if @t_cells[table][j][i]['j0'] <= tr_id and tr_id <= @t_cells[table][j][i]['j1']
|
|
3649 |
return @t_cells[table][j][i]['i1'] - td_id + 1;
|
|
3650 |
end
|
|
3651 |
end
|
|
3652 |
end
|
|
3653 |
end
|
|
3654 |
return 0;
|
|
3655 |
end
|
|
3656 |
|
|
3657 |
#
|
|
3658 |
# Calculate opening tags.
|
|
3659 |
#
|
|
3660 |
# html table cell array : @t_cells
|
|
3661 |
#
|
|
3662 |
# i0: table cell start position
|
|
3663 |
# i1: table cell end position
|
|
3664 |
# j0: table row start position
|
|
3665 |
# j1: table row end position
|
|
3666 |
#
|
|
3667 |
# +------+
|
|
3668 |
# |i0,j0 |
|
|
3669 |
# | i1,j1|
|
|
3670 |
# +------+
|
|
3671 |
#
|
|
3672 |
# example html:
|
|
3673 |
# <table>
|
|
3674 |
# <tr><td></td><td></td><td></td></tr>
|
|
3675 |
# <tr><td colspan=2></td><td></td></tr>
|
|
3676 |
# <tr><td rowspan=2></td><td></td><td></td></tr>
|
|
3677 |
# <tr><td></td><td></td></tr>
|
|
3678 |
# </table>
|
|
3679 |
#
|
|
3680 |
# i: 0 1 2
|
|
3681 |
# j+----+----+----+
|
|
3682 |
# :|0,0 |1,0 |2,0 |
|
|
3683 |
# 0| 0,0| 1,0| 2,0|
|
|
3684 |
# +----+----+----+
|
|
3685 |
# |0,1 |2,1 |
|
|
3686 |
# 1| 1,1| 2,1|
|
|
3687 |
# +----+----+----+
|
|
3688 |
# |0,2 |1,2 |2,2 |
|
|
3689 |
# 2| | 1,2| 2,2|
|
|
3690 |
# + +----+----+
|
|
3691 |
# | |1,3 |2,3 |
|
|
3692 |
# 3| 0,3| 1,3| 2,3|
|
|
3693 |
# +----+----+----+
|
|
3694 |
#
|
|
3695 |
# html table cell array :
|
|
3696 |
# [[[i0=>0,j0=>0,i1=>0,j1=>0],[i0=>1,j0=>0,i1=>1,j1=>0],[i0=>2,j0=>0,i1=>2,j1=>0]],
|
|
3697 |
# [[i0=>0,j0=>1,i1=>1,j1=>1],[i0=>2,j0=>1,i1=>2,j1=>1]],
|
|
3698 |
# [[i0=>0,j0=>2,i1=>0,j1=>3],[i0=>1,j0=>2,i1=>1,j1=>2],[i0=>2,j0=>2,i1=>2,j1=>2]]
|
|
3699 |
# [[i0=>1,j0=>3,i1=>1,j1=>3],[i0=>2,j0=>3,i1=>2,j1=>3]]]
|
|
3700 |
#
|
|
3701 |
# @param string :tag tag name (in upcase)
|
|
3702 |
# @param string :attr tag attribute (in upcase)
|
|
3703 |
# @access private
|
|
3704 |
#
|
|
3705 |
def openHTMLTagCalc(tag, attrs)
|
|
3706 |
#Opening tag
|
|
3707 |
case (tag)
|
|
3708 |
when 'table'
|
|
3709 |
@max_table_columns[@table_id] = 0;
|
|
3710 |
@t_columns = 0;
|
|
3711 |
@tr_id = -1;
|
|
3712 |
when 'tr'
|
|
3713 |
if @max_table_columns[@table_id] < @t_columns
|
|
3714 |
@max_table_columns[@table_id] = @t_columns;
|
|
3715 |
end
|
|
3716 |
@t_columns = 0;
|
|
3717 |
@tr_id += 1;
|
|
3718 |
@td_id = -1;
|
|
3719 |
@t_cells[@table_id].push []
|
|
3720 |
when 'td', 'th'
|
|
3721 |
@td_id += 1;
|
|
3722 |
if attrs['colspan'].nil? or attrs['colspan'] == ''
|
|
3723 |
colspan = 1;
|
|
3724 |
else
|
|
3725 |
colspan = attrs['colspan'].to_i;
|
|
3726 |
end
|
|
3727 |
if attrs['rowspan'].nil? or attrs['rowspan'] == ''
|
|
3728 |
rowspan = 1;
|
|
3729 |
else
|
|
3730 |
rowspan = attrs['rowspan'].to_i;
|
|
3731 |
end
|
|
3732 |
|
|
3733 |
i = 0;
|
|
3734 |
while true
|
|
3735 |
next_i_distance = checkTableBlockingCellPosition(@table_id, @tr_id, @td_id + i);
|
|
3736 |
if next_i_distance == 0
|
|
3737 |
@t_cells[@table_id][@tr_id].push "i0"=>@td_id + i, "j0"=>@tr_id, "i1"=>(@td_id + i + colspan - 1), "j1"=>@tr_id + rowspan - 1
|
|
3738 |
break;
|
|
3739 |
end
|
|
3740 |
i += next_i_distance;
|
|
3741 |
end
|
|
3742 |
|
|
3743 |
@t_columns += colspan;
|
|
3744 |
end
|
|
3745 |
end
|
|
3746 |
|
|
3747 |
#
|
|
3748 |
# Calculate closing tags.
|
|
3749 |
# @param string :tag tag name (in upcase)
|
|
3750 |
# @access private
|
|
3751 |
#
|
|
3752 |
def closedHTMLTagCalc(tag)
|
|
3753 |
#Closing tag
|
|
3754 |
case (tag)
|
|
3755 |
when 'table'
|
|
3756 |
if @max_table_columns[@table_id] < @t_columns
|
|
3757 |
@max_table_columns[@table_id] = @t_columns;
|
|
3758 |
end
|
|
3759 |
@table_id += 1;
|
|
3760 |
@t_cells.push []
|
|
3761 |
end
|
|
3762 |
end
|
|
3763 |
|
|
3764 |
#
|
3495 |
3765 |
# Process opening tags.
|
3496 |
3766 |
# @param string :tag tag name (in upcase)
|
3497 |
3767 |
# @param string :attr tag attribute (in upcase)
|
... | ... | |
3501 |
3771 |
def openHTMLTagHandler(tag, attrs, fill=0)
|
3502 |
3772 |
#Opening tag
|
3503 |
3773 |
case (tag)
|
|
3774 |
when 'pre'
|
|
3775 |
@pre_state = true;
|
|
3776 |
@l_margin += 5;
|
|
3777 |
@r_margin += 5;
|
|
3778 |
@x += 5;
|
|
3779 |
|
3504 |
3780 |
when 'table'
|
|
3781 |
if @default_table_columns < @max_table_columns[@table_id]
|
|
3782 |
@table_columns = @max_table_columns[@table_id];
|
|
3783 |
else
|
|
3784 |
@table_columns = @default_table_columns;
|
|
3785 |
end
|
|
3786 |
@l_margin += 5;
|
|
3787 |
@r_margin += 5;
|
|
3788 |
@x += 5;
|
|
3789 |
|
3505 |
3790 |
if attrs['border'].nil? or attrs['border'] == ''
|
3506 |
3791 |
@tableborder = 0;
|
3507 |
3792 |
else
|
3508 |
3793 |
@tableborder = attrs['border'];
|
3509 |
3794 |
end
|
|
3795 |
@tr_id = -1;
|
|
3796 |
@max_td_page[0] = @page;
|
|
3797 |
@max_td_y[0] = @y;
|
|
3798 |
|
3510 |
3799 |
when 'tr', 'td', 'th'
|
3511 |
|
# SetStyle('b', true) if tag == 'th'
|
3512 |
|
|
|
3800 |
if tag == 'th'
|
|
3801 |
SetStyle('b', true);
|
|
3802 |
@tdalign = "C";
|
|
3803 |
end
|
3513 |
3804 |
if ((!attrs['width'].nil?) and (attrs['width'] != ''))
|
3514 |
3805 |
@tdwidth = (attrs['width'].to_i/4);
|
3515 |
3806 |
else
|
3516 |
|
@tdwidth = ((@w - @l_margin - @r_margin) / @default_table_columns);
|
|
3807 |
@tdwidth = ((@w - @l_margin - @r_margin) / @table_columns);
|
3517 |
3808 |
end
|
|
3809 |
|
|
3810 |
if tag == 'tr'
|
|
3811 |
@tr_id += 1;
|
|
3812 |
@td_id = -1;
|
|
3813 |
else
|
|
3814 |
@td_id += 1;
|
|
3815 |
@x = @l_margin + @tdwidth * @t_cells[@table_id][@tr_id][@td_id]['i0'];
|
|
3816 |
end
|
|
3817 |
|
|
3818 |
if attrs['colspan'].nil? or attrs['border'] == ''
|
|
3819 |
@colspan = 1;
|
|
3820 |
else
|
|
3821 |
@colspan = attrs['colspan'].to_i;
|
|
3822 |
end
|
|
3823 |
@tdwidth *= @colspan;
|
3518 |
3824 |
if ((!attrs['height'].nil?) and (attrs['height'] != ''))
|
3519 |
3825 |
@tdheight=(attrs['height'].to_i / @k);
|
3520 |
3826 |
else
|
... | ... | |
3538 |
3844 |
@tdbegin=true;
|
3539 |
3845 |
|
3540 |
3846 |
when 'hr'
|
3541 |
|
Ln();
|
|
3847 |
margin = 1;
|
3542 |
3848 |
if ((!attrs['width'].nil?) and (attrs['width'] != ''))
|
3543 |
3849 |
hrWidth = attrs['width'];
|
3544 |
3850 |
else
|
3545 |
|
hrWidth = @w - @l_margin - @r_margin;
|
|
3851 |
hrWidth = @w - @l_margin - @r_margin - margin;
|
3546 |
3852 |
end
|
3547 |
|
x = GetX();
|
3548 |
|
y = GetY();
|
3549 |
3853 |
SetLineWidth(0.2);
|
3550 |
|
Line(x, y, x + hrWidth, y);
|
3551 |
|
SetLineWidth(0.2);
|
|
3854 |
Line(@x + margin, @y, @x + hrWidth, @y);
|
3552 |
3855 |
Ln();
|
3553 |
3856 |
|
3554 |
3857 |
when 'strong'
|
... | ... | |
3557 |
3860 |
when 'em'
|
3558 |
3861 |
SetStyle('i', true);
|
3559 |
3862 |
|
|
3863 |
when 'ins'
|
|
3864 |
SetStyle('u', true);
|
|
3865 |
|
|
3866 |
when 'del'
|
|
3867 |
SetStyle('d', true);
|
|
3868 |
|
3560 |
3869 |
when 'b', 'i', 'u'
|
3561 |
3870 |
SetStyle(tag, true);
|
3562 |
3871 |
|
... | ... | |
3565 |
3874 |
|
3566 |
3875 |
when 'img'
|
3567 |
3876 |
if (!attrs['src'].nil?)
|
|
3877 |
Write(@lasth, '!' + attrs['src'] + '!', '', fill);
|
|
3878 |
=begin Comment out. Because not implement image output yet.
|
3568 |
3879 |
# replace relative path with real server path
|
3569 |
3880 |
attrs['src'] = attrs['src'].gsub(@@k_path_url_cache, @@k_path_cache);
|
3570 |
3881 |
if (attrs['width'].nil?)
|
... | ... | |
3577 |
3888 |
Image(attrs['src'], GetX(),GetY(), pixelsToMillimeters(attrs['width']), pixelsToMillimeters(attrs['height']));
|
3578 |
3889 |
#SetX(@img_rb_x);
|
3579 |
3890 |
SetY(@img_rb_y);
|
3580 |
|
|
|
3891 |
=end
|
3581 |
3892 |
end
|
3582 |
3893 |
|
3583 |
|
when 'ul'
|
3584 |
|
@listordered = false;
|
3585 |
|
@listcount = 0;
|
|
3894 |
when 'ul', 'ol'
|
|
3895 |
if @li_count == 0
|
|
3896 |
Ln() if @prevquote_count == @quote_count; # insert Ln for keeping quote lines
|
|
3897 |
@prevquote_count = @quote_count;
|
|
3898 |
end
|
|
3899 |
if @li_state == true
|
|
3900 |
Ln();
|
|
3901 |
@li_state = false;
|
|
3902 |
end
|
|
3903 |
if tag == 'ul'
|
|
3904 |
@list_ordered[@li_count] = false;
|
|
3905 |
else
|
|
3906 |
@list_ordered[@li_count] = true;
|
|
3907 |
end
|
|
3908 |
@list_count[@li_count] = 0;
|
|
3909 |
@li_count += 1
|
3586 |
3910 |
|
3587 |
|
when 'ol'
|
3588 |
|
@listordered = true;
|
3589 |
|
@listcount = 0;
|
3590 |
|
|
3591 |
3911 |
when 'li'
|
3592 |
|
Ln();
|
3593 |
|
if (@listordered)
|
3594 |
|
@listcount += 1
|
3595 |
|
@lispacer = " " + (@listcount).to_s + ". ";
|
|
3912 |
Ln() if @li_state == true
|
|
3913 |
if (@list_ordered[@li_count - 1])
|
|
3914 |
@list_count[@li_count - 1] += 1;
|
|
3915 |
@li_spacer = " " * @li_count + (@list_count[@li_count - 1]).to_s + ". ";
|
3596 |
3916 |
else
|
3597 |
3917 |
#unordered list simbol
|
3598 |
|
@lispacer = " - ";
|
|
3918 |
@li_spacer = " " * @li_count + "- ";
|
3599 |
3919 |
end
|
3600 |
|
Write(@lasth, @lispacer, '', fill);
|
|
3920 |
Write(@lasth, @spacer + @li_spacer, '', fill);
|
|
3921 |
@li_state = true;
|
3601 |
3922 |
|
3602 |
|
when 'blockquote', 'br'
|
|
3923 |
when 'blockquote'
|
|
3924 |
if (@quote_count == 0)
|
|
3925 |
SetStyle('i', true);
|
|
3926 |
@l_margin += 5;
|
|
3927 |
else
|
|
3928 |
@l_margin += 5 / 2;
|
|
3929 |
end
|
|
3930 |
@x = @l_margin;
|
|
3931 |
@quote_top[@quote_count] = @y;
|
|
3932 |
@quote_page[@quote_count] = @page;
|
|
3933 |
@quote_count += 1
|
|
3934 |
when 'br'
|
3603 |
3935 |
Ln();
|
3604 |
|
if (@lispacer.length > 0)
|
3605 |
|
@x += GetStringWidth(@lispacer);
|
|
3936 |
|
|
3937 |
if (@li_spacer.length > 0)
|
|
3938 |
@x += GetStringWidth(@li_spacer);
|
3606 |
3939 |
end
|
3607 |
3940 |
|
3608 |
3941 |
when 'p'
|
3609 |
3942 |
Ln();
|
3610 |
|
Ln();
|
|
3943 |
0.upto(@quote_count - 1) do |i|
|
|
3944 |
if @quote_page[i] == @page;
|
|
3945 |
if @quote_top[i] == @y - @lasth; # fix start line
|
|
3946 |
@quote_top[i] = @y;
|
|
3947 |
end
|
|
3948 |
else
|
|
3949 |
if @quote_page[i] == @page - 1;
|
|
3950 |
@quote_page[i] = @page; # fix start line
|
|
3951 |
@quote_top[i] = @t_margin;
|
|
3952 |
end
|
|
3953 |
end
|
|
3954 |
end
|
3611 |
3955 |
|
3612 |
3956 |
when 'sup'
|
3613 |
3957 |
currentfont_size = @font_size;
|
... | ... | |
3648 |
3992 |
@lasth = @font_size * @@k_cell_height_ratio;
|
3649 |
3993 |
|
3650 |
3994 |
when 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
|
|
3995 |
Ln();
|
3651 |
3996 |
headsize = (4 - tag[1,1].to_f) * 2
|
3652 |
3997 |
@tempfontsize = @font_size_pt;
|
3653 |
3998 |
SetFontSize(@font_size_pt + headsize);
|
... | ... | |
3665 |
4010 |
def closedHTMLTagHandler(tag)
|
3666 |
4011 |
#Closing tag
|
3667 |
4012 |
case (tag)
|
|
4013 |
when 'pre'
|
|
4014 |
@pre_state = false;
|
|
4015 |
@l_margin -= 5;
|
|
4016 |
@r_margin -= 5;
|
|
4017 |
@x = @l_margin;
|
|
4018 |
Ln();
|
|
4019 |
|
3668 |
4020 |
when 'td','th'
|
3669 |
4021 |
@tdbegin = false;
|
3670 |
4022 |
@tdwidth = 0;
|
3671 |
4023 |
@tdheight = 0;
|
3672 |
4024 |
@tdalign = "L";
|
|
4025 |
SetStyle('b', false);
|
3673 |
4026 |
@tdfill = 0;
|
3674 |
4027 |
SetFillColor(@prevfill_color[0], @prevfill_color[1], @prevfill_color[2]);
|
3675 |
4028 |
|
3676 |
4029 |
when 'tr'
|
3677 |
|
Ln();
|
|
4030 |
@y = @max_td_y[@tr_id + 1];
|
|
4031 |
@x = @l_margin;
|
|
4032 |
@page = @max_td_page[@tr_id + 1];
|
3678 |
4033 |
|
3679 |
4034 |
when 'table'
|
|
4035 |
# Write Table Line
|
|
4036 |
width = (@w - @l_margin - @r_margin) / @table_columns;
|
|
4037 |
0.upto(@t_cells[@table_id].size - 1) do |j|
|
|
4038 |
0.upto(@t_cells[@table_id][j].size - 1) do |i|
|
|
4039 |
@page = @max_td_page[j]
|
|
4040 |
i0=@t_cells[@table_id][j][i]['i0'];
|
|
4041 |
j0=@t_cells[@table_id][j][i]['j0'];
|
|
4042 |
i1=@t_cells[@table_id][j][i]['i1'];
|
|
4043 |
j1=@t_cells[@table_id][j][i]['j1'];
|
|
4044 |
|
|
4045 |
Line(@l_margin + width * i0, @max_td_y[j0], @l_margin + width * (i1+1), @max_td_y[j0]) # top
|
|
4046 |
if ( @page == @max_td_page[j1 + 1])
|
|
4047 |
Line(@l_margin + width * i0, @max_td_y[j0], @l_margin + width * i0, @max_td_y[j1+1]) # left
|
|
4048 |
Line(@l_margin + width * (i1+1), @max_td_y[j0], @l_margin + width * (i1+1), @max_td_y[j1+1]) # right
|
|
4049 |
else
|
|
4050 |
Line(@l_margin + width * i0, @max_td_y[j0], @l_margin + width * i0, @page_break_trigger) # left
|
|
4051 |
Line(@l_margin + width * (i1+1), @max_td_y[j0], @l_margin + width * (i1+1), @page_break_trigger) # right
|
|
4052 |
@page += 1;
|
|
4053 |
while @page < @max_td_page[j1 + 1]
|
|
4054 |
Line(@l_margin + width * i0, @t_margin, @l_margin + width * i0, @page_break_trigger) # left
|
|
4055 |
Line(@l_margin + width * (i1+1), @t_margin, @l_margin + width * (i1+1), @page_break_trigger) # right
|
|
4056 |
@page += 1;
|
|
4057 |
end
|
|
4058 |
Line(@l_margin + width * i0, @t_margin, @l_margin + width * i0, @max_td_y[j1+1]) # left
|
|
4059 |
Line(@l_margin + width * (i1+1), @t_margin, @l_margin + width * (i1+1), @max_td_y[j1+1]) # right
|
|
4060 |
end
|
|
4061 |
Line(@l_margin + width * i0, @max_td_y[j1+1], @l_margin + width * (i1+1), @max_td_y[j1+1]) # bottom
|
|
4062 |
end
|
|
4063 |
end
|
|
4064 |
|
|
4065 |
@l_margin -= 5;
|
|
4066 |
@r_margin -= 5;
|
3680 |
4067 |
@tableborder=0;
|
|
4068 |
Ln();
|
|
4069 |
@table_id += 1;
|
3681 |
4070 |
|
3682 |
4071 |
when 'strong'
|
3683 |
4072 |
SetStyle('b', false);
|
... | ... | |
3685 |
4074 |
when 'em'
|
3686 |
4075 |
SetStyle('i', false);
|
3687 |
4076 |
|
|
4077 |
when 'ins'
|
|
4078 |
SetStyle('u', false);
|
|
4079 |
|
|
4080 |
when 'del'
|
|
4081 |
SetStyle('d', false);
|
|
4082 |
|
3688 |
4083 |
when 'b', 'i', 'u'
|
3689 |
4084 |
SetStyle(tag, false);
|
3690 |
4085 |
|
3691 |
4086 |
when 'a'
|
3692 |
4087 |
@href = nil;
|
3693 |
4088 |
|
|
4089 |
when 'p'
|
|
4090 |
Ln();
|
|
4091 |
|
3694 |
4092 |
when 'sup'
|
3695 |
4093 |
currentfont_size = @font_size;
|
3696 |
4094 |
SetFontSize(@tempfontsize);
|
... | ... | |
3725 |
4123 |
#@text_color = @prevtext_color;
|
3726 |
4124 |
@lasth = @font_size * @@k_cell_height_ratio;
|
3727 |
4125 |
|
3728 |
|
when 'ul'
|
3729 |
|
Ln();
|
|
4126 |
when 'blockquote'
|
|
4127 |
@quote_count -= 1
|
|
4128 |
if (@quote_page[@quote_count] == @page)
|
|
4129 |
Line(@l_margin - 1, @quote_top[@quote_count], @l_margin - 1, @y) # quoto line
|
|
4130 |
else
|
|
4131 |
cur_page = @page;
|
|
4132 |
cur_y = @y;
|
|
4133 |
@page = @quote_page[@quote_count];
|
|
4134 |
if (@quote_top[@quote_count] < @page_break_trigger)
|
|
4135 |
Line(@l_margin - 1, @quote_top[@quote_count], @l_margin - 1, @page_break_trigger) # quoto line
|
|
4136 |
end
|
|
4137 |
@page += 1;
|
|
4138 |
while @page < cur_page
|
|
4139 |
Line(@l_margin - 1, @t_margin, @l_margin - 1, @page_break_trigger) # quoto line
|
|
4140 |
@page += 1;
|
|
4141 |
end
|
|
4142 |
@y = cur_y;
|
|
4143 |
Line(@l_margin - 1, @t_margin, @l_margin - 1, @y) # quoto line
|
|
4144 |
end
|
|
4145 |
if (@quote_count <= 0)
|
|
4146 |
SetStyle('i', false);
|
|
4147 |
@l_margin -= 5;
|
|
4148 |
else
|
|
4149 |
@l_margin -= 5 / 2;
|
|
4150 |
end
|
|
4151 |
@x = @l_margin;
|
|
4152 |
Ln() if @quote_count == 0
|
|
4153 |
|
|
4154 |
when 'ul', 'ol'
|
|
4155 |
@li_count -= 1
|
|
4156 |
if @li_state == true
|
|
4157 |
Ln();
|
|
4158 |
@li_state = false;
|
|
4159 |
end
|
3730 |
4160 |
|
3731 |
|
when 'ol'
|
3732 |
|
Ln();
|
3733 |
|
|
3734 |
4161 |
when 'li'
|
3735 |
|
@lispacer = "";
|
|
4162 |
@li_spacer = "";
|
|
4163 |
if @li_state == true
|
|
4164 |
Ln();
|
|
4165 |
@li_state = false;
|
|
4166 |
end
|
3736 |
4167 |
|
3737 |
4168 |
when 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'
|
3738 |
4169 |
SetFontSize(@tempfontsize);
|
... | ... | |
3740 |
4171 |
SetStyle('b', false);
|
3741 |
4172 |
Ln();
|
3742 |
4173 |
@lasth = @font_size * @@k_cell_height_ratio;
|
3743 |
|
|
|
4174 |
|
|
4175 |
if tag == 'h1' or tag == 'h2' or tag == 'h3' or tag == 'h4'
|
|
4176 |
margin = 1;
|
|
4177 |
hrWidth = @w - @l_margin - @r_margin - margin;
|
|
4178 |
if tag == 'h1' or tag == 'h2'
|
|
4179 |
SetLineWidth(0.2);
|
|
4180 |
else
|
|
4181 |
SetLineWidth(0.1);
|
|
4182 |
end
|
|
4183 |
Line(@x + margin, @y, @x + hrWidth, @y);
|
|
4184 |
end
|
3744 |
4185 |
end
|
3745 |
4186 |
end
|
3746 |
4187 |
|
... | ... | |
3752 |
4193 |
#
|
3753 |
4194 |
def SetStyle(tag, enable)
|
3754 |
4195 |
#Modify style and select corresponding font
|
3755 |
|
style='';
|
3756 |
|
['b', 'i', 'u'].each do |s|
|
3757 |
|
style << s if tag.downcase == s and enable
|
|
4196 |
['b', 'i', 'u', 'd'].each do |s|
|
|
4197 |
if tag.downcase == s
|
|
4198 |
if enable
|
|
4199 |
@style << s if ! @style.include?(s)
|
|
4200 |
else
|
|
4201 |
@style = @style.gsub(s,'')
|
|
4202 |
end
|
|
4203 |
end
|
3758 |
4204 |
end
|
3759 |
|
SetFont('', style);
|
|
4205 |
SetFont('', @style);
|
3760 |
4206 |
end
|
3761 |
4207 |
|
3762 |
4208 |
#
|