Flutter PDF转换插件custom_pdf_converter的使用

Flutter PDF转换插件custom_pdf_converter的使用

本库分为两个部分:

  • 一个低级PDF生成库,负责生成PDF文件的各种元素。
  • 类似于Flutter的小部件系统,用于轻松创建高级PDF。

它可以通过使用TrueType字体来创建包含图形、图像和文本的多页文档。使用起来非常简单。

完整的示例代码可以在以下GitHub仓库中找到: https://github.com/totemdeveloper/custom_pdf_converter/tree/main/example

要实现完整的Flutter打印和分享操作,请使用printing包: https://pub.dev/packages/printing

坐标系使用内部PDF单位定义:

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

安装

如果要在实际打印机上通过Flutter打印PDF文档,请遵循以下说明: https://pub.dev/packages/printing

  1. 将此软件包添加到您的项目的pubspec.yaml文件中,如安装选项卡所述。
  2. 导入库文件:
import 'package:custom_pdf_converter/widgets.dart' as pw;

示例

创建一个简单的PDF页面

final pdf = pw.Document();

pdf.addPage(pw.Page(
      pageFormat: pw.PdfPageFormat.a4,
      build: (pw.Context context) {
        return pw.Center(
          child: pw.Text("Hello World"),
        ); // Center
      })); // Page

加载本地文件中的图像

final image = pw.MemoryImage(
  File('test.webp').readAsBytesSync(),
);

pdf.addPage(pw.Page(build: (pw.Context context) {
  return pw.Center(
    child: pw.Image(image),
  ); // Center
})); // Page

使用networkImage加载网络上的图像

final netImage = await pw.networkImage('https://www.nfet.net/nfet.jpg');

pdf.addPage(pw.Page(build: (pw.Context context) {
  return pw.Center(
    child: pw.Image(netImage),
  ); // Center
})); // Page

加载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>
''';

final svgImage = pw.SvgImage(svg: svgRaw);

pdf.addPage(pw.Page(build: (pw.Context context) {
  return pw.Center(
    child: svgImage,
  ); // Center
})); // Page

加载Flutter资产中的SVG

String svgAsset = await rootBundle.loadString('assets/file.svg');

final svgImage = pw.SvgImage(svg: svgAsset);

pdf.addPage(pw.Page(build: (pw.Context context) {
  return pw.Center(
    child: svgImage,
  ); // Center
})); // Page

使用自定义TrueType字体

final Uint8List 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) {
      return pw.Center(
        child: pw.Text('Hello World', style: pw.TextStyle(font: ttf, fontSize: 40)),
      ); // Center
    })); // Page

使用PDFGoogleFonts加载Google字体

final font = await pw.PdfGoogleFonts.nunitoExtraLight();

pdf.addPage(pw.Page(
    pageFormat: pw.PdfPageFormat.a4,
    build: (pw.Context context) {
      return pw.Center(
        child: pw.Text('Hello World', style: pw.TextStyle(font: font, fontSize: 40)),
      ); // Center
    })); // Page

显示带颜色的emoji

final emoji = await pw.PdfGoogleFonts.notoColorEmoji();

pdf.addPage(pw.Page(
    pageFormat: pw.PdfPageFormat.a4,
    build: (pw.Context context) {
      return pw.Center(
        child: pw.Text(
          'Hello 🐒💁👌🎍😍🦊👨 world!',
          style: pw.TextStyle(
            fontFallback: [emoji],
            fontSize: 25,
          ),
        ),
      ); // Center
    })); // Page

保存PDF文件

final file = File("example.pdf");
await file.writeAsBytes(await pdf.save());

示例代码

以下是一个完整的示例代码,展示了如何使用custom_pdf_converter插件创建并保存一个PDF文件:

import 'dart:io';

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

Future<void> main() async {
  final pdf = pw.Document();

  pdf.addPage(
    pw.Page(
      build: (pw.Context context) => pw.Center(
        child: pw.Text('Hello World!'),
      ),
    ),
  );

  final file = File('example.pdf');
  await file.writeAsBytes(await pdf.save());
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用custom_pdf_converter插件进行PDF转换的一个示例。这个插件允许你将Flutter的Widget转换成PDF文件。

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

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

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

以下是一个简单的示例代码,展示如何使用custom_pdf_converter将Flutter的Widget转换成PDF文件并保存到设备存储中:

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:custom_pdf_converter/custom_pdf_converter.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('PDF Converter Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _generatePdf,
            child: Text('Generate PDF'),
          ),
        ),
      ),
    );
  }

  Future<void> _generatePdf() async {
    // 创建一个简单的Widget
    final Widget pdfWidget = Container(
      color: Colors.white,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text(
            'Hello, this is a PDF document!',
            style: TextStyle(fontSize: 24),
          ),
          SizedBox(height: 20),
          Image.network(
            'https://via.placeholder.com/150',
            width: 150,
            height: 150,
          ),
        ],
      ),
    );

    // 获取应用文档目录
    final Directory appDocDir = await getApplicationDocumentsDirectory();
    final String appDocPath = appDocDir.path;
    final String pdfPath = '$appDocPath/example.pdf';

    // 将Widget转换为PDF并保存到指定路径
    final bool result = await CustomPdfConverter.convert(
      pdfWidget,
      pdfPath,
      paperFormat: PaperFormat.a4,
      margin: EdgeInsets.all(20),
    );

    if (result) {
      print('PDF generated successfully at $pdfPath');
      // 你可以在这里添加代码以打开或分享PDF文件
    } else {
      print('Failed to generate PDF');
    }
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml文件中添加了custom_pdf_converter依赖。
  2. 创建了一个简单的Flutter应用,其中包含一个按钮。
  3. 当按钮被点击时,调用_generatePdf函数。
  4. _generatePdf函数中,我们创建了一个简单的Widget(包含一个文本和一个网络图片)。
  5. 使用getApplicationDocumentsDirectory函数获取应用的文档目录,并指定PDF文件的保存路径。
  6. 使用CustomPdfConverter.convert函数将Widget转换为PDF并保存到指定路径。

请注意,custom_pdf_converter插件的具体API可能会随着版本的更新而变化,因此请参考其官方文档以获取最新和最准确的信息。此外,由于网络图片加载是异步的,在实际应用中可能需要更复杂的处理来确保图片在转换前已加载完成。

回到顶部