Flutter PDF渲染插件pdf_platform_view的使用

Flutter PDF渲染插件pdf_platform_view的使用

功能概述

  • 支持Android和iOS平台。
  • 支持PDF文件的URL渲染。
  • 基于PlatformView构建。

示例代码

import 'dart:async';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:pdf_platform_view/pdf_platform_view.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(MaterialApp(
    title: 'Plugin example app',
    home: MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Plugin example app')),
      body: Center(
        child: TextButton(
          child: Text("打开PDF"),
          onPressed: () => Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => PDFScreen()),
          ),
        ),
      ),
    );
  }
}

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

class _PDFScreenState extends State<PDFScreen> {
  File? file;

  @override
  void initState() {
    super.initState();
    createFileOfPdfUrl().then((f) {
      setState(() {
        file = f;
      });
    });
  }

  Future<File> createFileOfPdfUrl() async {
    final url = "http://www.pdf995.com/samples/pdf.pdf";
    final filename = url.substring(url.lastIndexOf("/") + 1);
    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 = new File('$dir/$filename');
    await file.writeAsBytes(bytes);
    return file;
  }

  final _controller = PdfViewController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),

      body: file != null
          ? PdfView(
              file: file!,
              controller: _controller,
            )
          : Center(
              child: CircularProgressIndicator(),
            ),
    );
  }
}

代码解释

  1. 导入必要的库

    import 'dart:async';
    import 'dart:io';
    
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';
    import 'package:pdf_platform_view/pdf_platform_view.dart';
    import 'package:path_provider/path_provider.dart';
    
  2. 主应用入口

    void main() {
      runApp(MaterialApp(
        title: 'Plugin example app',
        home: MyApp(),
      ));
    }
    
  3. 创建主界面

    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => new _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text('Plugin example app')),
          body: Center(
            child: TextButton(
              child: Text("打开PDF"),
              onPressed: () => Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => PDFScreen()),
              ),
            ),
          ),
        );
      }
    }
    
  4. PDF查看界面

    class PDFScreen extends StatefulWidget {
      @override
      _PDFScreenState createState() => _PDFScreenState();
    }
    
    class _PDFScreenState extends State<PDFScreen> {
      File? file;
    
      @override
      void initState() {
        super.initState();
        createFileOfPdfUrl().then((f) {
          setState(() {
            file = f;
          });
        });
      }
    
      Future<File> createFileOfPdfUrl() async {
        final url = "http://www.pdf995.com/samples/pdf.pdf";
        final filename = url.substring(url.lastIndexOf("/") + 1);
        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 = new File('$dir/$filename');
        await file.writeAsBytes(bytes);
        return file;
      }
    
      final _controller = PdfViewController();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
    
          body: file != null
              ? PdfView(
                  file: file!,
                  controller: _controller,
                )
              : Center(
                  child: CircularProgressIndicator(),
                ),
        );
      }
    }
    

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

1 回复

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


pdf_platform_view 是一个用于在 Flutter 应用中渲染 PDF 文件的插件。它基于平台视图(Platform View)实现,允许在 Flutter 应用中嵌入原生的 PDF 渲染组件。以下是如何使用 pdf_platform_view 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 pdf_platform_view 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pdf_platform_view: ^latest_version

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

2. 导入插件

在你的 Dart 文件中导入 pdf_platform_view 插件:

import 'package:pdf_platform_view/pdf_platform_view.dart';

3. 使用 PdfPlatformView 组件

你可以使用 PdfPlatformView 组件来渲染 PDF 文件。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:pdf_platform_view/pdf_platform_view.dart';

class PdfViewerScreen extends StatelessWidget {
  final String pdfPath;

  PdfViewerScreen({required this.pdfPath});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: PdfPlatformView(
        params: PdfViewerParams(
          filePath: pdfPath,
        ),
      ),
    );
  }
}

4. 传递参数

PdfPlatformView 组件通过 PdfViewerParams 参数来配置 PDF 文件的路径和其他选项。PdfViewerParams 的主要参数包括:

  • filePath: PDF 文件的路径。
  • enableSwipe: 是否启用滑动翻页功能(默认为 true)。
  • enableZoom: 是否启用缩放功能(默认为 true)。
  • fitPolicy: 页面适应策略(默认为 FitPolicy.WIDTH)。

5. 处理 PDF 文件路径

你可以通过以下方式获取 PDF 文件的路径:

  • 从本地文件系统加载 PDF 文件。
  • 从网络下载 PDF 文件并保存到本地。

例如,从本地文件系统加载 PDF 文件:

String pdfPath = 'assets/sample.pdf';

6. 运行应用

确保你的应用已经正确配置了 PDF 文件路径,然后运行应用。你应该能够在屏幕上看到渲染的 PDF 文件。

7. 处理平台视图的限制

请注意,pdf_platform_view 是基于平台视图实现的,因此在某些情况下可能会遇到性能问题或兼容性问题。确保在使用时测试不同的设备和平台。

8. 处理异常

在加载 PDF 文件时,可能会遇到文件不存在或格式不正确的情况。建议在加载 PDF 文件时添加异常处理逻辑:

try {
  // 加载 PDF 文件
} catch (e) {
  // 处理异常
  print('Failed to load PDF: $e');
}

9. 自定义样式

你可以通过 PdfPlatformViewparams 参数自定义 PDF 渲染的样式,例如背景颜色、页面间距等。

10. 其他功能

pdf_platform_view 还支持其他功能,例如:

  • 跳转到指定页面。
  • 获取当前页面。
  • 监听页面变化。

你可以通过 PdfPlatformViewController 来实现这些功能。

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:pdf_platform_view/pdf_platform_view.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PdfViewerScreen(pdfPath: 'assets/sample.pdf'),
    );
  }
}

class PdfViewerScreen extends StatelessWidget {
  final String pdfPath;

  PdfViewerScreen({required this.pdfPath});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: PdfPlatformView(
        params: PdfViewerParams(
          filePath: pdfPath,
          enableSwipe: true,
          enableZoom: true,
          fitPolicy: FitPolicy.WIDTH,
        ),
      ),
    );
  }
}
回到顶部