This diff has been collapsed as it changes many lines, (610 lines changed) Show them Hide them | |||
@@ -98,6 +98,8 class TCPDF | |||
|
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,11 +143,11 class TCPDF | |||
|
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,6 +228,12 class TCPDF | |||
|
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,9 +256,15 class TCPDF | |||
|
248 | 256 | @is_unicode = unicode |
|
249 | 257 | @lasth ||= 0 |
|
250 | 258 | @links ||= [] |
|
251 |
@listordered ||= |
|
|
252 |
@listcount ||= |
|
|
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,6 +286,7 class TCPDF | |||
|
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,7 +752,7 class TCPDF | |||
|
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,6 +1327,7 class TCPDF | |||
|
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,7 +1410,7 class TCPDF | |||
|
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,6 +1442,12 class TCPDF | |||
|
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,7 +1595,7 class TCPDF | |||
|
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 += ' ' + do |
|
|
1598 | s += ' ' + dolinetxt(x, y, txt); | |
|
1577 | 1599 | end |
|
1578 | 1600 | if (@color_flag) |
|
1579 | 1601 | s='q ' + @text_color + ' ' + s + ' Q'; |
@@ -1661,19 +1683,25 class TCPDF | |||
|
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 |
|
|
|
1666 | if (ws > 0) | |
|
1667 |
|
|
|
1668 | out('0 Tw'); | |
|
1669 | end | |
|
1670 | AddPage(@cur_orientation); | |
|
1671 | @x = x; | |
|
1672 | if (ws > 0) | |
|
1673 | @ws = ws; | |
|
1674 | out(sprintf('%.3f Tw', ws * k)); | |
|
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; | |
|
1675 | 1702 | end |
|
1676 | 1703 | end |
|
1704 | ||
|
1677 | 1705 | if (w == 0) |
|
1678 | 1706 | w = @w - @r_margin - @x; |
|
1679 | 1707 | end |
@@ -1717,7 +1745,10 class TCPDF | |||
|
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<<' ' + do |
|
|
1748 | s<<' ' + dolinetxt(@x + dx, @y + 0.5 * h + 0.3 * @font_size, txt); | |
|
1749 | end | |
|
1750 | if (@deleted) | |
|
1751 | s<<' ' + dolinetxt(@x + dx, @y + 0.3 * h + 0.2 * @font_size, txt); | |
|
1721 | 1752 | end |
|
1722 | 1753 | if (@color_flag) |
|
1723 | 1754 | s<<' Q'; |
@@ -1760,6 +1791,7 class TCPDF | |||
|
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,6 +1908,7 class TCPDF | |||
|
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,6 +2108,29 class TCPDF | |||
|
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,6 +2529,7 class TCPDF | |||
|
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,7 +2582,7 class TCPDF | |||
|
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,7 +2610,7 class TCPDF | |||
|
2553 | 2610 | #Palette |
|
2554 | 2611 | if (info['cs']=='Indexed') |
|
2555 | 2612 | newobj(); |
|
2556 |
pal=(@compress) ? gzcompress(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,10 +2823,10 class TCPDF | |||
|
2766 | 2823 | end |
|
2767 | 2824 | |
|
2768 | 2825 | # |
|
2769 | # Underline text | |
|
2826 | # Underline and Deleted text | |
|
2770 | 2827 | # @access protected |
|
2771 | 2828 | # |
|
2772 |
def do |
|
|
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,7 +3407,7 class TCPDF | |||
|
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,12 +3421,38 class TCPDF | |||
|
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,14 +3472,32 class TCPDF | |||
|
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) | |
|
3491 | end | |
|
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!(/ /, " "); | |
|
3398 | 3500 | end |
|
3399 | elsif ((element.strip.length > 0) and (element != " ")) | |
|
3400 | 3501 | Write(@lasth, unhtmlentities(element), '', fill); |
|
3401 | 3502 | end |
|
3402 | 3503 | end |
@@ -3422,7 +3523,7 class TCPDF | |||
|
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= |
|
|
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,6 +3547,24 class TCPDF | |||
|
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,37 +3580,188 class TCPDF | |||
|
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, |
|
|
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, |
|
|
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,20 +3771,56 class TCPDF | |||
|
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) / @ |
|
|
3807 | @tdwidth = ((@w - @l_margin - @r_margin) / @table_columns); | |
|
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']; | |
|
3517 | 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,17 +3844,14 class TCPDF | |||
|
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 | SetLineWidth(0.2); | |
|
3550 | Line(x, y, x + hrWidth, y); | |
|
3551 | 3853 | SetLineWidth(0.2); |
|
3854 | Line(@x + margin, @y, @x + hrWidth, @y); | |
|
3552 | 3855 | Ln(); |
|
3553 | 3856 | |
|
3554 | 3857 | when 'strong' |
@@ -3557,6 +3860,12 class TCPDF | |||
|
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,6 +3874,8 class TCPDF | |||
|
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,37 +3888,70 class TCPDF | |||
|
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; | |
|
3586 | ||
|
3587 | when 'ol' | |
|
3588 |
|
|
|
3589 | @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 | |
|
3590 | 3910 | |
|
3591 | 3911 | when 'li' |
|
3592 | Ln(); | |
|
3593 | if (@listordered) | |
|
3594 |
|
|
|
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' |
|
|
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,6 +3992,7 class TCPDF | |||
|
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,19 +4010,63 class TCPDF | |||
|
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,12 +4074,21 class TCPDF | |||
|
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,14 +4123,47 class TCPDF | |||
|
3725 | 4123 | #@text_color = @prevtext_color; |
|
3726 | 4124 | @lasth = @font_size * @@k_cell_height_ratio; |
|
3727 | 4125 | |
|
3728 |
when ' |
|
|
3729 | Ln(); | |
|
3730 | ||
|
3731 | when 'ol' | |
|
3732 | 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 | |
|
3733 | 4160 | |
|
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,7 +4171,17 class TCPDF | |||
|
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,11 +4193,16 class TCPDF | |||
|
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 | # |
General Comments 0
You need to be logged in to leave comments.
Login now