Flutter PDF处理插件pdf_fork的使用

Flutter PDF处理插件pdf_fork的使用

Pdf创建库用于Dart/Flutter

该库源自于 https://github.com/DavBfr/dart_pdf

  • 使依赖项更少限制,以提高包的兼容性。

此库分为两部分:

  • 一个低级PDF创建库,负责生成PDF文件的各个部分。
  • 一个类似于Flutter的小部件系统,便于高级PDF创建。

它可以创建包含图形、图像和文本(使用TrueType字体)的多页文档。使用你已经熟悉的简便方式。

查看交互式演示:https://davbfr.github.io/dart_pdf/

示例文档

可以在任何Flutter目标上运行的完整演示源代码及其构建方法,可以在这里找到: https://github.com/DavBfr/dart_pdf/tree/master/demo/

使用 printinghttps://pub.dev/packages/printing 进行完整的Flutter打印和共享操作。

坐标系使用内部PDF单位:

  • 1.0 定义为 1/72.0 英寸
  • 可以使用 PdfPageFormat 中定义的厘米、毫米和英寸常量。

安装

如果你希望使用Flutter在实际打印机上打印PDF文档,请遵循 https://pub.dev/packages/printing 的说明。

  1. 将此包添加到你的 pubspec.yaml 文件中,如安装标签所述。

  2. 导入库:

import 'package:pdf/pdf.dart';
import 'package:pdf_fork/widgets.dart' as pw;

示例

创建并保存PDF文档

import 'dart:io';
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 添加一个A4大小的页面
  pdf.addPage(
    pw.Page(
      // 页面格式设置为A4
      pageFormat: pw.PdfPageFormat.a4,
      // 页面内容
      build: (pw.Context context) => pw.Center(
        child: pw.Text("Hello World"), // 居中的文本
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

加载本地文件中的图像(移动设备)

import 'dart:io';
import 'package:image/image.dart' as imgLib;
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 读取本地文件中的图像
  final image = pw.MemoryImage(File('test.webp').readAsBytesSync());

  // 添加一个包含图像的页面
  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: pw.Image(image), // 居中的图像
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

加载资产文件中的图像(Web)

import 'package:flutter/services.dart' show rootBundle;
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 从资源文件加载图像
  final img = await rootBundle.load('assets/images/logo.jpg');
  final imageBytes = img.buffer.asUint8List();

  // 创建图像对象
  pw.Image image1 = pw.Image(pw.MemoryImage(imageBytes));

  // 添加一个包含图像的页面
  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: pw.Container(
          alignment: pw.Alignment.center,
          height: 200,
          child: image1,
        ), // 居中的容器
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

从网络加载图像

import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 从网络加载图像
  final netImage = await printing.networkImage('https://www.nfet.net/nfet.jpg');

  // 添加一个包含图像的页面
  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: pw.Image(netImage), // 居中的图像
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

加载SVG图像

import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 定义SVG字符串
  String svgRaw = '''
<svg viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg">
  <ellipse style="fill: grey; stroke: black;" cx="25" cy="25" rx="20" ry="20"></ellipse>
</svg>
''';

  // 创建SVG图像对象
  pw.SvgImage svgImage = pw.SvgImage(svg: svgRaw);

  // 添加一个包含SVG图像的页面
  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: svgImage, // 居中的SVG图像
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

使用TrueType字体

import 'dart:io';
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 读取TrueType字体文件
  final fontData = File('open-sans.ttf').readAsBytesSync();
  final ttf = pw.Font.ttf(fontData.buffer.asByteData());

  // 添加一个包含文本的页面
  pdf.addPage(
    pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World', style: pw.TextStyle(font: ttf, fontSize: 40)), // 居中的文本
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

使用printing包的PdfGoogleFonts

import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 获取Google字体
  final font = await PdfGoogleFonts.nunitoExtraLight();

  // 添加一个包含文本的页面
  pdf.addPage(
    pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World', style: pw.TextStyle(font: font, fontSize: 40)), // 居中的文本
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

显示表情符号

import 'package:printing/printing.dart';
import 'package:pdf_fork/widgets.dart' as pw;

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 获取Noto Color Emoji字体
  final emoji = await PdfGoogleFonts.notoColorEmoji();

  // 添加一个包含表情符号的页面
  pdf.addPage(
    pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) => pw.Center(
        child: pw.Text(
          'Hello 🐒💁👌🎍😍🦊👨 world!',
          style: pw.TextStyle(
            fontFallback: [emoji], // 使用emoji字体
            fontSize: 25,
          ),
        ),
      ),
    ),
  );

  // 保存并写入PDF文件
  final file = File("example.pdf");
  await file.writeAsBytes(await pdf.save());
}

在移动端保存PDF文件

import 'package:path_provider/path_provider.dart'; // 引入路径提供器库

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 添加一个包含文本的页面
  pdf.addPage(
    pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World'), // 居中的文本
      ),
    ),
  );

  // 保存并写入PDF文件
  final output = await getTemporaryDirectory(); // 获取临时目录
  final file = File("${output.path}/example.pdf"); // 构建文件路径
  await file.writeAsBytes(await pdf.save()); // 写入文件
}

