Flutter PDF缩略图生成插件pdf_thumbnail的使用

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

Flutter PDF缩略图生成插件pdf_thumbnail的使用

安装 💻

为了开始使用 Pdf Thumbnail,您必须在您的机器上安装 Flutter SDK。

pubspec.yaml 文件中添加 pdf_thumbnail

dependencies:
  pdf_thumbnail:

然后运行以下命令来安装它:

flutter packages get

示例 ✍️

以下是使用 pdf_thumbnail 插件生成 PDF 缩略图的示例代码:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf_thumbnail/pdf_thumbnail.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'PDF Thumbnail Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Future<File> pdfFile;

  var currentPage = 0;

  [@override](/user/override)
  void initState() {
    pdfFile = DownloadService.downloadFile(pdfUrl, 'sample.pdf');
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        elevation: 0,
      ),
      body: FutureBuilder<File>(
          future: pdfFile,
          builder: (context, snapshot) {
            return Center(
              child: snapshot.hasData
                  ? PdfThumbnail.fromFile(
                      snapshot.data!.path,
                      currentPage: currentPage,
                      backgroundColor: Theme.of(context).primaryColor.withOpacity(0.3),
                      height: 200,

                      /// 显示页码的 widget。
                      /// 这个 widget 将会放在堆栈中。
                      currentPageWidget: (page, isCurrentPage) {
                        return Positioned(
                          bottom: 50,
                          right: 0,
                          child: Container(
                            height: 30,
                            width: 30,
                            color: isCurrentPage ? Colors.green : Colors.pink,
                            alignment: Alignment.center,
                            child: Text(
                              '$page',
                              style: const TextStyle(
                                color: Colors.white,
                                fontSize: 20,
                                fontWeight: FontWeight.bold,
                              ),
                            ),
                          ),
                        );
                      },

                      /// 自定义装饰以便高亮当前页面。
                      currentPageDecoration: const BoxDecoration(
                        color: Colors.white,
                        border: Border(
                          bottom: BorderSide(
                            color: Colors.orange,
                            width: 10,
                          ),
                        ),
                      ),
                      onPageClicked: (page) {
                        /// 您可以更新当前页面,
                        /// 或者使用大多数 PDF 查看器包的控制器来跳转到该页面。
                        /// 例如:_controller.setPage(page);
                        setState(() {
                          currentPage = page + 1;
                        });
                        if (kDebugMode) {
                          print('Page $page clicked');
                        }
                      },
                    )
                  : const CircularProgressIndicator(),
            );
          }),
    );
  }
}

const pdfUrl = 'https://icseindia.org/document/sample.pdf';

class DownloadService {
  static final _httpClient = HttpClient();

  static Future<File> downloadFile(String url, String filename) async {
    var request = await _httpClient.getUrl(Uri.parse(url));
    var response = await request.close();
    var bytes = await consolidateHttpClientResponseBytes(response);
    String dir = (await getApplicationDocumentsDirectory()).path;
    File file = File('$dir/$filename');
    await file.writeAsBytes(bytes);
    return file;
  }
}

缓存 ⏲

pdf_thumbnail 包没有内置缓存机制,以保持包的简单性。您可以自己创建一个类从 ImageThumbnailCacher 并实现 readwrite 方法。

这里是一个简单的示例,使用 Hive 来缓存:

class ThumbnailCacher implements ImageThumbnailCacher {
  [@override](/user/override)
  Future<PageToImage?> read(String id) async {
    // 读取缓存逻辑
    return api.localStorage.readThumbnails(id);
  }

  [@override](/user/override)
  Future<bool> write({required String id, required PageToImage map}) {
    // 写入缓存逻辑
    return api.localStorage.writeThumbnails(id: id, map: map);
  }
}

更多关于Flutter PDF缩略图生成插件pdf_thumbnail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter PDF缩略图生成插件pdf_thumbnail的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 pdf_thumbnail 插件在 Flutter 中生成 PDF 缩略图的代码示例。这个插件允许你从 PDF 文件中提取页面缩略图。

首先,确保你已经在 pubspec.yaml 文件中添加了 pdf_thumbnail 依赖:

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

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

以下是一个完整的 Flutter 应用示例,展示如何使用 pdf_thumbnail 插件生成 PDF 缩略图:

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:pdf_thumbnail/pdf_thumbnail.dart';

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

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

class PdfThumbnailExample extends StatefulWidget {
  @override
  _PdfThumbnailExampleState createState() => _PdfThumbnailExampleState();
}

class _PdfThumbnailExampleState extends State<PdfThumbnailExample> {
  List<File> _thumbnails = [];

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

  Future<void> _generateThumbnails() async {
    // 获取应用的文档目录
    final Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;

    // 假设你有一个名为 'sample.pdf' 的 PDF 文件在应用的文档目录中
    File pdfFile = File('$appDocPath/sample.pdf');

    // 确保 PDF 文件存在
    if (await pdfFile.exists()) {
      // 生成缩略图
      List<Uint8List> thumbnails = await PdfThumbnail.generateThumbnails(pdfFile.path, pageNumbers: [1, 2, 3]);

      // 将缩略图保存为文件
      List<File> thumbnailFiles = thumbnails.map((thumbnailData) {
        String thumbnailPath = '$appDocPath/thumbnail_${thumbnails.indexOf(thumbnailData) + 1}.png';
        File thumbnailFile = File(thumbnailPath);
        thumbnailFile.writeAsBytesSync(thumbnailData);
        return thumbnailFile;
      }).toList();

      // 更新状态
      setState(() {
        _thumbnails = thumbnailFiles;
      });
    } else {
      print('PDF file does not exist.');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        if (_thumbnails.isNotEmpty)
          GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 3,
              crossAxisSpacing: 4.0,
              mainAxisSpacing: 4.0,
            ),
            itemCount: _thumbnails.length,
            itemBuilder: (BuildContext context, int index) {
              return Image.file(_thumbnails[index]);
            },
          ),
        else
          CircularProgressIndicator(),
      ],
    );
  }
}

解释

  1. 依赖管理:在 pubspec.yaml 文件中添加 pdf_thumbnail 依赖。
  2. 应用结构:创建一个简单的 Flutter 应用,包含一个生成缩略图的按钮(尽管示例中是在 initState 中自动生成的)。
  3. 获取 PDF 文件:使用 path_provider 插件获取应用的文档目录,并假设 PDF 文件 sample.pdf 已经存在于该目录中。
  4. 生成缩略图:调用 PdfThumbnail.generateThumbnails 方法生成指定页面的缩略图。
  5. 保存和显示缩略图:将生成的缩略图保存为 PNG 文件,并在 UI 中显示它们。

确保你已经有一个名为 sample.pdf 的文件存在于应用的文档目录中,或者根据需要修改代码以加载不同的 PDF 文件。

回到顶部