Flutter电子发票处理插件danfe的使用

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

Flutter电子发票处理插件danfe的使用

概述

DANFE 插件旨在帮助开发和处理NFC-E或SAT类型的电子发票,通过将XML字符串解析为标准化对象,并生成用于打印的标准缓冲区数据。

功能

  • ✅ 从XML字符串加载并解析为标准的Danfe对象。
  • ✅ 创建一个List<int>格式的缓冲区,用于ESC/POS打印机。

示例代码

解析XML为Danfe对象

// 导入插件包
import 'package:danfe/danfe.dart';

// 解析XML字符串为Danfe对象
Danfe? danfe = DanfeParser.readFromString(xml);

将Danfe对象转换为打印缓冲区

import 'package:danfe/danfe.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';

// 初始化DanfePrinter实例
DanfePrinter danfePrinter = DanfePrinter(PaperSize.mm80); // 或者 PaperSize.mm50

// 获取打印缓冲区数据
List<int> _dados = await danfePrinter.bufferDanfe(danfe);

打印到网络打印机

import 'package:danfe/danfe.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';

// 初始化DanfePrinter实例
DanfePrinter danfePrinter = DanfePrinter(PaperSize.mm80); // 或者 PaperSize.mm50

// 加载打印机配置文件
final profile = await CapabilityProfile.load();

// 获取打印缓冲区数据
List<int> _dados = await danfePrinter.bufferDanfe(danfe);

// 连接网络打印机并打印
NetworkPrinter printer = NetworkPrinter(paper, profile);
await printer.connect('192.168.5.111', port: 9100);
printer.rawBytes(_dados);
printer.disconnect();

自定义打印布局

import 'package:danfe/danfe.dart';
import 'package:esc_pos_utils/esc_pos_utils.dart';

// 初始化自定义打印机实例
final CustomPrinter custom = CustomPrinter(PaperSize.mm80); // 或者 PaperSize.mm50

// 加载打印机配置文件
final profile = await CapabilityProfile.load();

// 获取自定义布局的打印缓冲区数据
List<int> _dados = await custom.layoutCustom(danfe);

// 连接网络打印机并打印
NetworkPrinter printer = NetworkPrinter(paper, profile);
await printer.connect('192.168.5.111', port: 9100);
printer.rawBytes(_dados);
printer.disconnect();

完整示例Demo

以下是一个完整的Flutter应用示例,展示如何使用danfe插件解析XML并打印电子发票:

import 'dart:developer';

import 'package:danfe/danfe.dart';
import 'package:esc_pos_utils_plus/esc_pos_utils_plus.dart';
import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Danfe Exemplos'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _xmlController = TextEditingController();
  final HomeController controller = HomeController();
  Danfe? _dadosDanfe;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              const Center(
                child: Text(
                  'Testes de danfes',
                ),
              ),
              Column(
                children: [
                  const Text('Cole aqui o seu xml da danfe'),
                  TextField(
                    controller: _xmlController
                      ..text = r'''<?xml version="1.0"?>...''', // XML内容省略
                    maxLines: 10,
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: [
                      Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8.0),
                          child: ElevatedButton(
                              onPressed: () {
                                setState(() {
                                  _dadosDanfe =
                                      controller.parseXml(_xmlController.text);
                                });
                              },
                              child: const Text('Processar nota'))),
                      Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8.0),
                          child: ElevatedButton(
                              onPressed: () {
                                final jsonNormativo = controller.normativeJson(
                                    _xmlController.text, PaperSize.mm58);
                                log(jsonNormativo);
                              },
                              child: const Text('Json normativo'))),
                      Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8.0),
                          child: ElevatedButton(
                              onPressed: () async {
                                final profile = await CapabilityProfile.load();

                                await controller.printDefault(
                                    danfe: _dadosDanfe,
                                    paper: PaperSize.mm80,
                                    profile: profile);
                              },
                              child: const Text('Imprimir nota'))),
                      Padding(
                          padding: const EdgeInsets.symmetric(vertical: 8.0),
                          child: ElevatedButton(
                              onPressed: () async {
                                final profile = await CapabilityProfile.load();

                                await controller.printCustomLayout(
                                    danfe: _dadosDanfe,
                                    paper: PaperSize.mm80,
                                    profile: profile);
                              },
                              child:
                                  const Text('Imprimir minha customizacao'))),
                    ],
                  ),
                ],
              ),
              SizedBox(
                width: 300,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.start,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: [
                    const Text('Resultado da nota'),
                    dadosNota(_dadosDanfe),
                  ],
                ),
              )
            ],
          ),
        ),
      ),
    );
  }

  Widget dadosNota(Danfe? nota) {
    return Container(
      color: Colors.grey.shade300,
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 30),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            Center(
                child: Text(nota?.tipo == 'CFe' ? ' Nota SAT' : 'Nota NFC-E')),
            Padding(
              padding: const EdgeInsets.only(top: 2.0),
              child: RichText(
                  text: TextSpan(children: [
                const TextSpan(
                  text: 'Nome fantasia:  ',
                  style: TextStyle(color: Colors.black, fontSize: 10),
                ),
                TextSpan(
                  text: nota?.dados?.emit?.xFant ?? '',
                  style: const TextStyle(
                      color: Colors.black,
                      fontWeight: FontWeight.bold,
                      fontSize: 10),
                ),
              ])),
            ),
            // 其他信息显示逻辑...
          ],
        ),
      ),
    );
  }
}

