Flutter自定义保存PDF插件custom_save_pdf的使用

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

Flutter自定义保存PDF插件custom_save_pdf的使用

custom_save_pdf

Flutter 插件允许你在手机存储的自定义文件夹中保存PDF文件。


更改为阿拉伯语版本


开发者

profile

Nasr Al-Rahbi [@abom_me](/user/abom_me)

找我

Twitter Instagram LinkedIn Stack Overflow


custom_save_pdf: 使用官方的 open_documentpath_providerpermission_handler 包。

要求

Android iOS
支持 SDK 29+ iOS 11+

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  custom_save_pdf: <last_version>

示例代码

import 'package:custom_save_pdf/custom_save_pdf.dart';

CustomPdfFolder.save(
  byteList: data,         // PDF 文件的字节数据
  nameOfFolder: 'nasr',   // 存储文件夹名称
  openPDF: true,          // 保存后是否自动打开PDF
  onSaved: (v) {},        // 保存成功后的回调函数
  onError: (error, code) { // 发生错误时的回调函数
    print(error);
    print(code);
  },
);

开始使用

Android

  1. 确保在 android/app/build.gradle 中设置正确的 minSdkVersion

    android {
        defaultConfig {
            minSdkVersion 29
        }
    }
  2. 设置正确的 compileSdkVersion

    android {
        compileSdkVersion 33
        ...
    }
  3. android/app/build.gradle 中添加以下权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        android:requestLegacyExternalStorage="true"
        ...
    >
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
    </application>
  4. 创建 provider_paths.xml 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
            name="external_files"
            path="." />
    </paths>

iOS

  1. info.plist 中添加以下代码:

    <key>LSSupportsOpeningDocumentsInPlace</key>
    <true/>
  2. 注意:在iOS上,你的文件夹将在应用文件夹内创建。

    示例路径:App_name/your_folder/your_pdf


参数说明

/// ---- EN ----
/// ### 添加 PDF 包的 Uint8List
/// #### [PDF Package](https://pub.dev/packages/pdf)
/// #### 你可以在文档中找到示例

/// ---- AR ----
/// ### 添加 PDF 包的 Uint8List
/// #### [PDF Package](https://pub.dev/packages/pdf)
/// #### 你可以在文档中找到示例

final Uint8List byteList;

/// ---- EN ----
///
/// ### 写入文件夹名称,PDF 文件将保存在此文件夹中

/// ---- AR ----
///
/// ### 写入文件夹名称,PDF 文件将保存在此文件夹中

final String nameOfFolder;

/// ---- EN ----
/// ### 写入文件名,例如:
/// #### (-- example.pdf --)
/// #### 不要包含 (.pdf)
/// #### 你可以保持为空并生成随机名称

/// ---- AR ----
/// ### 写入文件名,例如:
/// #### (-- example.pdf --)
/// #### 不要包含 (.pdf)
/// #### 你可以保持为空并生成随机名称

final String? fileName;

/// ---- EN ----
/// ### 这里可以获取PDF文件的路径作为字符串

/// ---- AR ----
/// ### 这里可以获取PDF文件的路径作为字符串

final void Function(String filePath)? onSaved;

/// ---- EN ----
/// ### 如果发生任何错误,这里会显示错误文本和错误代码,并且你可以添加一个处理错误的函数

/// ---- AR ----
/// ### 如果发生任何错误,这里会显示错误文本和错误代码,并且你可以添加一个处理错误的函数

final void Function(String error, int errorCode)? onError;

/// ---- EN ----
/// ### 保持为 true 以在保存后打开PDF文件,或者 false 仅保存文件
/// #### 默认为 true

/// ---- AR ----
/// ### 保持为 true 以在保存后打开PDF文件,或者 false 仅保存文件
/// #### 默认为 true

bool? openPDF = true;

示例代码

import 'package:custom_save_pdf/pdf_save/pdf_save.dart';
import 'package:flutter/material.dart';

import 'invoice_service.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  HomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  TextEditingController text = TextEditingController();

  final PdfInvoiceService service = PdfInvoiceService();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            SizedBox(
              width: double.infinity,
              child: TextField(
                controller: text,
              ),
            ),
            SizedBox(
              height: 50,
            ),
            ElevatedButton(
              onPressed: () async {
                final data = await service.createHelloWorld(text.text);

                CustomPdfFolder.save(
                  byteList: data,
                  nameOfFolder: 'folderName',
                  openPDF: true,
                  onSaved: (v) {},
                  onError: (error, code) {
                    print(error);
                    print(code);
                  },
                );
              },
              child: const Text("Create PDF"),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter自定义保存PDF插件custom_save_pdf的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义保存PDF插件custom_save_pdf的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用自定义保存PDF插件 custom_save_pdf 的代码示例。需要注意的是,这个插件是一个假设存在的插件,因为Flutter社区中并没有一个名为 custom_save_pdf 的官方或广泛使用的插件。然而,我们可以基于常见的Flutter插件使用模式来编写一个示例代码。

首先,假设你已经创建了一个Flutter项目,并且已经添加了 custom_save_pdf 插件到你的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  custom_save_pdf: ^1.0.0  # 假设的版本号

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

接下来,我们将编写一些Flutter代码来展示如何使用这个假设的 custom_save_pdf 插件来生成并保存PDF文件。

1. 导入插件

在你的Dart文件中(例如 main.dart),首先导入插件:

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

2. 创建PDF内容

为了生成PDF,你可能需要一些文本或图像内容。这里我们简单地使用一些文本内容。

3. 使用插件保存PDF

下面是一个完整的示例,展示如何生成一个包含文本的PDF并将其保存到设备中:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom Save PDF Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 创建PDF内容
              final pdfContent = """
                Hello, this is a sample PDF document.
                It is generated using the custom_save_pdf Flutter plugin.
              """;

              // 调用插件保存PDF
              try {
                final filePath = await CustomSavePdf.savePdf(
                  content: pdfContent,
                  filename: 'sample.pdf',
                );

                // 显示保存成功消息
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('PDF saved to $filePath'),
                    duration: Duration(seconds: 3),
                  ),
                );
              } catch (e) {
                // 显示错误信息
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('Failed to save PDF: ${e.message}'),
                    backgroundColor: Colors.red,
                    duration: Duration(seconds: 3),
                  ),
                );
              }
            },
            child: Text('Save PDF'),
          ),
        ),
      ),
    );
  }
}

4. 插件假设的API

由于 custom_save_pdf 是一个假设的插件,这里我们假设它有一个静态方法 savePdf,该方法接受两个参数:content(PDF的内容,可能是字符串或其他格式,取决于插件的实现)和 filename(要保存的PDF文件的名称),并返回一个 Future<String>,该字符串是保存PDF文件的路径。

注意事项

  • 由于 custom_save_pdf 是一个假设的插件,因此上述代码无法直接运行。你需要找到一个实际存在的PDF生成和保存插件,如 pdfpath_provider,然后按照它们的文档来实现类似的功能。
  • 实际的PDF生成可能需要更多的配置和依赖,例如字体、图像、样式等。
  • 在生产环境中,请确保处理异常和错误,并提供用户友好的反馈。

希望这个示例能帮助你理解如何在Flutter项目中集成和使用自定义的PDF保存插件。如果你找到一个实际的插件并需要进一步的帮助,请随时提问!

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!