Flutter文档打印插件printing的使用

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

Flutter文档打印插件printing的使用

Flutter的printing插件允许应用程序生成和打印文档到与Android或iOS兼容的打印机。以下是关于如何安装、配置和使用该插件的详细指南,以及一个完整的示例demo。

安装

  1. 添加依赖

    在项目的pubspec.yaml文件中添加printing插件:

    dependencies:
      printing: ^5.9.3 # 请根据最新版本进行调整
      pdf: ^3.8.4      # PDF创建所需的包
    
  2. 导入库

    在Dart文件中导入必要的库:

    import 'package:pdf/pdf.dart';
    import 'package:pdf/widgets.dart' as pw;
    import 'package:printing/printing.dart';
    
  3. 启用Swift(仅iOS)

    修改ios/Podfile文件以支持Swift:

    target 'Runner' do
      use_frameworks!
    end
    
  4. macOS应用的打印权限

    添加以下内容到macos/Runner/Release.entitlementsmacos/Runner/DebugProfile.entitlements文件中:

    <key>com.apple.security.print</key>
    <true/>
    
  5. Web平台设置PDF.js库

    如果需要手动指定PDF.js库版本,在web/index.html文件中添加以下脚本:

    <script>
      var dartPdfJsVersion = "3.2.146";
    </script>
    

    或者指定自定义加载路径:

    <script>
      var dartPdfJsBaseUrl = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.2.146/";
    </script>
    
  6. Windows/Linux平台设置PDFium版本

    修改CMakeLists.txt文件中的PDFium版本和架构:

    set(PDFIUM_VERSION "4929" CACHE STRING "" FORCE)
    set(PDFIUM_ARCH "x64" CACHE STRING "" FORCE)
    

示例代码

下面是一个完整的Flutter应用程序示例,展示了如何使用printing插件来创建和预览PDF文档:

import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart';

Future<void> main() async {
  runApp(const MyApp('Printing Demo'));
}

class MyApp extends StatelessWidget {
  const MyApp(this.title, {super.key});

  final String title;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(title)),
        body: PdfPreview(
          build: (format) => _generatePdf(format, title),
        ),
      ),
    );
  }

  Future<Uint8List> _generatePdf(PdfPageFormat format, String title) async {
    final pdf = pw.Document(version: PdfVersion.pdf_1_5, compress: true);
    final font = await PdfGoogleFonts.nunitoExtraLight();

    pdf.addPage(
      pw.Page(
        pageFormat: format,
        build: (context) {
          return pw.Column(
            children: [
              pw.SizedBox(
                width: double.infinity,
                child: pw.FittedBox(
                  child: pw.Text(title, style: pw.TextStyle(font: font)),
                ),
              ),
              pw.SizedBox(height: 20),
              pw.Flexible(child: pw.FlutterLogo()),
            ],
          );
        },
      ),
    );

    return pdf.save();
  }
}

解释

  • PdfPreview:用于预览和打印PDF文档的Widget。
  • _generatePdf:生成PDF文档的方法,返回一个包含PDF数据的Uint8List
  • PdfDocument:通过pw.Document()创建一个新的PDF文档。
  • PdfPage:为PDF文档添加页面,可以设置页面格式和构建页面内容。
  • PdfGoogleFonts.nunitoExtraLight():从pdf_google_fonts包中加载字体。

打印现有PDF文件

如果您想打印已经存在的PDF文件,可以使用以下代码:

final pdf = await rootBundle.load('assets/document.pdf');
await Printing.layoutPdf(onLayout: (_) => pdf.buffer.asUint8List());

分享PDF文件

您还可以将生成的PDF文件分享给其他应用程序:

await Printing.sharePdf(bytes: await doc.save(), filename: 'my-document.pdf');

HTML转PDF

要将HTML内容转换为PDF并打印,您可以使用htmltopdfwidgets包:

import 'package:htmltopdfwidgets/htmltopdfwidgets.dart';

await Printing.layoutPdf(onLayout: (PdfPageFormat format) async {
  const body = '''
    <h1>Heading Example</h1>
    <p>This is a paragraph.</p>
    <img src="image.jpg" alt="Example Image" />
    <blockquote>This is a quote.</blockquote>
    <ul>
      <li>First item</li>
      <li>Second item</li>
      <li>Third item</li>
    </ul>
  ''';

  final pdf = pw.Document();
  final widgets = await HTMLToPdf().convert(body);
  pdf.addPage(pw.MultiPage(build: (context) => widgets));
  return await pdf.save();
});

总结

通过以上步骤和示例代码,您可以轻松地在Flutter应用程序中实现文档的生成、预览和打印功能。希望这些信息对您有所帮助!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter文档打印插件printing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文档打印插件printing的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用printing插件来实现文档打印功能的代码示例。printing插件允许你将PDF文档发送到打印机进行打印。

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

dependencies:
  flutter:
    sdk: flutter
  printing: ^5.0.3  # 请检查最新版本号

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

接下来,你可以在你的Flutter项目中实现一个简单的PDF文档生成和打印功能。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:printing/printing.dart';
import 'dart:typed_data';
import 'package:pdf/pdf.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Printing Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final PdfDocument _generatePdf() {
    final doc = PdfDocument();
    final page = doc.addPage(PageFormat.a4);
    final textStyle = PdfTextStyle(fontSize: 24);

    page.drawText('Hello, Flutter Printing!', 50, 50, textStyle);
    page.drawText('This is a sample PDF document.', 50, 80, textStyle);

    return doc;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Printing Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            final pdf = _generatePdf();
            final bytes = await pdf.save();
            await Printing.layoutPdf(
              onLayout: (PdfPageFormat format) async => _generatePdf().save(),
              title: 'Document Print',
            );
            // 如果你想要直接打印而不显示预览,可以使用:
            // await Printing.directPrintPdf(
            //   bytes: bytes,
            // );
          },
          child: Text('Print Document'),
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加printing依赖。
  2. 生成PDF:在_generatePdf方法中,我们使用pdf库生成一个简单的PDF文档。这个文档包含一个标题和一些文本。
  3. UI布局:在MyHomePage中,我们创建了一个简单的Flutter界面,包含一个按钮。当用户点击按钮时,将调用_generatePdf方法来生成PDF,并使用Printing.layoutPdf方法来显示打印预览。
  4. 打印预览与直接打印Printing.layoutPdf方法会显示一个打印预览对话框,用户可以选择打印机并进行打印。如果你想要直接打印而不显示预览,可以使用Printing.directPrintPdf方法并传递PDF的字节数据。

请注意,pdf库是生成PDF内容的依赖,你同样需要在pubspec.yaml中添加它:

dependencies:
  pdf: ^3.6.2  # 请检查最新版本号

运行这个示例代码,你将看到一个带有“Print Document”按钮的界面。点击按钮后,将生成PDF文档并显示打印预览。选择打印机并完成打印操作。

回到顶部