以上是使用danfe插件的基本步骤和完整示例。希望这些内容对你有所帮助!


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

1 回复

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


在处理Flutter应用中的电子发票时,使用danfe插件可以方便地生成和展示巴西的电子发票(Nota Fiscal Eletrônica,NF-e)。danfe插件允许你解析发票数据并生成相应的Danfe(Documento Auxiliar da Nota Fiscal Eletrônica)文档。以下是一个使用danfe插件的示例代码,展示了如何在Flutter应用中集成并使用该插件。

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

dependencies:
  flutter:
    sdk: flutter
  danfe: ^最新版本号  # 请替换为当前可用的最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用danfe插件:

  1. 导入必要的包
import 'package:flutter/material.dart';
import 'package:danfe/danfe.dart';
  1. 创建一个函数来生成Danfe

这里假设你已经有了发票的XML数据。在实际应用中,你可能需要从服务器获取这些数据。

Future<void> generateDanfe(BuildContext context, String xmlData) async {
    try {
      // 解析XML数据并生成Danfe
      final danfePdf = await DanfePdf.fromXml(xmlData);
      
      // 显示生成的PDF
      showPdfPreview(context, danfePdf.bytes);
    } catch (e) {
      // 处理错误
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Error generating Danfe: $e')),
      );
    }
  }

  void showPdfPreview(BuildContext context, Uint8List pdfBytes) {
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => PdfPreviewPage(pdfBytes: pdfBytes),
      ),
    );
  }

  class PdfPreviewPage extends StatelessWidget {
    final Uint8List pdfBytes;

    PdfPreviewPage({required this.pdfBytes});

    @override
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(title: Text('Danfe Preview')),
        body: Center(
          child: PdfViewer(document: pdf.Document.fromData(pdfBytes)),
        ),
      );
    }
  }

注意:上面的代码示例中,PdfViewer是一个假设的用于显示PDF的组件。在Flutter中,你可能需要使用第三方库如pdf_viewer_pluginflutter_full_pdf_viewer来显示PDF。以下是如何使用flutter_full_pdf_viewer的一个简单示例:

首先,在pubspec.yaml中添加flutter_full_pdf_viewer依赖:

dependencies:
  flutter_full_pdf_viewer: ^最新版本号  # 请替换为当前可用的最新版本号

然后,在PdfPreviewPage中使用PDFViewerScaffold来显示PDF:

import 'package:flutter_full_pdf_viewer/full_pdf_viewer_scaffold.dart';
import 'package:flutter_full_pdf_viewer/pdf_document.dart';

class PdfPreviewPage extends StatelessWidget {
  final Uint8List pdfBytes;

  PdfPreviewPage({required this.pdfBytes});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Danfe Preview')),
      body: PDFViewerScaffold(
        appBar: AppBar(
          title: Text('Danfe'),
        ),
        path: MemoryFileSystem().openFileFromBytes('document.pdf', pdfBytes),
      ),
    );
  }
}

在这个例子中,MemoryFileSystem().openFileFromBytes是一个假设的方法,用于从字节数组创建文件。在实际应用中,你可能需要使用pdf_lib或其他库来创建内存中的PDF文件,或者将PDF保存到设备存储中并从那里加载。

请注意,flutter_full_pdf_viewer和其他PDF查看器库可能有自己的API和依赖项,因此请务必查阅相关文档以获取最新的使用说明。

最后,在你的UI中调用generateDanfe函数,传入发票的XML数据和当前的BuildContext

ElevatedButton(
  onPressed: () async {
    // 假设xmlData是已经获取的发票XML字符串
    String xmlData = '...'; // 这里填入实际的XML数据
    generateDanfe(context, xmlData);
  },
  child: Text('Generate Danfe'),
),

这样,你就能够在Flutter应用中生成并显示电子发票的Danfe文档了。

回到顶部