PdfImage需要 Uint8List 作为参数,但是我有 ImageProvider 。那么,如何在抖动中将图像转换为uint8list?
var imageProvider = AssetImage('assets/test.jpg');
final image = PdfImage(
pdf.document,
image:???, /// Uint8List required
width: img.width,
height: img.height,
);
答案 0 :(得分:1)
使用rootBundle.load()
(await rootBundle.load(/*YOUR IMAGE PATH HERE*/)).buffer.asUint8List()
由于load()
是异步操作,因此您需要等待直到数据完全加载。在此之前,尝试用一些加载指示器替换UI。
ByteData imageData;
@override
void initState() {
rootBundle.load('assets/test.jpg')
.then((data) => setState(() => this.imageData = data));
}
@override
Widget build(BuildContext context) {
if (imageData == null) {
return Center(child: CircularProgressIndicator());
}
final image = PdfImage(
pdf.document,
image: imageData.buffer.asUint8List(),
width: img.width,
height: img.height,
);
...
}
答案 1 :(得分:0)
如果愿意,可以将initState分为两个:
@override
void initState() {
loadAsset('test.jpg');
}
void loadAsset(string name) async {
var data = await rootBundle.load('assets/$name');
setState(() => this.imageData = data);
}
请注意,这将导致build()额外运行,但我发现它更容易使用。使用迈克尔的圆形指示器,这是一个无害的额外周期。
答案 2 :(得分:0)
在Flutter中,将本地图像附加到pdf文件。 实际上,将本地图像添加到pdf文件是一种简单的解决方案。 只需复制粘贴以下代码,然后尝试
final ByteData bytes = await rootBundle.load('assets/logo.jpg');
final Uint8List list = bytes.buffer.asUint8List();
final image = PdfImage.file(
pdf.document,
bytes: list,
);
pdf.addPage(pw.Page(build: (pw.Context context) {
return pw.Center(
child: pw.Image(image),
); // Center
}));