[{"data":1,"prerenderedAt":27},["ShallowReactive",2],{"articolo-scanner-di-documenti-in-flutter-con-cunning-document-scanner":3,"comments-article-scanner-di-documenti-in-flutter-con-cunning-document-scanner":26},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"cover_remote_url":10,"cover_credit":11,"video_url":15,"status":16,"published_at":17,"meta_title":18,"meta_description":19,"category":20,"author":24},61,"Scanner di documenti in Flutter con cunning_document_scanner","scanner-di-documenti-in-flutter-con-cunning-document-scanner","Impara a integrare uno scanner di documenti nativo nelle tue app Flutter: rilevamento automatico dei bordi, ritaglio prospettico e generazione di PDF con cunning_document_scanner.","## Perché uno scanner di documenti?\n\nMolte app moderne - dalle utility per l'ufficio ai gestionali fino alle piattaforme fintech - hanno bisogno di acquisire documenti cartacei: fatture, contratti, ricevute, carte d'identità. Fotografare un foglio con la fotocamera standard produce quasi sempre immagini storte, con bordi tagliati e prospettiva deformata. Uno scanner dedicato risolve il problema rilevando automaticamente i bordi del documento, correggendo la prospettiva e restituendo un'immagine pulita e leggibile.\n\nIn questo articolo vedremo come integrare la funzionalità di scansione documenti in Flutter usando il pacchetto `cunning_document_scanner`, che si appoggia alle API native di Android (ML Kit Document Scanner) e iOS (VisionKit), garantendo un'esperienza fluida e di qualità professionale con poche righe di codice.\n\n## Installazione\n\nAggiungi la dipendenza al tuo `pubspec.yaml`:\n\n```yaml\ndependencies:\n  cunning_document_scanner: ^1.2.3\n```\n\nEsegui poi il classico comando:\n\n```bash\nflutter pub get\n```\n\n### Configurazione Android\n\nIl pacchetto richiede un `minSdkVersion` di almeno 21. Verifica nel file `android\u002Fapp\u002Fbuild.gradle`:\n\n```gradle\ndefaultConfig {\n    minSdkVersion 21\n}\n```\n\nLo scanner utilizza il modulo Google Play Services per ML Kit, quindi assicurati che il dispositivo abbia i Google Play Services aggiornati.\n\n### Configurazione iOS\n\nSu iOS devi dichiarare il motivo dell'accesso alla fotocamera nel file `ios\u002FRunner\u002FInfo.plist`:\n\n```xml\n\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n\u003Cstring>L'app usa la fotocamera per scansionare documenti\u003C\u002Fstring>\n```\n\nLo scanner richiede iOS 13 o superiore, poiché si basa su VisionKit.\n\n## Utilizzo di base\n\nL'API è volutamente minimale. Il metodo principale `CunningDocumentScanner.getPictures()` apre l'interfaccia nativa di scansione e restituisce una lista di percorsi ai file delle immagini acquisite:\n\n```dart\nimport 'package:cunning_document_scanner\u002Fcunning_document_scanner.dart';\n\nFuture\u003CList\u003CString>?> scansionaDocumenti() async {\n  try {\n    final List\u003CString>? immagini = await CunningDocumentScanner.getPictures(\n      noOfPages: 5,      \u002F\u002F numero massimo di pagine acquisibili\n      isGalleryImportAllowed: true, \u002F\u002F consenti import dalla galleria\n    );\n    return immagini;\n  } catch (e) {\n    debugPrint('Errore durante la scansione: $e');\n    return null;\n  }\n}\n```\n\nOgni elemento della lista è il path di un file immagine (JPEG) già ritagliato e corretto prospetticamente dallo scanner nativo.\n\n## Un widget completo\n\nVediamo un esempio pratico che avvia lo scanner e mostra le immagini acquisite in una griglia:\n\n```dart\nimport 'dart:io';\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:cunning_document_scanner\u002Fcunning_document_scanner.dart';\n\nclass ScannerPage extends StatefulWidget {\n  const ScannerPage({super.key});\n\n  @override\n  State\u003CScannerPage> createState() => _ScannerPageState();\n}\n\nclass _ScannerPageState extends State\u003CScannerPage> {\n  List\u003CString> _paths = [];\n  bool _loading = false;\n\n  Future\u003Cvoid> _avviaScansione() async {\n    setState(() => _loading = true);\n    try {\n      final risultato = await CunningDocumentScanner.getPictures(\n        noOfPages: 10,\n        isGalleryImportAllowed: true,\n      );\n      if (risultato != null) {\n        setState(() => _paths = risultato);\n      }\n    } catch (e) {\n      if (mounted) {\n        ScaffoldMessenger.of(context).showSnackBar(\n          SnackBar(content: Text('Errore: $e')),\n        );\n      }\n    } finally {\n      if (mounted) setState(() => _loading = false);\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: const Text('Scanner documenti')),\n      floatingActionButton: FloatingActionButton.extended(\n        onPressed: _loading ? null : _avviaScansione,\n        icon: const Icon(Icons.document_scanner),\n        label: const Text('Scansiona'),\n      ),\n      body: _loading\n          ? const Center(child: CircularProgressIndicator())\n          : _paths.isEmpty\n              ? const Center(child: Text('Nessun documento acquisito'))\n              : GridView.builder(\n                  padding: const EdgeInsets.all(8),\n                  gridDelegate:\n                      const SliverGridDelegateWithFixedCrossAxisCount(\n                    crossAxisCount: 2,\n                    childAspectRatio: 0.7,\n                    crossAxisSpacing: 8,\n                    mainAxisSpacing: 8,\n                  ),\n                  itemCount: _paths.length,\n                  itemBuilder: (context, index) {\n                    return ClipRRect(\n                      borderRadius: BorderRadius.circular(8),\n                      child: Image.file(\n                        File(_paths[index]),\n                        fit: BoxFit.cover,\n                      ),\n                    );\n                  },\n                ),\n    );\n  }\n}\n```\n\n## Generare un PDF dalle scansioni\n\nUno degli usi più comuni è esportare le pagine acquisite in un unico file PDF. Possiamo combinare `cunning_document_scanner` con il pacchetto `pdf`:\n\n```yaml\ndependencies:\n  pdf: ^3.10.8\n  path_provider: ^2.1.2\n```\n\nEcco la funzione per assemblare le immagini in un PDF:\n\n```dart\nimport 'dart:io';\nimport 'package:pdf\u002Fpdf.dart';\nimport 'package:pdf\u002Fwidgets.dart' as pw;\nimport 'package:path_provider\u002Fpath_provider.dart';\n\nFuture\u003CFile> creaPdf(List\u003CString> percorsiImmagini) async {\n  final pdf = pw.Document();\n\n  for (final percorso in percorsiImmagini) {\n    final bytes = await File(percorso).readAsBytes();\n    final immagine = pw.MemoryImage(bytes);\n    pdf.addPage(\n      pw.Page(\n        pageFormat: PdfPageFormat.a4,\n        build: (context) => pw.Center(\n          child: pw.Image(immagine, fit: pw.BoxFit.contain),\n        ),\n      ),\n    );\n  }\n\n  final dir = await getApplicationDocumentsDirectory();\n  final file = File('${dir.path}\u002Fdocumento_scansionato.pdf');\n  await file.writeAsBytes(await pdf.save());\n  return file;\n}\n```\n\nA questo punto puoi condividere il PDF con `share_plus` o caricarlo su un server.\n\n## Buone pratiche\n\n- **Gestisci sempre le eccezioni**: l'utente può annullare la scansione, e in tal caso `getPictures()` potrebbe lanciare un'eccezione o restituire `null`. Prevedi entrambi i casi.\n- **Pulizia dei file temporanei**: le immagini vengono salvate nella cache del sistema. Se ne generi molte, valuta di eliminarle dopo l'elaborazione per non riempire lo spazio del dispositivo.\n- **Controlla i permessi runtime**: anche se il pacchetto gestisce l'apertura della fotocamera, su alcuni dispositivi Android conviene verificare i permessi con `permission_handler` per evitare fallimenti silenziosi.\n- **Feedback all'utente**: mostra sempre un indicatore di caricamento e messaggi chiari in caso di errore, perché l'apertura dell'interfaccia nativa può richiedere qualche istante.\n\n## Conclusioni\n\nCon `cunning_document_scanner` puoi aggiungere una funzionalità di scansione documenti di livello professionale alla tua app Flutter senza scrivere codice nativo. Il rilevamento automatico dei bordi e la correzione prospettica sono gestiti dalle API native di ML Kit e VisionKit, mentre l'integrazione con il pacchetto `pdf` ti permette di produrre file pronti da archiviare o condividere. Una combinazione ideale per gestionali, app di produttività e soluzioni documentali.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F8926f088-7df4-4721-b76a-72c4c443bb3d.jpg","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1702753389740-32bace4ab050?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3w5NzA2NTJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE3ODczMTIxMDd8&ixlib=rb-4.1.0&q=80&w=1080",{"name":12,"author_url":13,"photo_url":14},"Afonso Azevedo Neves","https:\u002F\u002Funsplash.com\u002F@ofotografoportugues","https:\u002F\u002Funsplash.com\u002Fphotos\u002Fa-close-up-of-an-open-book-on-a-table-qOgflUHvfiY",null,"published","2026-08-09T04:00:46+00:00","Scanner documenti in Flutter con cunning_document_scanner","Guida pratica per aggiungere uno scanner di documenti in Flutter: rilevamento bordi, correzione prospettica ed export in PDF con poche righe di codice.",{"id":21,"name":22,"slug":23},1,"Guide","guide",{"id":21,"name":25},"Flutter Bot",[],1789205513841]