David PHAM-VAN

Improve demos

@@ -545,7 +545,7 @@ String _formatCurrency(double amount) { @@ -545,7 +545,7 @@ String _formatCurrency(double amount) {
545 } 545 }
546 546
547 String _formatDate(DateTime date) { 547 String _formatDate(DateTime date) {
548 - final format = DateFormat.yMMMMd('en_US'); 548 + final format = DateFormat.yMMMd('en_US');
549 return format.format(date); 549 return format.format(date);
550 } 550 }
551 551
@@ -223,7 +223,7 @@ Future<Uint8List> generateReport(PdfPageFormat pageFormat) async { @@ -223,7 +223,7 @@ Future<Uint8List> generateReport(PdfPageFormat pageFormat) async {
223 ), 223 ),
224 ), 224 ),
225 pw.Text( 225 pw.Text(
226 - 'Budget was originally \$1915. A total of \$1990 was spent on the month os January which exceeded the overall budget by \$75', 226 + 'Budget was originally \$1915. A total of \$1990 was spent on the month of January which exceeded the overall budget by \$75',
227 textAlign: pw.TextAlign.justify, 227 textAlign: pw.TextAlign.justify,
228 ) 228 )
229 ], 229 ],
@@ -26,6 +26,7 @@ import 'package:pdf/widgets.dart' as pw; @@ -26,6 +26,7 @@ import 'package:pdf/widgets.dart' as pw;
26 26
27 const PdfColor green = PdfColor.fromInt(0xff9ce5d0); 27 const PdfColor green = PdfColor.fromInt(0xff9ce5d0);
28 const PdfColor lightGreen = PdfColor.fromInt(0xffcdf1e7); 28 const PdfColor lightGreen = PdfColor.fromInt(0xffcdf1e7);
  29 +const sep = 120.0;
