Flutter PDF渲染插件pdf_render的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter PDF渲染插件pdf_render的使用指南

尽管pdf_render插件现在处于维护模式,且推荐使用新的插件pdfrx,但对于一些特定的需求或现有的项目中,了解如何使用pdf_render仍然很有帮助。下面是一个完整的示例Demo和详细的说明。

安装

首先,在您的项目的pubspec.yaml文件中添加依赖:

dependencies:
  pdf_render: ^1.4.12

然后运行 flutter pub get 来安装该包。

对于Web平台,您需要在index.html中添加以下脚本标签:

<!-- IMPORTANT: load pdfjs files -->
<script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/build/pdf.min.js" type="text/javascript"></script>
<script type="text/javascript">
  pdfjsLib.GlobalWorkerOptions.workerSrc =
    "https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/build/pdf.worker.min.js";
  pdfRenderOptions = {
    // where cmaps are downloaded from
    cMapUrl: "https://cdn.jsdelivr.net/npm/pdfjs-dist@3.4.120/cmaps/",
    // The cmaps are compressed in the case
    cMapPacked: true,
    // any other options for pdfjsLib.getDocument.
    // params: {}
  };
</script>

示例代码

以下是一个简单的例子,展示了如何在Flutter应用中显示一个PDF文件。

最简示例

import 'package:flutter/material.dart';
import 'package:pdf_render/pdf_render_widgets.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Easiest PDF sample'),
        ),
        backgroundColor: Colors.grey,
        body: PdfViewer.openAsset('assets/hello.pdf')
      )
    );
  }
}

使用PdfViewerParams自定义

您可以使用PdfViewerParams来定制PDF查看器的行为,比如设置初始页面等。

@override
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text('Pdf_render example app'),
      ),
      backgroundColor: Colors.grey,
      body: PdfViewer.openAsset(
        'assets/hello.pdf',
        params: PdfViewerParams(pageNumber: 2), // 显示第2页
      )
    ),
  );
}

网络支持

由于pdf_render不直接支持从网络加载PDF文件,您可以结合flutter_cache_manager来实现这一功能:

FutureBuilder<File>(
  future: DefaultCacheManager().getSingleFile(
    'https://github.com/espresso3389/flutter_pdf_render/raw/master/example/assets/hello.pdf'
  ),
  builder: (context, snapshot) => snapshot.hasData
    ? PdfViewer.openFile(snapshot.data!.path)
    : Container(), // placeholder widget
)

控制器操作

通过PdfViewerController,您可以执行更多高级操作,如跳转到指定页面、调整缩放比例等。

final controller = PdfViewerController();

@override
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text('Pdf_render example app'),
      ),
      body: PdfViewer.openAsset(
        'assets/hello.pdf',
        viewerController: controller,
        params: PdfViewerParams(
          onViewerControllerInitialized: (PdfViewerController c) {
            controller = c;
            controller.goToPage(pageNumber: 3); // 跳转至第3页
          }
        )
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            child: Icon(Icons.first_page),
            onPressed: () => controller.ready?.goToPage(pageNumber: 1),
          ),
          FloatingActionButton(
            child: Icon(Icons.last_page),
            onPressed: () => controller.ready?.goToPage(pageNumber: controller.pageCount),
          ),
        ],
      ),
    ),
  );
}

以上是关于pdf_render的基本使用介绍,包括了从最基础的PDF展示到较为复杂的控制与自定义。如果您正在考虑新项目或者现有项目需要更强大的PDF处理能力,可以考虑迁移到pdfrx


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用pdf_render插件来渲染PDF文件的示例代码。请注意,pdf_render插件的具体用法和API可能会根据版本的不同而有所变化,以下示例基于假设的插件用法和API设计。

首先,确保你已经在pubspec.yaml文件中添加了pdf_render依赖项:

dependencies:
  flutter:
    sdk: flutter
  pdf_render: ^x.y.z  # 替换为实际的版本号

然后,运行flutter pub get来获取依赖项。

接下来,你可以在你的Flutter应用中使用pdf_render插件来渲染PDF文件。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:pdf_render/pdf_render.dart'; // 假设插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter PDF Render Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: PDFViewerScreen(),
    );
  }
}

class PDFViewerScreen extends StatefulWidget {
  @override
  _PDFViewerScreenState createState() => _PDFViewerScreenState();
}

class _PDFViewerScreenState extends State<PDFViewerScreen> {
  late PdfRenderController _pdfController;

  @override
  void initState() {
    super.initState();
    // 初始化PDF控制器
    _pdfController = PdfRenderController(
      assetPath: 'assets/sample.pdf', // 假设你有一个名为sample.pdf的PDF文件在assets文件夹中
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('PDF Viewer'),
      ),
      body: PdfRenderWidget(
        controller: _pdfController,
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 打开下一页
          _pdfController.nextPage();
        },
        tooltip: 'Next Page',
        child: Icon(Icons.arrow_forward),
      ),
    );
  }

  @override
  void dispose() {
    _pdfController.dispose();
    super.dispose();
  }
}

// 假设的PdfRenderController类,用于控制PDF的渲染和导航
class PdfRenderController {
  final String assetPath;
  int currentPage = 0;

  PdfRenderController({required this.assetPath});

  void nextPage() {
    if (currentPage < getMaxPages()) {
      currentPage++;
      // 通知监听器页面已更改(这里需要实现一个通知机制,比如使用ValueNotifier)
    }
  }

  int getMaxPages() {
    // 这里应该有一个方法来获取PDF的总页数,具体实现取决于pdf_render插件的API
    return 10; // 假设总共有10页,实际使用中需要替换为真实值
  }

  void dispose() {
    // 清理资源
  }
}

// 假设的PdfRenderWidget类,用于显示PDF页面
class PdfRenderWidget extends StatefulWidget {
  final PdfRenderController controller;

  PdfRenderWidget({required this.controller});

  @override
  _PdfRenderWidgetState createState() => _PdfRenderWidgetState();
}

class _PdfRenderWidgetState extends State<PdfRenderWidget> {
  @override
  Widget build(BuildContext context) {
    // 这里应该有一个方法来渲染当前页的内容,具体实现取决于pdf_render插件的API
    // 以下是一个简化的示例,仅显示当前页码
    return Center(
      child: Text('Page ${widget.controller.currentPage + 1}'),
    );
  }
}

注意

  1. 上面的代码是一个简化的示例,用于说明如何使用一个假设的pdf_render插件。实际上,pdf_render插件可能具有不同的API和用法,因此你需要查阅该插件的官方文档来了解如何正确初始化和使用它。
  2. 在真实应用中,PDF渲染通常涉及复杂的布局和渲染逻辑,因此你可能需要使用更强大的PDF渲染库,如flutter_full_pdf_viewerpdf_viewer_plugin,这些库提供了更完整和健壮的PDF渲染功能。
  3. 确保你的PDF文件已经被正确地添加到了项目的assets文件夹中,并在pubspec.yaml文件中进行了声明。
回到顶部