在Web端保存PDF文件

import 'dart:convert';
import 'dart:html';

Future<void> main() async {
  // 创建一个新的PDF文档对象
  final pdf = pw.Document();

  // 添加一个包含文本的页面
  pdf.addPage(
    pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World'), // 居中的文本
      ),
    ),
  );

  // 保存PDF数据
  var savedFile = await pdf.save();
  List<int> fileInts = List.from(savedFile); // 转换为整数列表

  // 创建下载链接并触发下载
  html.AnchorElement(
    href: "data:application/octet-stream;charset=utf-16le;base64,${base64.encode(fileInts)}"
  )..setAttribute("download", "${DateTime.now().millisecondsSinceEpoch}.pdf")
   ..click();
}

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

1 回复

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


pdf_fork 是一个用于在 Flutter 中处理 PDF 文件的插件。它提供了创建、编辑和读取 PDF 文件的功能。以下是如何在 Flutter 项目中使用 pdf_fork 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  pdf_fork: ^2.0.0

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

2. 导入插件

在你的 Dart 文件中导入 pdf_fork 插件。

import 'package:pdf_fork/pdf.dart';

3. 创建 PDF 文档

你可以使用 pdf_fork 创建一个新的 PDF 文档,并添加内容。

void createPdf() {
  // 创建一个新的 PDF 文档
  final pdf = Document();

  // 添加一个页面
  pdf.addPage(Page(
    build: (Context context) {
      return Center(
        child: Text("Hello, PDF!", style: TextStyle(fontSize: 40)),
      );
    },
  ));

  // 保存 PDF 文件
  final file = File('example.pdf');
  file.writeAsBytesSync(pdf.save());
}

4. 读取和编辑 PDF 文档

pdf_fork 也支持读取和编辑现有的 PDF 文档。

void editPdf() async {
  // 读取现有的 PDF 文件
  final file = File('example.pdf');
  final bytes = await file.readAsBytes();

  // 加载 PDF 文档
  final pdf = Document.open(bytes);

  // 添加一个新页面
  pdf.addPage(Page(
    build: (Context context) {
      return Center(
        child: Text("New Page!", style: TextStyle(fontSize: 40)),
      );
    },
  ));

  // 保存编辑后的 PDF 文件
  file.writeAsBytesSync(pdf.save());
}

5. 显示 PDF 文档

如果你想在 Flutter 应用中显示 PDF 文档,可以使用 flutter_full_pdf_viewer 或其他 PDF 查看器插件。

首先,添加 flutter_full_pdf_viewer 依赖:

dependencies:
  flutter_full_pdf_viewer: ^1.0.0+17

然后,使用以下代码显示 PDF 文件:

import 'package:flutter_full_pdf_viewer/flutter_full_pdf_viewer.dart';

void openPdf() async {
  final file = File('example.pdf');
  PDFDocument doc = await PDFDocument.fromFile(file);
  PDFViewer.open(doc);
}
回到顶部