1. 插件介绍

fluttertpc_flutter_pdfview 是一个专为 Flutter 应用开发的 PDF 文档查看插件,特别适配了鸿蒙(HarmonyOS)平台。该插件基于 flutter_pdfview@1.3.3 版本进行鸿蒙化适配,允许开发者在 Flutter 应用中轻松实现 PDF 文档的加载、渲染和交互功能。

在这里插入图片描述

主要功能特点:

  • 支持本地 PDF 文件加载
  • 支持远程 PDF 文件下载与显示
  • 提供页面导航、缩放、翻页等基本 PDF 浏览功能
  • 支持密码保护的 PDF 文档
  • 提供丰富的回调事件(页面加载完成、翻页、错误处理等)
  • 支持自定义 PDF 视图的各种属性

2. 如何使用插件

2.1 包的引入

由于这是一个专为鸿蒙平台适配的自定义修改版本,需要通过 Git 形式引入依赖。在项目的 pubspec.yaml 文件中添加以下配置:

dependencies:
  flutter:
    sdk: flutter
  flutter_pdfview_ohos:
    git:
      url: https://gitcode.com/openharmony-sig/fluttertpc_flutter_pdfview.git
      path: ohos
  path_provider:
    git:
      url: https://gitcode.com/openharmony-tpc/flutter_packages.git
      path: packages/path_provider/path_provider

添加依赖后,执行以下命令获取包:

flutter pub get

2.2 导入并使用插件

在 Dart 代码中导入插件:

import 'package:flutter_pdfview_ohos/flutter_pdfview_ohos.dart';

3. API 的调用

3.1 基本用法示例

下面是一个完整的示例,展示如何加载并显示 PDF 文件:

import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter_pdfview_ohos/flutter_pdfview_ohos.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'PDF Viewer Example',
      home: PDFScreen(),
    );
  }
}

class PDFScreen extends StatefulWidget {
  
  _PDFScreenState createState() => _PDFScreenState();
}

class _PDFScreenState extends State<PDFScreen> {
  String? pathPDF;
  final Completer<PDFViewController> _controller = Completer<PDFViewController>();
  int? pages = 0;
  int? currentPage = 0;
  bool isReady = false;
  String errorMessage = '';

  
  void initState() {
    super.initState();
    // 从 assets 复制 PDF 文件到应用目录
    fromAsset('assets/sample.pdf', 'sample.pdf').then((file) {
      setState(() {
        pathPDF = file.path;
      });
    });
  }

  // 从 assets 复制文件到应用目录
  Future<File> fromAsset(String asset, String filename) async {
    Completer<File> completer = Completer();
    try {
      var dir = await getApplicationDocumentsDirectory();
      File file = File("${dir.path}/$filename");
      var data = await rootBundle.load(asset);
      var bytes = data.buffer.asUint8List();
      await file.writeAsBytes(bytes, flush: true);
      completer.complete(file);
    } catch (e) {
      throw Exception('Error loading PDF asset!');
    }
    return completer.future;
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("PDF 查看器"),
      ),
      body: pathPDF != null
          ? Stack(
              children: <Widget>[
                PDFView(
                  filePath: pathPDF,
                  enableSwipe: true,
                  defaultPage: currentPage!, // 默认显示的页面
                  fitPolicy: FitPolicy.WIDTH, // 自适应宽度
                  onRender: (_pages) {
                    // PDF 渲染完成回调
                    setState(() {
                      pages = _pages;
                      isReady = true;
                    });
                  },
                  onError: (error) {
                    // 加载错误回调
                    setState(() {
                      errorMessage = error.toString();
                    });
                  },
                  onPageError: (page, error) {
                    // 页面加载错误回调
                    setState(() {
                      errorMessage = '$page: ${error.toString()}';
                    });
                  },
                  onViewCreated: (PDFViewController pdfViewController) {
                    // PDF 视图创建完成回调
                    _controller.complete(pdfViewController);
                  },
                  onPageChanged: (int? page, int? total) {
                    // 页面切换回调
                    setState(() {
                      currentPage = page;
                    });
                  },
                ),
                // 加载状态指示器
                !isReady
                    ? Center(
                        child: CircularProgressIndicator(),
                      )
                    : Container(),
                // 错误信息显示
                errorMessage.isNotEmpty
                    ? Center(
                        child: Text(errorMessage),
                      )
                    : Container()
              ],
            )
          : Center(
              child: CircularProgressIndicator(),
            ),
      // PDF 控制器示例
      floatingActionButton: FutureBuilder<PDFViewController>(
        future: _controller.future,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return FloatingActionButton.extended(
              label: Text("跳转到第 ${pages! ~/ 2} 页"),
              onPressed: () async {
                // 使用控制器跳转到指定页面
                await snapshot.data!.setPage(pages! ~/ 2);
              },
            );
          }
          return Container();
        },
      ),
    );
  }
}

3.2 核心 API 说明

3.2.1 PDFView 组件属性
属性名 描述 类型 鸿蒙支持情况
filePath PDF 文件路径 String?
enableSwipe 是否启用滑动翻页 bool
defaultPage 默认显示的页面 int
fitPolicy PDF 自适应策略 FitPolicy
password PDF 文档密码 String?
preventLinkNavigation 是否阻止链接导航 bool
onRender PDF 渲染完成回调 Function(int?)
onError 加载错误回调 Function(dynamic)
onPageError 页面加载错误回调 Function(int?, dynamic)
onViewCreated 视图创建完成回调 Function(PDFViewController)
onPageChanged 页面切换回调 Function(int?, int?)
3.2.2 PDFViewController 控制器方法
方法名 描述 参数 返回值
getPageCount 获取总页数 - Future<int?>
getCurrentPage 获取当前页码 - Future<int?>
setPage 跳转到指定页面 int page Future<bool?>

3.3 鸿蒙平台已知限制

需要注意的是,鸿蒙平台上的实现与其他平台相比有一些限制:

  • 不支持直接通过 pdfData 加载二进制 PDF 数据
  • swipeHorizontal 属性在鸿蒙平台上无效
  • nightMode 属性在鸿蒙平台上无效
  • autoSpacing 属性在鸿蒙平台上无效
  • pageFlingpageSnap 属性在鸿蒙平台上无效

4. 总结

fluttertpc_flutter_pdfview 是一个功能强大的 PDF 查看插件,经过鸿蒙平台适配后,能够满足 Flutter 应用在鸿蒙设备上的 PDF 文档浏览需求。通过简单的配置和 API 调用,开发者可以轻松实现专业的 PDF 查看功能。

虽然在鸿蒙平台上存在一些功能限制,但核心的 PDF 浏览功能都已得到支持,足以满足大多数应用场景的需求。随着鸿蒙生态的不断发展,这些限制也有望在未来的版本中得到解决。

5. 加入社区

欢迎加入开源鸿蒙跨平台社区,与更多开发者交流学习:

https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