Flutter PDF渲染插件pdf_flutter的使用
Flutter PDF渲染插件pdf_flutter的使用
受Pdf_Viewer_Plugin启发 😇
在Android上围绕AndroidPdfViewer包装。 🙏🏼
1. 在pubspec.yaml
中添加pdf_flutter
dependencies:
pdf_flutter: ^version
2. 在iOS上启用PDF预览
在ios/Runner/info.plist
中添加以下内容:
<key>io.flutter.embedded_views_preview</key>
<true/>
3. 开始使用
从网络加载PDF(缓存网络PDF)
PDF.network(
'https://raw.githubusercontent.com/FlutterInThai/Dart-for-Flutter-Sheet-cheet/master/Dart-for-Flutter-Cheat-Sheet.pdf',
height: 500,
width: 300,
)
加载文件中的PDF
File fileName;
PDF.file(
fileName,
height: 200,
width: 100,
)
从资产加载PDF
PDF.assets(
"assets/pdf/demo.pdf",
height: 200,
width: 100,
)
生产环境注意事项
修复步骤:
- 如果尚未存在,则添加
proguard-rules.pro
文件。 - 在
proguard-rules.pro
文件中添加以下内容:-keep class com.shockwave.** -keepclassmembers class com.shockwave.** { *; }
- 在
app/build.gradle
中添加以下内容:shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
Demo
以下是完整的示例代码:
示例代码:main.dart
import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:pdf_flutter/pdf_flutter.dart';
void main() => runApp(PdfApp());
class PdfApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: const Text("pdf_flutter demo"),
),
body: PDFListBody(),
));
}
}
class PDFListBody extends StatefulWidget {
[@override](/user/override)
_PDFListBodyState createState() => _PDFListBodyState();
}
class _PDFListBodyState extends State<PDFListBody> {
[@override](/user/override)
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 按钮1:从资产加载PDF
RaisedButton(
child: const Text("Pdf from asset"),
onPressed: () {
_navigateToPage(
title: "Pdf from asset",
child: PDF.asset(
"assets/pdf/demo.pdf", // 替换为实际的PDF资源路径
placeHolder: Image.asset("assets/images/pdf.png",
height: 200, width: 100), // 占位符图片
),
);
},
),
// 按钮2:从网络加载PDF
RaisedButton(
child: const Text("Pdf from network"),
onPressed: () {
_navigateToPage(
title: "Pdf from networkUrl",
child: PDF.network(
'https://google-developer-training.github.io/android-developer-fundamentals-course-concepts/en/android-developer-fundamentals-course-concepts-en.pdf', // 网络PDF链接
),
);
},
),
// 按钮3:从文件加载PDF
Builder(
builder: (context) {
return RaisedButton(
child: const Text("PDF from file"),
onPressed: () async {
final file = await FilePicker.platform.pickFiles(
allowedExtensions: ['pdf'], type: FileType.custom);
if (file?.files[0]?.path != null) {
_navigateToPage(
title: "PDF from file",
child: PDF.file(
File(file.files[0].path), // 文件路径
),
);
} else {
Scaffold.of(context).showSnackBar(
const SnackBar(
content: Text("Failed to load Picked file"),
),
);
}
},
);
},
)
],
),
);
}
// 跳转到新页面
void _navigateToPage({String title, Widget child}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Scaffold(
appBar: AppBar(title: Text(title)),
body: Center(child: child),
),
),
);
}
}
更多关于Flutter PDF渲染插件pdf_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
pdf_flutter
是一个用于在 Flutter 应用中渲染 PDF 文件的插件。它基于 flutter_pdfview
和 pdf_render
等库,提供了一种简单的方式来在应用中显示 PDF 文档。以下是如何使用 pdf_flutter
插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 pdf_flutter
插件的依赖:
dependencies:
flutter:
sdk: flutter
pdf_flutter: ^2.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 pdf_flutter
包:
import 'package:pdf_flutter/pdf_flutter.dart';
3. 使用 PDFView 组件
pdf_flutter
提供了一个 PDF.asset
、PDF.network
和 PDF.file
组件,用于从不同来源加载和显示 PDF 文件。
从 Assets 加载 PDF
假设你有一个 PDF 文件放在 assets
目录下,首先需要在 pubspec.yaml
中声明该文件:
flutter:
assets:
- assets/sample.pdf
然后在代码中使用 PDF.asset
来加载和显示 PDF:
class MyPdfViewer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PDF Viewer'),
),
body: PDF.asset(
'assets/sample.pdf',
height: double.infinity,
width: double.infinity,
placeHolder: Center(child: CircularProgressIndicator()),
),
);
}
}
从网络加载 PDF
你也可以从网络加载 PDF 文件:
class MyPdfViewer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PDF Viewer'),
),
body: PDF.network(
'https://example.com/sample.pdf',
height: double.infinity,
width: double.infinity,
placeHolder: Center(child: CircularProgressIndicator()),
),
);
}
}
从文件加载 PDF
如果你有一个本地的 PDF 文件,可以使用 PDF.file
来加载:
class MyPdfViewer extends StatelessWidget {
final File file;
MyPdfViewer({required this.file});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('PDF Viewer'),
),
body: PDF.file(
file,
height: double.infinity,
width: double.infinity,
placeHolder: Center(child: CircularProgressIndicator()),
),
);
}
}
4. 自定义 PDF 视图
pdf_flutter
提供了一些可选参数来自定义 PDF 视图的行为和外观:
height
和width
: 设置 PDF 视图的高度和宽度。placeHolder
: 在 PDF 加载时显示的占位符组件。onError
: 当 PDF 加载失败时调用的回调函数。onPageChanged
: 当 PDF 页面变化时调用的回调函数。enableSwipe
: 是否允许通过滑动手势切换页面。
5. 处理错误
你可以通过 onError
参数来处理 PDF 加载失败的情况:
PDF.network(
'https://example.com/sample.pdf',
onError: (error) {
print('Error loading PDF: $error');
},
);
6. 处理页面变化
你可以通过 onPageChanged
参数来监听 PDF 页面的变化:
PDF.network(
'https://example.com/sample.pdf',
onPageChanged: (int page, int total) {
print('Page changed: $page / $total');
},
);
7. 禁用滑动手势
如果你不希望用户通过滑动手势切换页面,可以将 enableSwipe
设置为 false
:
PDF.network(
'https://example.com/sample.pdf',
enableSwipe: false,
);