You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter(Windows)中拆分多页PDF为多个PDF文件?

Flutter Windows平台拆分PDF文档方案

以下是两种可行的实现方案,针对你提到的库进行修正和补充:

方法一:使用Syncfusion Flutter PDF库(推荐)

Syncfusion的PDF库支持在Windows平台提取指定页面生成新PDF,你之前可能未正确使用页面克隆API,以下是完整实现:

步骤与代码示例

import 'package:syncfusion_flutter_pdf/pdf.dart';
import 'dart:io';

// 拆分PDF:sourcePath为源文件路径,pageRanges为拆分的页面范围(如[[1,2],[3,5]]表示拆成1-2页、3-5页两个文件)
Future<void> splitPdf(String sourcePath, List<List<int>> pageRanges) async {
  // 读取源PDF文档
  final File sourceFile = File(sourcePath);
  final PdfDocument sourceDoc = PdfDocument(inputBytes: sourceFile.readAsBytesSync());

  for (int i = 0; i < pageRanges.length; i++) {
    // 创建新的空白PDF文档
    final PdfDocument newDoc = PdfDocument();
    final int startPage = pageRanges[i][0];
    final int endPage = pageRanges[i][1];

    // 克隆指定页面到新文档
    for (int pageIdx = startPage - 1; pageIdx < endPage; pageIdx++) {
      newDoc.pages.add().clone(sourceDoc.pages[pageIdx]);
    }

    // 保存拆分后的PDF
    final List<int> outputBytes = newDoc.save();
    await File('split_result_$i.pdf').writeAsBytes(outputBytes);

    // 释放资源,避免内存泄漏
    newDoc.dispose();
  }

  sourceDoc.dispose();
}

// 使用示例
// splitPdf('your_source.pdf', [[1, 2], [3, 5], [6, 6]]);

注意事项

  • 在pubspec.yaml中添加依赖:syncfusion_flutter_pdf: ^latest_version
  • Windows平台无需额外配置文件权限,直接读写本地文件即可
  • 支持加密PDF(需提供密码)、大体积PDF的拆分,内存占用可控

方法二:使用pdf库实现(仅适用于简单场景)

pdf库更侧重PDF生成,对现有PDF的编辑能力有限,若需使用该库,需手动重新构建页面内容:

import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'dart:io';
import 'package:pdf/src/document.dart' as internal;

Future<void> splitPdfWithPdfLib(String sourcePath, List<List<int>> pageRanges) async {
  final File sourceFile = File(sourcePath);
  final internal.PdfDocument sourceDoc = internal.PdfDocument.fromBytes(sourceFile.readAsBytesSync());

  for (int i = 0; i < pageRanges.length; i++) {
    final int start = pageRanges[i][0] - 1;
    final int end = pageRanges[i][1] - 1;
    final pw.Document newDoc = pw.Document();

    // 遍历目标页面,重新构建内容(仅适用于无复杂格式的PDF)
    for (int pageIdx = start; pageIdx <= end; pageIdx++) {
      final internal.PdfPage sourcePage = sourceDoc.pages[pageIdx];
      newDoc.addPage(
        pw.Page(
          pageFormat: PdfPageFormat(
            width: sourcePage.pageFormat.width,
            height: sourcePage.pageFormat.height,
          ),
          build: (pw.Context context) {
            // 若需保留原页面内容,需解析原页面的图形、文本元素,该库无直接克隆API
            // 此示例仅创建占位,实际需根据需求处理内容
            return pw.Center(child: pw.Text('Page ${pageIdx + 1}'));
          },
        ),
      );
    }

    final List<int> outputBytes = await newDoc.save();
    await File('split_pdf_lib_result_$i.pdf').writeAsBytes(outputBytes);
  }

  sourceDoc.dispose();
}

局限性

  • 无法直接克隆原页面的复杂格式(如图片、表格、水印)
  • 仅适合简单文本类PDF的拆分

内容的提问来源于stack exchange,提问作者Alfredo Blanco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:05:30