Toggle navigation
Toggle navigation
This project
Loading...
Sign in
flutter_package
/
dart_pdf
Go to a project
Toggle navigation
Projects
Groups
Snippets
Help
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
David PHAM-VAN
2019-11-02 15:17:54 -0400
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
11fbc854675759683623f8c5bcf574e7c3a82753
11fbc854
1 parent
6b0c6db8
Update Web example
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
339 additions
and
34 deletions
pdf/CHANGELOG.md
pdf/web_example/pubspec.yaml
pdf/web_example/web/calendar.dart
pdf/web_example/web/index.html
pdf/web_example/web/main.dart
pdf/web_example/web/styles.css
pdf/CHANGELOG.md
View file @
11fbc85
...
...
@@ -2,6 +2,7 @@
## 1.3.24
-
Update Web example
-
Add more color functions
-
Fix Pdf format
-
Fix warning in tests
...
...
pdf/web_example/pubspec.yaml
View file @
11fbc85
...
...
@@ -8,6 +8,7 @@ environment:
dependencies
:
pdf
:
intl
:
dependency_overrides
:
pdf
:
...
...
pdf/web_example/web/calendar.dart
0 → 100644
View file @
11fbc85
/*
* Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import
'package:intl/intl.dart'
;
import
'package:pdf/pdf.dart'
;
import
'package:pdf/widgets.dart'
;
class
Calendar
extends
StatelessWidget
{
Calendar
({
this
.
date
,
this
.
month
,
this
.
year
,
});
final
DateTime
date
;
final
int
month
;
final
int
year
;
Widget
title
(
Context
context
,
DateTime
date
,
)
{
return
Container
(
width:
double
.
infinity
,
child:
Text
(
DateFormat
.
yMMMM
().
format
(
date
),
style:
const
TextStyle
(
color:
PdfColors
.
deepPurple
,
fontSize:
40
,
),
),
);
}
Widget
header
(
Context
context
,
DateTime
date
,
)
{
return
Container
(
color:
PdfColors
.
blue200
,
padding:
const
EdgeInsets
.
all
(
8.0
),
child:
Text
(
DateFormat
.
EEEE
().
format
(
date
),
style:
const
TextStyle
(
fontSize:
15
,
),
),
);
}
Widget
day
(
Context
context
,
DateTime
date
,
bool
currentMonth
,
bool
currentDay
,
)
{
String
text
=
'
${date.day}
'
;
TextStyle
style
=
const
TextStyle
();
PdfColor
color
=
PdfColors
.
grey300
;
if
(
currentDay
)
{
style
=
TextStyle
(
color:
PdfColors
.
red
);
color
=
PdfColors
.
lightBlue50
;
}
if
(!
currentMonth
)
{
style
=
TextStyle
(
color:
PdfColors
.
grey
);
color
=
PdfColors
.
grey100
;
}
if
(
date
.
day
==
1
)
{
text
+=
' '
+
DateFormat
.
MMM
().
format
(
date
);
}
return
Container
(
padding:
const
EdgeInsets
.
all
(
4
),
color:
color
,
child:
Text
(
text
,
textAlign:
TextAlign
.
right
,
style:
style
,
),
);
}
@override
Widget
build
(
Context
context
)
{
final
DateTime
_date
=
date
??
DateTime
.
now
();
final
int
_year
=
year
??
_date
.
year
;
final
int
_month
=
month
??
_date
.
month
;
final
DateTime
start
=
DateTime
(
_year
,
_month
,
1
,
12
);
final
DateTime
end
=
DateTime
(
_year
,
_month
+
1
,
1
,
12
).
subtract
(
const
Duration
(
days:
1
),
);
final
int
startId
=
start
.
weekday
-
1
;
final
int
endId
=
end
.
difference
(
start
).
inDays
+
startId
+
1
;
final
Row
head
=
Row
(
mainAxisSize:
MainAxisSize
.
max
,
children:
List
<
Widget
>.
generate
(
7
,
(
int
index
)
{
final
DateTime
d
=
start
.
add
(
Duration
(
days:
index
-
startId
));
return
Expanded
(
child:
Container
(
foregroundDecoration:
BoxDecoration
(
border:
BoxBorder
(
color:
PdfColors
.
black
,
top:
true
,
left:
true
,
right:
index
%
7
==
6
,
bottom:
true
,
),
),
child:
header
(
context
,
d
),
),
);
}),
);
final
GridView
body
=
GridView
(
crossAxisCount:
7
,
children:
List
<
Widget
>.
generate
(
42
,
(
int
index
)
{
final
DateTime
d
=
start
.
add
(
Duration
(
days:
index
-
startId
));
final
bool
currentMonth
=
index
>=
startId
&&
index
<
endId
;
final
bool
currentDay
=
d
.
year
==
_date
.
year
&&
d
.
month
==
_date
.
month
&&
d
.
day
==
_date
.
day
;
return
Container
(
foregroundDecoration:
BoxDecoration
(
border:
BoxBorder
(
color:
PdfColors
.
black
,
left:
true
,
right:
index
%
7
==
6
,
bottom:
true
,
),
),
child:
day
(
context
,
d
,
currentMonth
,
currentDay
),
);
}),
);
return
Container
(
padding:
const
EdgeInsets
.
all
(
20
),
child:
Column
(
mainAxisAlignment:
MainAxisAlignment
.
start
,
mainAxisSize:
MainAxisSize
.
min
,
children:
<
Widget
>[
title
(
context
,
DateTime
(
_year
,
_month
)),
head
,
Flexible
(
flex:
1
,
child:
body
),
],
),
);
}
}
...
...
pdf/web_example/web/index.html
View file @
11fbc85
...
...
@@ -8,17 +8,87 @@
<meta
name=
"viewport"
content=
"width=device-width, initial-scale=1.0"
>
<title>
Pdf Web Example
</title>
<link
rel=
"stylesheet"
href=
"styles.css"
>
<script
defer
src=
"main.dart.js"
></script>
<script
src=
"https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.3.200/pdf.min.js"
></script>
<script
src=
"main.dart.js"
></script>
<script>
async
function
displayPdf
(
pdf
)
{
let
doc
=
await
pdfjsLib
.
getDocument
(
pdf
).
promise
;
document
.
getElementById
(
'page_count'
).
innerText
=
doc
.
numPages
;
let
metadata
=
await
doc
.
getMetadata
();
let
title
=
metadata
.
info
.
Title
||
'Untitled'
;
document
.
getElementById
(
'title'
).
innerText
=
title
;
document
.
title
=
title
;
let
author
=
metadata
.
info
.
Author
||
''
;
let
producer
=
metadata
.
info
.
Producer
||
''
;
document
.
getElementById
(
'author'
).
innerText
=
author
+
' | '
+
producer
;
let
currentPage
=
1
;
document
.
getElementById
(
'prev'
).
addEventListener
(
'click'
,
()
=>
{
if
(
currentPage
<=
1
)
{
return
;
}
currentPage
--
;
renderPage
(
doc
,
currentPage
);
});
document
.
getElementById
(
'next'
).
addEventListener
(
'click'
,
()
=>
{
if
(
currentPage
>=
doc
.
numPages
)
{
return
;
}
currentPage
++
;
renderPage
(
doc
,
currentPage
);
});
renderPage
(
doc
,
currentPage
);
}
async
function
renderPage
(
doc
,
pageNum
)
{
document
.
getElementById
(
'page_num'
).
innerText
=
pageNum
;
let
page
=
await
doc
.
getPage
(
pageNum
);
let
viewport
=
page
.
getViewport
({
scale
:
1
});
let
canvas
=
document
.
getElementById
(
'container'
);
canvas
.
width
=
viewport
.
width
;
canvas
.
height
=
viewport
.
height
;
let
renderContext
=
{
canvasContext
:
canvas
.
getContext
(
'2d'
),
viewport
:
viewport
};
await
page
.
render
(
renderContext
).
promise
;
document
.
getElementById
(
'toolbar-loading'
).
style
.
display
=
'none'
;
document
.
getElementById
(
'toolbar-content'
).
style
.
display
=
''
;
document
.
getElementById
(
'container'
).
style
.
display
=
''
;
document
.
getElementById
(
'author'
).
style
.
display
=
''
;
}
function
ready
()
{
// Dart is fully loaded
let
pdf
=
buildPdf
();
displayPdf
(
pdf
);
};
</script>
</head>
<body>
<div>
<button
id=
"generate"
>
Generate
</button>
<div
class=
"toolbar"
>
<div
id=
"toolbar-loading"
>
Loading ...
</div>
<div
id=
"toolbar-content"
style=
"display:none;"
>
<button
id=
"prev"
>
Previous
</button>
<button
id=
"next"
>
Next
</button>
<span>
Page:
<span
id=
"page_num"
></span>
/
<span
id=
"page_count"
></span></span>
<span
id=
"title"
></span>
</div>
<div
id=
"container"
>
<object
id=
"doc"
type=
"application/pdf"
></object>
</div>
<canvas
id=
"container"
style=
"display:none;"
></canvas>
<div
id=
"author"
style=
"display:none;"
></div>
</body>
</html>
...
...
pdf/web_example/web/main.dart
View file @
11fbc85
import
'dart:convert'
;
/*
* Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import
'dart:async'
;
import
'dart:html'
;
import
'dart:js'
as
js
;
import
'dart:typed_data'
;
import
'package:pdf/pdf.dart'
;
import
'package:pdf/widgets.dart'
;
void
main
(
)
{
final
ButtonElement
generateButton
=
querySelector
(
'#generate'
);
import
'calendar.dart'
;
generateButton
.
onClick
.
listen
((
_
)
async
{
final
String
data
=
Uri
.
encodeComponent
(
base64
.
encode
(
buildPdf
()));
Uint8List
buildPdf
(
)
{
final
Document
pdf
=
Document
(
title:
'My Document'
,
author:
'David PHAM-VAN'
);
final
ObjectElement
doc
=
querySelector
(
'#doc'
);
doc
.
data
=
'data:application/pdf;base64,
$data
'
;
});
}
List
<
int
>
buildPdf
()
{
final
Document
pdf
=
Document
();
pdf
.
addPage
(
Page
(
build:
(
Context
ctx
)
{
pdf
.
addPage
(
Page
(
build:
(
Context
ctx
)
{
return
Container
(
width:
double
.
infinity
,
height:
double
.
infinity
,
...
...
@@ -29,7 +39,33 @@ List<int> buildPdf() {
),
),
);
}));
},
));
pdf
.
addPage
(
Page
(
pageFormat:
PdfPageFormat
.
a4
.
landscape
,
build:
(
Context
context
)
=>
Calendar
(),
));
return
pdf
.
save
();
pdf
.
addPage
(
Page
(
pageFormat:
PdfPageFormat
.
a4
.
landscape
,
build:
(
Context
context
)
=>
Calendar
(
month:
DateTime
.
now
().
month
+
1
,
),
));
pdf
.
addPage
(
Page
(
build:
(
Context
ctx
)
{
return
Center
(
child:
PdfLogo
());
},
));
return
Uint8List
.
fromList
(
pdf
.
save
());
}
void
main
(
)
{
js
.
context
[
'buildPdf'
]
=
buildPdf
;
Timer
.
run
(()
{
js
.
context
.
callMethod
(
'ready'
);
});
}
...
...
pdf/web_example/web/styles.css
View file @
11fbc85
...
...
@@ -10,18 +10,44 @@ body {
}
#container
{
left
:
10px
;
right
:
10px
;
width
:
auto
;
bottom
:
10px
;
top
:
49px
;
display
:
block
;
position
:
absolute
;
border
:
1px
dotted
red
;
border
:
1px
solid
rgb
(
37
,
37
,
37
);
box-shadow
:
3px
3px
5px
rgb
(
129
,
129
,
129
);
margin
:
20px
;
}
#doc
{
width
:
100%
;
height
:
100%
;
display
:
block
;
.toolbar
{
background-color
:
rgb
(
82
,
82
,
82
);
padding
:
10px
;
color
:
#fff
;
}
button
{
height
:
50px
;
width
:
100px
;
background-color
:
#5cb8ff
;
border
:
1px
solid
#4f90ff
;
display
:
inline-block
;
cursor
:
pointer
;
color
:
#ffffff
;
font-size
:
17px
;
}
button
:hover
{
background-color
:
#2688ff
;
}
button
:active
{
background-color
:
#1a64be
;
}
#title
{
margin-left
:
2rem
;
font-size
:
1.8em
;
}
#author
{
margin-left
:
20px
;
margin-bottom
:
20px
;
color
:
rgb
(
65
,
72
,
77
);
font-size
:
0.7em
;
}
...
...
Please
register
or
login
to post a comment