字节笔记本

2026年2月22日

flutter_ios_doc_scanner:Flutter iOS 文档扫描插件

本文介绍 flutter_ios_doc_scanner,一个 Flutter iOS 文档扫描插件。该项目封装了 iOS 原生的文档扫描功能,让 Flutter 开发者能够轻松集成文档扫描能力到应用中。

项目简介

flutter_ios_doc_scanner 是一个开源的 Flutter 插件项目,由 Dhaval Patel 开发维护。该插件基于 iOS VisionKit 框架的 VNDocumentCameraViewController 实现,提供了原生的文档扫描体验。截至目前,该项目在 GitHub 上已获得 3 stars,采用 MIT 许可证开源。

核心特性

  • 原生 iOS 文档扫描:基于 VisionKit 框架,提供与 iOS 原生一致的扫描体验
  • 多页扫描支持:支持连续扫描多页文档
  • 自动边缘检测:自动识别文档边缘并进行透视校正
  • 图片输出:扫描结果以图片文件路径列表形式返回
  • Flutter 无缝集成:通过 Platform Channel 与 Flutter 框架通信

技术栈

  • Swift (38.7%) - iOS 原生插件实现
  • Dart (38.2%) - Flutter 端 API 封装
  • Ruby (17.2%) - CocoaPods 配置
  • Objective-C (5.9%) - 桥接代码

安装指南

前置要求

  • Flutter SDK >= 2.0
  • iOS 13.0+(VisionKit 要求)
  • Xcode 11+

安装步骤

pubspec.yaml 中添加依赖:

yaml
dependencies:
  flutter_ios_doc_scanner: ^0.0.1

然后运行:

bash
flutter pub get

iOS 配置

确保 ios/Podfile 中平台版本不低于 13.0:

ruby
platform :ios, '13.0'

使用示例

基础用法

dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_ios_doc_scanner/flutter_ios_doc_scanner.dart';

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<String> _filePaths;
  final _plugin = FlutterIOSDocScanner();
  bool _processing = false;
  PlatformException _exception;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('文档扫描示例'),
        ),
        body: Column(
          children: [
            if (_processing == false)
              FlatButton(
                onPressed: () async {
                  setState(() => _processing = true);
                  try {
                    final files = await _plugin.pickDocument("");
                    setState(() {
                      _filePaths = files;
                    });
                  } on PlatformException catch (e) {
                    setState(() {
                      _exception = e;
                    });
                  }
                  setState(() => _processing = false);
                },
                child: Text('扫描文档'),
              )
            else
              Center(child: CircularProgressIndicator()),
            if (_exception != null) ...[
              Text('错误'),
              Text(_exception.code),
              Text(_exception.message)
            ],
            if (_filePaths != null)
              Expanded(
                child: ListView.builder(
                  itemCount: _filePaths.length,
                  itemBuilder: (context, index) => Image.file(
                    File(_filePaths[index].replaceFirst('file://', ''))
                  )
                )
              )
          ],
        ),
      ),
    );
  }
}

API 参考

FlutterIOSDocScanner

pickDocument

启动文档扫描器并返回扫描结果。

dart
Future<List<String>> pickDocument(String title)
参数类型必填说明
titleString扫描界面标题

返回值:扫描生成的图片文件路径列表(file:// 协议)

注意事项

  1. iOS 版本限制:该插件仅支持 iOS 13.0+,因为 VisionKit 的 VNDocumentCameraViewController 在此版本引入
  2. 真机测试:文档扫描功能需要在真机上测试,模拟器不支持
  3. 权限配置:需要在 Info.plist 中添加相机权限说明:
    xml
    <key>NSCameraUsageDescription</key>
    <string>需要相机权限来扫描文档</string>

项目链接

分享: