Flutter PDF合并插件pdf_merger的使用

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

Flutter PDF合并插件pdf_merger的使用

pdf_merger 是一个用于在Flutter应用中合并PDF文件的新插件。它支持Android和iOS平台。在调用此插件之前,请确保您已允许权限并设置了文件选择器。

PDF合并方法

合并多个PDF文件

以下是合并多个PDF文件的示例:

// paths是一个包含路径的列表,例如 List<String> allSelectedFilePath.
// outputDirPath是带有文件名的输出路径,例如 /user/android/download/ABC.pdf

MergeMultiplePDFResponse response = await PdfMerger.mergeMultiplePDF(
    paths: filesPath, 
    outputDirPath: outputDirPath
);

if(response.status == "success") {
    // response.response 为输出路径(String)
    // response.message 为成功消息(String)
}

从多个图片创建PDF

// paths是一个包含路径的列表,例如 List<String> allSelectedFilePath.
// outputDirPath是带有文件名的输出路径,例如 /user/android/download/ABC.pdf
// 可选参数 maxWidth 默认值为360, maxHeight 默认值为360, needImageCompressor 默认值为true.

CreatePDFFromMultipleImageResponse response = await PdfMerger.createPDFFromMultipleImage(
    paths: filesPath, 
    outputDirPath: outputDirPath
);

if(response.status == "success") {
    // response.response 为输出路径(String)
    // response.message 为成功消息(String)
}

从PDF创建图片

// path 为选定文件的路径(String),例如 user/android.download/MYPDF.pdf
// outputDirPath 是带有文件名的输出路径,例如 /user/android/download/ABC.pdf
// 可选参数 maxWidth 默认值为360, maxHeight 默认值为360, createOneImage 默认值为true.

CreateImageFromPDFResponse response = await PdfMerger.createImageFromPDF(
    path: singleFile, 
    outputDirPath: outputDirPath,
    createOneImage: true
);

if(response.status == "success") {
    // response.response 为输出路径(List<String>)
    // response.message 为成功消息(String)
}

获取文件大小

// path 为选定文件的路径(String),例如 user/android.download/MYPDF.pdf

SizeFormPathResponse response = await PdfMerger.sizeFormPath(path: singleFile);

if(response.status == "success") {
    // response.response 为文件大小
    // response.message 为成功消息(String)
}

构建信息

BuildInfoResponse response = await PdfMerger.buildInfo();

Get.snackbar("Info", "App Name : " + response.appName + "\n" +
           "Build Number : " + response.buildDate + "\n" +
           "Build Number with Time : " + response.buildDateWithTime + "\n" +
           "Package Name : " + response.packageName + "\n" +
           "Version Number : " + response.versionNumber + "\n" +
           "Build Number : " + response.buildNumber.toString());

示例Demo

以下是一个完整的示例代码,展示如何使用pdf_merger插件进行PDF合并和其他操作:

import 'dart:io';
import 'package:ext_storage/ext_storage.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf_merger/pdf_merger.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:get/get.dart';

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

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

class _MyAppState extends State<MyApp> {
  List<PlatformFile> files;
  List<String> filesPath;
  String singleFile;

  @override
  void initState() {
    super.initState();
    clear();
  }

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('PDF Merger')),
        body: Center(
          child: Container(
            margin: EdgeInsets.all(25),
            child: Column(children: [
              TextButton(
                style: ButtonStyle(overlayColor:
                    MaterialStateProperty.resolveWith<Color>(
                        (Set<MaterialState> states) {
                  if (states.contains(MaterialState.focused))
                    return Colors.red;
                  if (states.contains(MaterialState.hovered))
                    return Colors.green;
                  if (states.contains(MaterialState.pressed))
                    return Colors.blue;
                  return null; // Defer to the widget's default.
                })),
                child: Text("Chose File", style: TextStyle(fontSize: 14.0)),
                onPressed: () {
                  multipleFilePicker();
                },
              ),
              SizedBox(height: 10),
              TextButton(
                child: Text("Merge Multiple PDF", style: TextStyle(fontSize: 14.0)),
                onPressed: () {
                  callMethod(1);
                },
              ),
              // 其他按钮...
            ]),
          ),
        ),
      ),
    );
  }

  clear() {
    files = [];
    filesPath = [];
    singleFile = "";
  }

  multipleFilePicker() async {
    bool isGranted = await checkPermission();

    if (isGranted) {
      try {
        FilePickerResult result = await FilePicker.platform.pickFiles(allowMultiple: true);

        if (result != null) {
          files.addAll(result.files);

          for (int i = 0; i < result.files.length; i++) {
            filesPath.add(result.files[i].path);
          }
        }
      } on Exception catch (e) {
        print('never reached' + e.toString());
      }
    }
  }

  Future<void> mergeMultiplePDF(outputDirPath) async {
    try {
      MergeMultiplePDFResponse response = await PdfMerger.mergeMultiplePDF(
          paths: filesPath, outputDirPath: outputDirPath);

      Get.snackbar("Info", response.message);

      if (response.status == "success") {
        OpenFile.open(response.response);
      }
    } on PlatformException {
      print('Failed to get platform version.');
    }
  }

  Future<bool> checkPermission() async {
    await PermissionHandler().requestPermissions([PermissionGroup.storage]);
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);

    if (permission == PermissionStatus.neverAskAgain) {
      print("Go to Settings and provide media access");
      return false;
    } else if (permission == PermissionStatus.granted) {
      return true;
    } else {
      return false;
    }
  }

  Future<String> getFilePath(String fileStartName) async {
    String path;
    if (GetPlatform.isIOS) {
      Directory appDocDir = await getApplicationDocumentsDirectory();
      path = appDocDir.path;
    } else if (GetPlatform.isAndroid) {
      path = await ExtStorage.getExternalStoragePublicDirectory(
          ExtStorage.DIRECTORY_DOWNLOADS);
    }

    return path + "/" + fileStartName + "ABCEFG5" + ".pdf";
  }
}

请确保在使用前安装必要的依赖包,如 file_pickerpermission_handler,并在 Android 和 iOS 平台上配置相应的权限。


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

1 回复

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


当然,以下是如何在Flutter项目中使用pdf_merger插件来合并PDF文件的示例代码。

首先,确保你的Flutter项目中已经添加了pdf_merger依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  pdf_merger: ^x.y.z  # 请将x.y.z替换为最新版本号

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

以下是一个完整的示例,展示了如何使用pdf_merger插件来合并两个PDF文件:

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:pdf_merger/pdf_merger.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('PDF Merger Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _mergePDFs,
            child: Text('Merge PDFs'),
          ),
        ),
      ),
    );
  }

  Future<void> _mergePDFs() async {
    // 获取应用文档目录
    final Directory appDocDir = await getApplicationDocumentsDirectory();
    final String appDocPath = appDocDir.path;

    // 定义两个PDF文件的路径
    String pdf1Path = '$appDocPath/pdf1.pdf';
    String pdf2Path = '$appDocPath/pdf2.pdf';

    // 创建或复制示例PDF文件到文档目录(这里假设你有两个示例PDF文件)
    // 在实际应用中,这些文件可能来自网络下载或用户选择
    File pdf1File = File(pdf1Path);
    File pdf2File = File(pdf2Path);

    // 为了示例,这里我们创建一些简单的PDF文件(在实际应用中,这些文件应该已经存在)
    // 注意:这部分代码仅用于演示,实际项目中应使用已有的PDF文件
    _createSamplePDF(pdf1File);
    _createSamplePDF(pdf2File);

    // 等待文件写入完成
    await Future.wait([pdf1File.createSync(), pdf2File.createSync()]);

    // 使用pdf_merger合并PDF
    final PdfMerger merger = PdfMerger();
    merger.addFile(pdf1Path);
    merger.addFile(pdf2Path);

    // 定义输出合并后的PDF文件路径
    String outputPdfPath = '$appDocPath/merged.pdf';
    File outputPdfFile = File(outputPdfPath);

    // 将合并后的PDF写入文件
    await outputPdfFile.create(recursive: true);
    await outputPdfFile.writeAsBytes(await merger.merge(), flush: true);

    // 输出合并结果
    print('PDFs merged successfully to $outputPdfPath');
  }

  // 创建一个简单的示例PDF文件(仅用于演示)
  void _createSamplePDF(File file) {
    // 这里只是简单地创建一个空文件作为示例PDF
    // 在实际应用中,应使用有效的PDF内容
    // 注意:这段代码不会创建一个有效的PDF文件,只是用于占位
  }
}

注意

  1. _createSamplePDF函数只是用于占位,实际上它并没有创建一个有效的PDF文件。在实际应用中,你应该使用已有的PDF文件或者从网络下载PDF文件。
  2. 在实际应用中,处理文件路径和文件操作时,应该添加适当的错误处理逻辑。
  3. pdf_merger插件的具体API可能会根据版本有所不同,请参考官方文档以确保使用正确的方法和属性。

上述代码提供了一个基础框架,你可以根据实际需求进行调整和扩展。

回到顶部