pdf-table.nut 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. /*
  2. * Copyright (C) 2013 by Domingo Alvarez Duarte <[email protected]>
  3. *
  4. * Licensed under GPLv3, see http://www.gnu.org/licenses/gpl.html.
  5. */
  6. class PdfSqlTable extends Sq_Fpdf {
  7. col_h = null;
  8. col_h0 = null;
  9. doFill = null;
  10. _cols_info = null;
  11. page_title = null;
  12. water_mark = null;
  13. constructor(){
  14. base.constructor();
  15. AliasNbPages();
  16. SetFont("Arial","",10);
  17. SetFillColor(224, 235, 255);
  18. SetDrawColor(0xCC);
  19. col_h = 5;
  20. col_h0 = 8;
  21. doFill = false;
  22. _cols_info = [];
  23. page_title = "";
  24. water_mark = "";
  25. }
  26. function parse_field_header(col_name){
  27. local ci = col_name.split('|');
  28. local col_info = {};
  29. col_info.colname <- ci.get(0, "?");
  30. col_info.header <- ci.get(1, "?");
  31. col_info.width <- ci.get(2, 10).tointeger();
  32. col_info.align <- ci.get(3, "L");
  33. col_info.format <- ci.get(4, "");
  34. col_info.color <- ci.get(5, 0).tointeger();
  35. col_info.bgcolor <- ci.get(6, 0).tointeger();
  36. col_info.header <- col_info.header;
  37. return col_info;
  38. }
  39. function set_cols(szCols, max_cols=12){
  40. _cols_info = [];
  41. for(local i=0; i < max_cols; ++i){
  42. local p = szCols.get(i, null);
  43. if (!p) break;
  44. local col_info = parse_field_header(p);
  45. _cols_info.push(col_info);
  46. }
  47. calc_cols_width();
  48. }
  49. function calc_cols_width(){
  50. local grid_width, total_widths, char_width;
  51. grid_width = GetW()-(GetLeftMargin()+GetRightMargin());
  52. char_width = GetStringWidth("w");
  53. total_widths = 0;
  54. local col_count = _cols_info.len();
  55. for(local k=0; k < col_count; ++k){
  56. local v = _cols_info[k].width;
  57. if (v > 0) total_widths += ((v * char_width) + 1);
  58. }
  59. for(local k=0; k < col_count; ++k){
  60. local v = _cols_info[k];
  61. local col_width = v.width;
  62. if ( col_width < 0) col_width = grid_width - total_widths;
  63. else col_width = col_width * char_width;
  64. v.width = col_width;
  65. }
  66. }
  67. function Header(){
  68. SetFont("","BI",18);
  69. Cell(160,0,page_title,"0",0,'L');
  70. SetFont("","",10);
  71. Cell(0,0,format("%d", PageNo()),"",2,'R');
  72. //Line break
  73. SetY(20);
  74. //MyLine(m_lMargin, 18, m_w - m_rMargin, 18);
  75. //Ln(15);
  76. SetFont("","B",12);
  77. local saved_fill = doFill;
  78. doFill = true;
  79. local saved_color = GetFillColor();
  80. SetFillColor(0xEE);
  81. for(local k=0, count=_cols_info.len(); k < count; ++k){
  82. local v = _cols_info[k];
  83. ClippedCell(v.width, col_h0, v.header, "1", 0, 'C', doFill);
  84. }
  85. Ln();
  86. SetFillColor(saved_color);
  87. doFill = saved_fill;
  88. SetFont("","",10);
  89. }
  90. function GetPDF(db, sql, clipped, mf=null){
  91. local stmt = db.prepare(sql);
  92. local col_count = stmt.col_count();
  93. _cols_info = [];
  94. stmt.step();
  95. for(local i=0; i < col_count; ++i){
  96. local col_info = parse_field_header(stmt.col_name(i));
  97. _cols_info.push(col_info);
  98. }
  99. stmt.reset();
  100. calc_cols_width();
  101. local result = clipped ? _gen_pdf_clipped(stmt, mf) : _gen_pdf_multiline(stmt, mf);
  102. stmt.finalize();
  103. return result;
  104. }
  105. function _gen_pdf_multiline(stmt, mf=null){
  106. AddPage();
  107. local cols_size = _cols_info.len();
  108. while(stmt.next_row()){
  109. local max_lines = 0
  110. for(local k=0; k < cols_size; ++k){
  111. local v = _cols_info[k];
  112. local lines = CalcLines(v.width, stmt.col(k).tostring());
  113. if(lines > max_lines) max_lines = lines;
  114. }
  115. local col_height = max_lines * col_h;
  116. CheckPageBreak(col_height);
  117. local saved_y = GetY();
  118. for(local k=0; k < cols_size; ++k){
  119. local saved_x = GetX();
  120. local v = _cols_info[k];
  121. local fill = doFill ? "DF" : "D";
  122. Rect(saved_x, saved_y, v.width, col_height, fill);
  123. MultiCell(v.width, col_h, stmt.col(k).tostring(), "LRT", v.align[0], doFill);
  124. SetXY(saved_x + v.width, saved_y);
  125. }
  126. doFill = !doFill;
  127. Ln(col_height);
  128. }
  129. //SetDisplayMode(FPDF::e_zoom_fullpage, FPDF::e_layout_single);
  130. if(mf) {
  131. Output(mf);
  132. return true;
  133. }
  134. return Output("doc.pdf", 'S');
  135. }
  136. function _gen_pdf_clipped(stmt, mf=null){
  137. AddPage();
  138. local cols_size = _cols_info.len();
  139. while(stmt.next_row()){
  140. for(local k=0; k < cols_size; ++k){
  141. local v = _cols_info[k];
  142. ClippedCell(v.width, col_h, stmt.col(k).tostring(),
  143. "1", 0, v.align[0], doFill);
  144. }
  145. doFill = !doFill;
  146. Ln();
  147. }
  148. //SetDisplayMode(FPDF::e_zoom_fullpage, FPDF::e_layout_single);
  149. if(mf) {
  150. Output(mf);
  151. return true;
  152. }
  153. return Output("doc.pdf", 'S');
  154. }
  155. function MyLine(x1, y1, x2, y2){
  156. SetLineWidth(0.5);
  157. local saved_color = GetDrawColor();
  158. SetDrawColor(200,200,200);
  159. Line(x1, y1, x2, y2);
  160. SetDrawColor(saved_color);
  161. }
  162. function Footer(){
  163. //Position at 1.5 cm from bottom
  164. //MyLine(m_lMargin, m_h-20, m_w - m_rMargin, m_h-20)
  165. SetY(-20);
  166. //Page number
  167. Cell(0,3, format("Page %d / %s", PageNo(),
  168. GetAliasNbPages()),"",1,'C');
  169. SetFont("","I",8);
  170. Cell(0,6, "OURBIZ is an excelente application to manage a business.","",0,'C');
  171. if (water_mark && water_mark.len() > 0) {
  172. SetAlpha(0.7, "Darken");
  173. //SetAlpha(0.5);
  174. SetFont("Arial","B",50);
  175. SetTextColor(255,192,203);
  176. RotatedText(35,190, water_mark, 45);
  177. SetAlpha(1);
  178. SetTextColor(0);
  179. }
  180. }
  181. }