29 30
30 Future<Uint8List> generateResume(PdfPageFormat format) async { 31 Future<Uint8List> generateResume(PdfPageFormat format) async {
31 final pw.Document doc = 32 final pw.Document doc =
@@ -38,102 +39,127 @@ Future<Uint8List> generateResume(PdfPageFormat format) async { @@ -38,102 +39,127 @@ Future<Uint8List> generateResume(PdfPageFormat format) async {
38 39
39 final pw.PageTheme pageTheme = await _myPageTheme(format); 40 final pw.PageTheme pageTheme = await _myPageTheme(format);
40 41
41 - doc.addPage(pw.Page(  
42 - pageTheme: pageTheme,  
43 - build: (pw.Context context) => pw.Row(children: <pw.Widget>[  
44 - pw.Expanded(  
45 - child: pw.Column(  
46 - crossAxisAlignment: pw.CrossAxisAlignment.start,  
47 - children: <pw.Widget>[  
48 - pw.Container(  
49 - padding: const pw.EdgeInsets.only(left: 30, bottom: 20),  
50 - child: pw.Column(  
51 - crossAxisAlignment: pw.CrossAxisAlignment.start,  
52 - children: <pw.Widget>[  
53 - pw.Text('Parnella Charlesbois',  
54 - textScaleFactor: 2,  
55 - style: pw.Theme.of(context)  
56 - .defaultTextStyle  
57 - .copyWith(fontWeight: pw.FontWeight.bold)),  
58 - pw.Padding(padding: const pw.EdgeInsets.only(top: 10)),  
59 - pw.Text('Electrotyper',  
60 - textScaleFactor: 1.2,  
61 - style: pw.Theme.of(context).defaultTextStyle.copyWith(  
62 - fontWeight: pw.FontWeight.bold, color: green)),  
63 - pw.Padding(padding: const pw.EdgeInsets.only(top: 20)),  
64 - pw.Row( 42 + doc.addPage(
  43 + pw.MultiPage(
  44 + pageTheme: pageTheme,
  45 + build: (pw.Context context) => [
  46 + pw.Partitions(
  47 + children: [
  48 + pw.Partition(
  49 + child: pw.Column(
  50 + crossAxisAlignment: pw.CrossAxisAlignment.start,
  51 + children: <pw.Widget>[
  52 + pw.Container(
  53 + padding: const pw.EdgeInsets.only(left: 30, bottom: 20),
  54 + child: pw.Column(
  55 + crossAxisAlignment: pw.CrossAxisAlignment.start,
  56 + children: <pw.Widget>[
  57 + pw.Text('Parnella Charlesbois',
  58 + textScaleFactor: 2,
  59 + style: pw.Theme.of(context)
  60 + .defaultTextStyle
  61 + .copyWith(fontWeight: pw.FontWeight.bold)),
  62 + pw.Padding(padding: const pw.EdgeInsets.only(top: 10)),
  63 + pw.Text('Electrotyper',
  64 + textScaleFactor: 1.2,
  65 + style: pw.Theme.of(context)
  66 + .defaultTextStyle
  67 + .copyWith(
  68 + fontWeight: pw.FontWeight.bold,
  69 + color: green)),
  70 + pw.Padding(padding: const pw.EdgeInsets.only(top: 20)),
  71 + pw.Row(
65 crossAxisAlignment: pw.CrossAxisAlignment.start, 72 crossAxisAlignment: pw.CrossAxisAlignment.start,
66 mainAxisAlignment: pw.MainAxisAlignment.spaceBetween, 73 mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
67 children: <pw.Widget>[ 74 children: <pw.Widget>[
68 pw.Column( 75 pw.Column(
69 - crossAxisAlignment: pw.CrossAxisAlignment.start,  
70 - children: <pw.Widget>[  
71 - pw.Text('568 Port Washington Road'),  
72 - pw.Text('Nordegg, AB T0M 2H0'),  
73 - pw.Text('Canada, ON'),  
74 - ]), 76 + crossAxisAlignment: pw.CrossAxisAlignment.start,
  77 + children: <pw.Widget>[
  78 + pw.Text('568 Port Washington Road'),
  79 + pw.Text('Nordegg, AB T0M 2H0'),
  80 + pw.Text('Canada, ON'),
  81 + ],
  82 + ),
75 pw.Column( 83 pw.Column(
76 - crossAxisAlignment: pw.CrossAxisAlignment.start,  
77 - children: <pw.Widget>[  
78 - pw.Text('+1 403-721-6898'),  
79 - _UrlText('p.charlesbois@yahoo.com',  
80 - 'mailto:p.charlesbois@yahoo.com'),  
81 - _UrlText('wholeprices.ca',  
82 - 'https://wholeprices.ca'),  
83 - ]), 84 + crossAxisAlignment: pw.CrossAxisAlignment.start,
  85 + children: <pw.Widget>[
  86 + pw.Text('+1 403-721-6898'),
  87 + _UrlText('p.charlesbois@yahoo.com',
  88 + 'mailto:p.charlesbois@yahoo.com'),
  89 + _UrlText(
  90 + 'wholeprices.ca', 'https://wholeprices.ca'),
  91 + ],
  92 + ),
84 pw.Padding(padding: pw.EdgeInsets.zero) 93 pw.Padding(padding: pw.EdgeInsets.zero)
85 - ]),  
86 - ])),  
87 - _Category(title: 'Work Experience'),  
88 - _Block(title: 'Tour bus driver'),  
89 - _Block(title: 'Logging equipment operator'),  
90 - _Block(title: 'Foot doctor'),  
91 - _Category(title: 'Education'),  
92 - _Block(title: 'Bachelor Of Commerce'),  
93 - _Block(title: 'Bachelor Interior Design'),  
94 - ])),  
95 - pw.Container(  
96 - height: double.infinity,  
97 - width: 2,  
98 - margin: const pw.EdgeInsets.symmetric(horizontal: 5),  
99 - color: green,  
100 - ),  
101 - pw.Column(  
102 - crossAxisAlignment: pw.CrossAxisAlignment.center,  
103 - mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,  
104 - children: <pw.Widget>[  
105 - pw.ClipOval(  
106 - child: pw.Container(  
107 - width: 100,  
108 - height: 100,  
109 - color: lightGreen,  
110 - child: pw.Image(profileImage), 94 + ],
  95 + ),
  96 + ],
  97 + ),
  98 + ),
  99 + _Category(title: 'Work Experience'),
  100 + _Block(title: 'Tour bus driver'),
  101 + _Block(title: 'Logging equipment operator'),
  102 + _Block(title: 'Foot doctor'),
  103 + _Block(title: 'Unicorn trainer'),
  104 + _Block(title: 'Chief chatter'),
  105 + pw.SizedBox(height: 20),
  106 + _Category(title: 'Education'),
  107 + _Block(title: 'Bachelor Of Commerce'),
  108 + _Block(title: 'Bachelor Interior Design'),
  109 + ],
  110 + ),
111 ), 111 ),
112 - ),  
113 - pw.Column(children: <pw.Widget>[  
114 - _Percent(size: 60, value: .7, title: pw.Text('Word')),  
115 - _Percent(size: 60, value: .4, title: pw.Text('Excel')),  
116 - ]),  
117 - pw.BarcodeWidget(  
118 - data: 'Parnella Charlesbois',  
119 - width: 60,  
120 - height: 60,  
121 - barcode: pw.Barcode.qrCode(),  
122 - ),  
123 - ],  
124 - )  
125 - ]),  
126 - )); 112 + pw.Partition(
  113 + width: sep,
  114 + child: pw.Column(
  115 + children: [
  116 + pw.Container(
  117 + height: pageTheme.pageFormat.availableHeight,
  118 + child: pw.Column(
  119 + crossAxisAlignment: pw.CrossAxisAlignment.center,
  120 + mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
  121 + children: <pw.Widget>[
  122 + pw.ClipOval(
  123 + child: pw.Container(
  124 + width: 100,
  125 + height: 100,
  126 + color: lightGreen,
  127 + child: pw.Image(profileImage),
  128 + ),
  129 + ),
  130 + pw.Column(children: <pw.Widget>[
  131 + _Percent(size: 60, value: .7, title: pw.Text('Word')),
  132 + _Percent(
  133 + size: 60, value: .4, title: pw.Text('Excel')),
  134 + ]),
  135 + pw.BarcodeWidget(
  136 + data: 'Parnella Charlesbois',
  137 + width: 60,
  138 + height: 60,
  139 + barcode: pw.Barcode.qrCode(),
  140 + ),
  141 + ],
  142 + ),
  143 + ),
  144 + ],
  145 + ),
  146 + )
  147 + ],
  148 + ),
  149 + ],
  150 + ),
  151 + );
127 return doc.save(); 152 return doc.save();
128 } 153 }
129 154
130 Future<pw.PageTheme> _myPageTheme(PdfPageFormat format) async { 155 Future<pw.PageTheme> _myPageTheme(PdfPageFormat format) async {
  156 + format = format.applyMargin(
  157 + left: 2.0 * PdfPageFormat.cm,
  158 + top: 4.0 * PdfPageFormat.cm,
  159 + right: 2.0 * PdfPageFormat.cm,
  160 + bottom: 2.0 * PdfPageFormat.cm);
131 return pw.PageTheme( 161 return pw.PageTheme(
132 - pageFormat: format.applyMargin(  
133 - left: 2.0 * PdfPageFormat.cm,  
134 - top: 4.0 * PdfPageFormat.cm,  
135 - right: 2.0 * PdfPageFormat.cm,  
136 - bottom: 2.0 * PdfPageFormat.cm), 162 + pageFormat: format,
137 theme: pw.ThemeData.withFont( 163 theme: pw.ThemeData.withFont(
138 base: pw.Font.ttf(await rootBundle.load('assets/open-sans.ttf')), 164 base: pw.Font.ttf(await rootBundle.load('assets/open-sans.ttf')),
139 bold: pw.Font.ttf(await rootBundle.load('assets/open-sans-bold.ttf')), 165 bold: pw.Font.ttf(await rootBundle.load('assets/open-sans-bold.ttf')),
@@ -173,7 +199,14 @@ Future<pw.PageTheme> _myPageTheme(PdfPageFormat format) async { @@ -173,7 +199,14 @@ Future<pw.PageTheme> _myPageTheme(PdfPageFormat format) async {
173 ..moveTo(size.x - 30, 0) 199 ..moveTo(size.x - 30, 0)
174 ..lineTo(size.x - 110, 50) 200 ..lineTo(size.x - 110, 50)
175 ..lineTo(size.x - 150, 0) 201 ..lineTo(size.x - 150, 0)
176 - ..fillPath(); 202 + ..fillPath()
  203 + ..setColor(green)
  204 + ..setLineWidth(2)
  205 + ..moveTo(
  206 + size.x - sep - format.marginRight + 4, format.marginBottom)
  207 + ..lineTo(size.x - sep - format.marginRight + 4,
  208 + size.y - format.marginTop)
  209 + ..strokePath();
177 }, 210 },
178 ), 211 ),
179 ); 212 );