Flutter PDF文本提取插件pdf_text的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter PDF文本提取插件pdf_text的使用

插件简介

pdf_text 是一个用于Flutter的插件,允许你读取PDF文档的文本内容并将其转换为字符串。它在iOS上使用Apple的PDFKit,在Android上使用Apache的PdfBox Android移植版本。该插件支持iOS和Android平台。

Demo Example App

开始使用

添加依赖

首先,在你的项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  pdf_text: ^0.5.0

然后运行flutter pub get来安装依赖。

导入包

在你的Dart代码中导入pdf_text包:

import 'package:pdf_text/pdf_text.dart';

使用方法

创建PDF文档实例

你可以通过File对象、路径字符串或URL字符串创建一个PDF文档实例:

  • 使用File对象:

    PDFDoc doc = await PDFDoc.fromFile(file);
    
  • 使用路径字符串:

    PDFDoc doc = await PDFDoc.fromPath(path);
    
  • 使用URL字符串:

    PDFDoc doc = await PDFDoc.fromURL(url);
    

对于加密的PDF文档,可以通过传递密码来解密:

PDFDoc doc = await PDFDoc.fromFile(file, password: password);

读取整个文档的文本

要读取整个文档的文本内容,可以使用以下代码:

String docText = await doc.text;

获取文档页数

要获取文档的总页数,可以使用以下代码:

int numPages = doc.length;

访问文档中的某一页

要访问文档中的某一页,可以使用以下代码:

PDFPage page = doc.pageAt(pageNumber);

读取某一页的文本

要读取某一页的文本内容,可以使用以下代码:

String pageText = await page.text;

获取文档信息

要获取文档的信息(如作者、标题等),可以使用以下代码:

PDFDocInfo info = doc.info;

删除文件

如果你不再需要某个PDF文档的文件,可以删除它:

doc.deleteFile();

或者删除所有从外部导入的PDF文档的文件:

PDFDoc.deleteAllExternalFiles();

示例代码

以下是一个完整的示例应用程序,展示了如何使用pdf_text插件:

import 'dart:math';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:pdf_text/pdf_text.dart';

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  PDFDoc? _pdfDoc;
  String _text = "";

  bool _buttonsEnabled = true;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('PDF Text Example'),
        ),
        body: Container(
          alignment: Alignment.center,
          padding: EdgeInsets.all(10),
          child: ListView(
            children: <Widget>[
              TextButton(
                child: Text(
                  "Pick PDF document",
                  style: TextStyle(color: Colors.white),
                ),
                style: TextButton.styleFrom(
                    padding: EdgeInsets.all(5),
                    backgroundColor: Colors.blueAccent),
                onPressed: _pickPDFText,
              ),
              TextButton(
                child: Text(
                  "Read random page",
                  style: TextStyle(color: Colors.white),
                ),
                style: TextButton.styleFrom(
                    padding: EdgeInsets.all(5),
                    backgroundColor: Colors.blueAccent),
                onPressed: _buttonsEnabled ? _readRandomPage : () {},
              ),
              TextButton(
                child: Text(
                  "Read whole document",
                  style: TextStyle(color: Colors.white),
                ),
                style: TextButton.styleFrom(
                    padding: EdgeInsets.all(5),
                    backgroundColor: Colors.blueAccent),
                onPressed: _buttonsEnabled ? _readWholeDoc : () {},
              ),
              Padding(
                child: Text(
                  _pdfDoc == null
                      ? "Pick a new PDF document and wait for it to load..."
                      : "PDF document loaded, ${_pdfDoc!.length} pages\n",
                  style: TextStyle(fontSize: 18),
                  textAlign: TextAlign.center,
                ),
                padding: EdgeInsets.all(15),
              ),
              Padding(
                child: Text(
                  _text == "" ? "" : "Text:",
                  style: TextStyle(fontSize: 18),
                  textAlign: TextAlign.center,
                ),
                padding: EdgeInsets.all(15),
              ),
              Text(_text),
            ],
          ),
        ),
      ),
    );
  }

  /// 挑选一个新的PDF文档
  Future _pickPDFText() async {
    var filePickerResult = await FilePicker.platform.pickFiles();
    if (filePickerResult != null) {
      _pdfDoc = await PDFDoc.fromPath(filePickerResult.files.single.path!);
      setState(() {});
    }
  }

  /// 读取随机页面
  Future _readRandomPage() async {
    if (_pdfDoc == null) {
      return;
    }
    setState(() {
      _buttonsEnabled = false;
    });

    String text =
        await _pdfDoc!.pageAt(Random().nextInt(_pdfDoc!.length) + 1).text;

    setState(() {
      _text = text;
      _buttonsEnabled = true;
    });
  }

  /// 读取整个文档
  Future _readWholeDoc() async {
    if (_pdfDoc == null) {
      return;
    }
    setState(() {
      _buttonsEnabled = false;
    });

    String text = await _pdfDoc!.text;

    setState(() {
      _text = text;
      _buttonsEnabled = true;
    });
  }
}

