flutter多图像选择和插入PDF表仅插入最后一个列表

发布于 2025-02-13 08:46:27 字数 4012 浏览 1 评论 0原文

我是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光无声 2025-02-20 08:46:27

我认为,当我尝试清除循环清单时,这是一个引用问题。当我将下面更改

imagelist.clear();

为时,

imagelist=[];

它开始根据需要工作。

I think it was a referencing issue when I try to clear a list in loop. When I changed the below

imagelist.clear();

to

imagelist=[];

it started to work as required.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文