Flutter PDF缩略图生成插件pdf_thumbnail的使用
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
并实现 read
和 write
方法。
这里是一个简单的示例,使用 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
更多关于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(),
],
);
}
}
解释
- 依赖管理:在
pubspec.yaml
文件中添加pdf_thumbnail
依赖。 - 应用结构:创建一个简单的 Flutter 应用,包含一个生成缩略图的按钮(尽管示例中是在
initState
中自动生成的)。 - 获取 PDF 文件:使用
path_provider
插件获取应用的文档目录,并假设 PDF 文件sample.pdf
已经存在于该目录中。 - 生成缩略图:调用
PdfThumbnail.generateThumbnails
方法生成指定页面的缩略图。 - 保存和显示缩略图:将生成的缩略图保存为 PNG 文件,并在 UI 中显示它们。
确保你已经有一个名为 sample.pdf
的文件存在于应用的文档目录中,或者根据需要修改代码以加载不同的 PDF 文件。