flutter多图像选择和插入PDF表仅插入最后一个列表
我是Flutter的新手,我正在使用Image_picker软件包选择多个图像并将其插入PDF表中。我能够根据所需的行数获取图像并列出列表,但是当创建PDF时,行是正确的,但仅反复显示嵌套列表中的最后一个列表。我的代码如下。有什么建议吗?
页面从位置加载的
class imagecollager extends StatefulWidget {
@override
_imagecollagerState createState() => _imagecollagerState();
}
class _imagecollagerState extends State<imagecollager> {
String pdfFile = '';
final ImagePicker imagePicker = ImagePicker();
List<XFile>? imageFileList = [];
int numbofcol = 3;// Number of column in Row
int numbofpgs =1; // number of pages
var numboflist = 0; // number of rows
List imagelist=[];
List<List> imagedata=[];
List<XFile>? selectedImages =[];
String selimages = "";
var imagefilestart=0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () async {
selectImages();
},
child: Text('Load Image')),
Text(selimages),
TextButton(
onPressed: () async {
sortImages();
},
child: Text('Create a Pdf')),
],
),
),
);
}
void selectImages() async {
imageFileList!.clear();
selectedImages = await imagePicker.pickMultiImage();
if (selectedImages!.isNotEmpty) {
imageFileList!.addAll(selectedImages!);
}
setState(() {
});
setState(() {
selimages = imageFileList!.length.toString();
imagefilestart=0;
});
}
void sortImages() async {
imagedata.clear();
numboflist=(imageFileList!.length/numbofcol).ceil(); //
for (var row = 0; row < numboflist; row++) {
imagelist.clear();
for (var j = 0; j < numbofcol; j++) {
File imageFile = File(imageFileList![imagefilestart].path);
Uint8List imageRaw = await imageFile.readAsBytes();
imagelist.add(imageRaw);
imagefilestart= imagefilestart+1 ;
if(imagefilestart==imageFileList!.length) break ;
}
imagedata.insert(row, imagelist);
}
final pdfFile = await PdfApi.generateImage(imagedata);
PdfApi.openFile(pdfFile);
}
}
PDF处理代码如下
class PdfApi {
static Future<File> generateCenteredText(String text) async {
final pdf = Document();
pdf.addPage(Page(
build: (context) => Center(
child: Text(text, style: const TextStyle(fontSize: 48)),
),
));
return saveDocument(name: 'my_example.pdf', pdf: pdf);
}
static Future<File> generateImage( var imagedata) async {
final pdf = Document();
final pageTheme = PageTheme(
pageFormat: PdfPageFormat.a4,
);
pdf.addPage(
MultiPage(
pageTheme: pageTheme,
build: (context) => [
for (var i = 0; i < imagedata.length; i++)
Table(
border: TableBorder.all(
color: PdfColors.black,
//style: BorderStyle.solid,
width: 0.5,
),
children: [
TableRow(children: [
//for(var item in imagedata[i] )
for (var j = 0; j < imagedata[i].length; j++)
Image(MemoryImage(imagedata[i][j]),
)
]),
],
),
]
)
);
return saveDocument(name: 'my_example.pdf', pdf: pdf);
}
static Future<File> saveDocument({
required String name,
required Document pdf,
}) async {
final bytes = await pdf.save();
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$name');
await file.writeAsBytes(bytes);
return file;
}
static Future openFile(File file) async {
final url = file.path;
await OpenFile.open(url);
}
}
I am new to flutter and I am in process of making an app to select multiple images using image_picker package and inserting it into the pdf table. I am able to get the images and make a list based on the number of rows required, however when the pdf is created, the rows are correct but only the last list in the nested lists is displayed repeatedly. My code is as below. Any suggestions?
Page from where images are loaded
class imagecollager extends StatefulWidget {
@override
_imagecollagerState createState() => _imagecollagerState();
}
class _imagecollagerState extends State<imagecollager> {
String pdfFile = '';
final ImagePicker imagePicker = ImagePicker();
List<XFile>? imageFileList = [];
int numbofcol = 3;// Number of column in Row
int numbofpgs =1; // number of pages
var numboflist = 0; // number of rows
List imagelist=[];
List<List> imagedata=[];
List<XFile>? selectedImages =[];
String selimages = "";
var imagefilestart=0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () async {
selectImages();
},
child: Text('Load Image')),
Text(selimages),
TextButton(
onPressed: () async {
sortImages();
},
child: Text('Create a Pdf')),
],
),
),
);
}
void selectImages() async {
imageFileList!.clear();
selectedImages = await imagePicker.pickMultiImage();
if (selectedImages!.isNotEmpty) {
imageFileList!.addAll(selectedImages!);
}
setState(() {
});
setState(() {
selimages = imageFileList!.length.toString();
imagefilestart=0;
});
}
void sortImages() async {
imagedata.clear();
numboflist=(imageFileList!.length/numbofcol).ceil(); //
for (var row = 0; row < numboflist; row++) {
imagelist.clear();
for (var j = 0; j < numbofcol; j++) {
File imageFile = File(imageFileList![imagefilestart].path);
Uint8List imageRaw = await imageFile.readAsBytes();
imagelist.add(imageRaw);
imagefilestart= imagefilestart+1 ;
if(imagefilestart==imageFileList!.length) break ;
}
imagedata.insert(row, imagelist);
}
final pdfFile = await PdfApi.generateImage(imagedata);
PdfApi.openFile(pdfFile);
}
}
Pdf processing code as below
class PdfApi {
static Future<File> generateCenteredText(String text) async {
final pdf = Document();
pdf.addPage(Page(
build: (context) => Center(
child: Text(text, style: const TextStyle(fontSize: 48)),
),
));
return saveDocument(name: 'my_example.pdf', pdf: pdf);
}
static Future<File> generateImage( var imagedata) async {
final pdf = Document();
final pageTheme = PageTheme(
pageFormat: PdfPageFormat.a4,
);
pdf.addPage(
MultiPage(
pageTheme: pageTheme,
build: (context) => [
for (var i = 0; i < imagedata.length; i++)
Table(
border: TableBorder.all(
color: PdfColors.black,
//style: BorderStyle.solid,
width: 0.5,
),
children: [
TableRow(children: [
//for(var item in imagedata[i] )
for (var j = 0; j < imagedata[i].length; j++)
Image(MemoryImage(imagedata[i][j]),
)
]),
],
),
]
)
);
return saveDocument(name: 'my_example.pdf', pdf: pdf);
}
static Future<File> saveDocument({
required String name,
required Document pdf,
}) async {
final bytes = await pdf.save();
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$name');
await file.writeAsBytes(bytes);
return file;
}
static Future openFile(File file) async {
final url = file.path;
await OpenFile.open(url);
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为,当我尝试清除循环清单时,这是一个引用问题。当我将下面更改
为时,
它开始根据需要工作。
I think it was a referencing issue when I try to clear a list in loop. When I changed the below
to
it started to work as required.