David PHAM-VAN

Add support for Jpeg Images

@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 * Implement default fonts bounding box 6 * Implement default fonts bounding box
7 * Add Bézier Curve primitive 7 * Add Bézier Curve primitive
8 * Implement drawShape 8 * Implement drawShape
  9 +* Add support for Jpeg images
9 10
10 # 1.0.8 11 # 1.0.8
11 * Fix monospace TTF font loading 12 * Fix monospace TTF font loading
@@ -36,6 +36,9 @@ class PdfImage extends PdfXObject { @@ -36,6 +36,9 @@ class PdfImage extends PdfXObject {
36 /// Process alphaChannel only 36 /// Process alphaChannel only
37 final bool alphaChannel; 37 final bool alphaChannel;
38 38
  39 + /// The image data is a jpeg image
  40 + final bool jpeg;
  41 +
39 /// Creates a new [PdfImage] instance. 42 /// Creates a new [PdfImage] instance.
40 /// 43 ///
41 /// @param imgage an [Uint8List] value 44 /// @param imgage an [Uint8List] value
@@ -48,7 +51,8 @@ class PdfImage extends PdfXObject { @@ -48,7 +51,8 @@ class PdfImage extends PdfXObject {
48 @required this.width, 51 @required this.width,
49 @required this.height, 52 @required this.height,
50 this.alpha = true, 53 this.alpha = true,
51 - this.alphaChannel = false}) 54 + this.alphaChannel = false,
  55 + this.jpeg = false})
52 : assert(alphaChannel == false || alpha == true), 56 : assert(alphaChannel == false || alpha == true),
53 assert(width != null), 57 assert(width != null),
54 assert(height != null), 58 assert(height != null),
@@ -74,10 +78,21 @@ class PdfImage extends PdfXObject { @@ -74,10 +78,21 @@ class PdfImage extends PdfXObject {
74 } else { 78 } else {
75 params["/ColorSpace"] = PdfStream.string("/DeviceRGB"); 79 params["/ColorSpace"] = PdfStream.string("/DeviceRGB");
76 } 80 }
  81 +
  82 + if (jpeg) {
  83 + params["/Intent"] = PdfStream.string("/RelativeColorimetric");
  84 + }
77 } 85 }
78 86
79 @override 87 @override
80 void _prepare() { 88 void _prepare() {
  89 + if (jpeg) {
  90 + buf.putBytes(image);
  91 + params["/Filter"] = PdfStream.string("/DCTDecode");
  92 + super._prepare();
  93 + return;
  94 + }
  95 +
81 // write the pixels to the stream 96 // write the pixels to the stream
82 // print("Processing image ${img.width}x${img.height} pixels"); 97 // print("Processing image ${img.width}x${img.height} pixels");
83 98
@@ -41,7 +41,10 @@ class PdfObjectStream extends PdfObject { @@ -41,7 +41,10 @@ class PdfObjectStream extends PdfObject {
41 void _prepare() { 41 void _prepare() {
42 super._prepare(); 42 super._prepare();
43 43
44 - if (pdfDocument.deflate != null) { 44 + if (params.containsKey("/Filter")) {
  45 + // The data is already in the right format
  46 + _data = buf.output();
  47 + } else if (pdfDocument.deflate != null) {
45 _data = pdfDocument.deflate(buf.output()); 48 _data = pdfDocument.deflate(buf.output());
46 params["/Filter"] = PdfStream.string("/FlateDecode"); 49 params["/Filter"] = PdfStream.string("/FlateDecode");
47 } else if (isBinary) { 50 } else if (isBinary) {
  1 +import 'dart:io';
  2 +import 'dart:typed_data';
  3 +
  4 +import 'package:pdf/pdf.dart';
  5 +import "package:test/test.dart";
  6 +
  7 +Future<Uint8List> download(String url) async {
  8 + var client = HttpClient();
  9 + var request = await client.getUrl(Uri.parse(url));
  10 + var response = await request.close();
  11 + var builder = await response.fold(BytesBuilder(), (b, d) => b..add(d));
  12 + var data = builder.takeBytes();
  13 + return Uint8List.fromList(data);
  14 +}
  15 +
  16 +void main() {
  17 + test('Pdf1', () async {
  18 + var pdf = PdfDocument();
  19 + var page = PdfPage(pdf, pageFormat: PdfPageFormat.a4);
  20 +
  21 + var image = PdfImage(pdf,
  22 + image: await download("https://www.nfet.net/nfet.jpg"),
  23 + width: 472,
  24 + height: 477,
  25 + jpeg: true,
  26 + alpha: false);
  27 +
  28 + var g = page.getGraphics();
  29 + g.drawImage(image, 30.0, page.pageFormat.height - 507.0);
  30 +
  31 + var file = File('file4.pdf');
  32 + file.writeAsBytesSync(pdf.save());
  33 + });
  34 +}