Flutter PDF渲染插件pdf_flutter的使用

Flutter PDF渲染插件pdf_flutter的使用

pub package

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,
)

生产环境注意事项

修复步骤:

  1. 如果尚未存在,则添加proguard-rules.pro文件。
  2. proguard-rules.pro文件中添加以下内容:
    -keep class com.shockwave.**
    -keepclassmembers class com.shockwave.** { *; }
  3. 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),
        ),
      ),
    );
  }
}
1 回复

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


pdf_flutter 是一个用于在 Flutter 应用中渲染 PDF 文件的插件。它基于 flutter_pdfviewpdf_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.assetPDF.networkPDF.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 视图的行为和外观:

  • heightwidth: 设置 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,
);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!