这个示例应用程序提供了一个简单的用户界面,允许用户选择PDF文件,并从中读取随机页面或整个文档的文本内容。

公共方法

以下是pdf_text插件提供的公共方法:

PDFDoc类的方法

返回类型 方法描述
PDFPage pageAt(int pageNumber) 获取指定页码的页面
static Future<PDFDoc> fromFile(File file, {String password = ""}) 使用File对象创建PDFDoc实例,可选参数为密码
static Future<PDFDoc> fromPath(String path, {String password = ""}) 使用文件路径创建PDFDoc实例,可选参数为密码
static Future<PDFDoc> fromURL(String url, {String password = ""}) 使用URL创建PDFDoc实例,可选参数为密码
void deleteFile() 删除与PDFDoc相关的文件,如果无法删除则抛出异常
static Future deleteAllExternalFiles() 删除所有从外部导入的PDF文档的文件

对象结构

以下是pdf_text插件中涉及的对象结构:

class PDFDoc {
  int length; // 文档页数
  List<PDFPage> pages; // 文档页面列表
  PDFDocInfo info; // 文档信息
  Future<String> text; // 文档文本内容
}

class PDFPage {
  int number; // 页面编号
  Future<String> text; // 页面文本内容
}

class PDFDocInfo {
  String author; // 文档作者
  List<String> authors; // 文档作者列表
  DateTime creationDate; // 文档创建日期
  DateTime modificationDate; // 文档修改日期
  String creator; // 文档创建者
  String producer; // 文档生成器
  List<String> keywords; // 文档关键字
  String title; // 文档标题
  String subject; // 文档主题
}

贡献

如果你有任何建议、改进或问题,请随时贡献到这个项目。你可以提交新问题或提出拉取请求。请将拉取请求提交到dev分支。


希望这些信息对你有帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter PDF文本提取插件pdf_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter PDF文本提取插件pdf_text的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用pdf_text插件来提取PDF文本的一个详细示例。这个示例包括如何在Flutter项目中添加依赖、加载PDF文件以及提取文本内容。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加pdf_text插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pdf_text: ^x.y.z  # 请将x.y.z替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 编写代码

接下来,我们编写代码来加载PDF文件并提取文本。

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:pdf_text/pdf_text.dart';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('PDF Text Extraction'),
        ),
        body: Center(
          child: PdfTextExtractionExample(),
        ),
      ),
    );
  }
}

class PdfTextExtractionExample extends StatefulWidget {
  @override
  _PdfTextExtractionExampleState createState() => _PdfTextExtractionExampleState();
}

class _PdfTextExtractionExampleState extends State<PdfTextExtractionExample> {
  String extractedText = "";

  void _extractTextFromPdf() async {
    // 假设你有一个PDF文件在应用的assets目录中
    final ByteData byteData = await rootBundle.load('assets/sample.pdf');
    final Uint8List pdfBytes = byteData.buffer.asUint8List();

    try {
      final String result = await PdfText.extractTextFromPdf(pdfBytes);
      setState(() {
        extractedText = result;
      });
    } catch (e) {
      print("Error extracting text: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextButton(
          onPressed: _extractTextFromPdf,
          child: Text('Extract Text from PDF'),
        ),
        if (extractedText.isNotEmpty)
          Text(
            'Extracted Text:\n$extractedText',
            style: TextStyle(fontSize: 16),
            maxLines: 10,
            overflow: TextOverflow.ellipsis,
          ),
      ],
    );
  }
}

添加PDF文件到assets

确保你已经在pubspec.yaml中声明了assets目录,并将你的PDF文件(例如sample.pdf)放在assets文件夹中。

flutter:
  assets:
    - assets/sample.pdf

3. 运行应用

现在,你可以运行你的Flutter应用。点击按钮后,应用将从PDF文件中提取文本并显示在屏幕上。

注意事项

  • 确保你的PDF文件路径正确,并且文件已经正确放置在assets文件夹中。
  • pdf_text插件可能会在处理某些复杂的PDF文件时遇到限制或错误,因此建议在实际应用中添加适当的错误处理。
  • 如果你使用的是iOS,请确保你已经配置了iOS的assets目录,并且PDF文件已经包含在Xcode项目中。

以上就是在Flutter项目中使用pdf_text插件来提取PDF文本的一个基本示例。希望这对你有所帮助!

回到顶部