David PHAM-VAN

Add more image loading functions

... ... @@ -14,6 +14,7 @@
- Improve image buffer management
- Optimize memory footprint
- Add an exception if a jpeg image is not a supported format
- Add more image loading functions
## 1.5.0
... ...
... ... @@ -49,15 +49,13 @@ pdf.addPage(pw.Page(
})); // Page
```
To load an image it is possible to use the dart library [image](https://pub.dev/packages/image):
To load an image from a file:
```dart
final img = decodeImage(File('test.webp').readAsBytesSync());
final image = PdfImage(
final img = decodeImage();
final image = PdfImage.file(
pdf.document,
image: img.data.buffer.asUint8List(),
width: img.width,
height: img.height,
bytes: File('test.webp').readAsBytesSync(),
);
pdf.addPage(pw.Page(
... ...
... ... @@ -22,6 +22,7 @@ import 'dart:math' as math;
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:image/image.dart' as im;
import 'package:meta/meta.dart';
import 'package:utf/utf.dart';
import 'package:vector_math/vector_math_64.dart';
... ...
... ... @@ -41,6 +41,8 @@ class PdfImage extends PdfXObject {
bool alpha = true,
PdfImageOrientation orientation = PdfImageOrientation.topLeft,
}) {
assert(image != null);
final PdfImage im = PdfImage._(
pdfDocument,
width,
... ... @@ -107,6 +109,42 @@ class PdfImage extends PdfXObject {
return im;
}
factory PdfImage.fromImage(
PdfDocument pdfDocument, {
@required im.Image image,
PdfImageOrientation orientation = PdfImageOrientation.topLeft,
}) {
assert(image != null);
return PdfImage(
pdfDocument,
image: image.getBytes(format: im.Format.rgba),
width: image.width,
height: image.height,
alpha: image.channels == im.Channels.rgba,
orientation: orientation,
);
}
factory PdfImage.file(
PdfDocument pdfDocument, {
@required Uint8List bytes,
PdfImageOrientation orientation = PdfImageOrientation.topLeft,
}) {
assert(bytes != null);
if (im.JpegDecoder().isValidFile(bytes)) {
return PdfImage.jpeg(pdfDocument, image: bytes);
}
final im.Image image = im.decodeImage(bytes);
return PdfImage.fromImage(
pdfDocument,
image: image,
orientation: orientation,
);
}
factory PdfImage._alpha(
PdfDocument pdfDocument,
Uint8List image,
... ...
... ... @@ -17,6 +17,7 @@ dependencies:
archive: ^2.0.10
qr: ^1.2.0
barcode: ^1.5.0
image: ^2.1.4
dev_dependencies:
test:
... ...
... ... @@ -84,6 +84,34 @@ void main() {
);
});
test('Pdf Image decode', () {
final Iterable<Widget> imageWidgets = imageFiles.map<Widget>(
(String image) => SizedBox(
child: Image(
PdfImage.file(
pdf.document,
bytes: gzip.decode(base64.decode(image)),
),
),
width: 200,
height: 200,
),
);
pdf.addPage(
Page(
build: (Context context) => Center(
child: Wrap(
spacing: 20,
runSpacing: 20,
alignment: WrapAlignment.spaceEvenly,
children: imageWidgets.toList(),
),
),
),
);
});
tearDownAll(() {
final File file = File('jpeg.pdf');
file.writeAsBytesSync(pdf.save());
... ... @@ -110,3 +138,9 @@ const List<String> images = <String>[
'/9j/4AAQSkZJRgABAQEA3ADcAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAABwAAAAAAAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAwAFADASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAkI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDVIAAAAAAAJVgAqoAAACVYAKqAAlWAAAAAAAAAAAD/2Q==',
'/9j/4AAQSkZJRgABAQEA3ADcAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAACAAAAAAAAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAwAFADASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAkI/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDKgAAAAAAAAAKqAAAAlWACqgAJVgAqoAAAAAAACVYAP//Z',
];
const List<String> imageFiles = <String>[
'H4sIAKx0cl4AA/t/4/8DBgEvN083BkZGRgYPIGT4f5vBmeE/pQBoCCPFhhxgEORgUGQwYmZUYmASZGQWZPx/hEEM7FQUwMgEFBcVQBdmEAQJY6hmAJkiIoguyvD/FgMPMyPQImZBBnuGVU0LGLS1GpoaVqiyCi1lm8gY4iDK4MAYwMDA/v8mAIKohPQ4AQAA',
'H4sIAAV2cl4AA+sM8HPn5ZLiYmBg4PX0cAkC0kZArMjBBCRF5PMvAylTTxfHkIjDb88ZMjIYcDAoxP5XM9vcsvrBS0bOEy+7quPmLFmKDrZ+Yjx0ienafeXk7UADGDxd/VzWOSU0AQCMWbgebgAAAA==',
'H4sIAFZ2cl4AA3P3dLMwTzRiUGRoYGDIXCUJRDoMQAASYWBSb+lfefot/+I5W251b7635zd/2yOPac86l706te0d9/FPPte/9T7/de41K4M1ANAWLyFIAAAA'
];
... ...
No preview for this file type