FLUTTER ECOSYSTEM

YousefMohamed6/quick_print

This package provides a unified interface for printing PDFs using various printer types, including ESC/POS, Sunmi, Bluetooth, USB, and system printers.

quick_print project cover
Stars
8
Forks
8
Last push (UTC)
Nov 2, 2025
Project status
Active
Yousef Rabie  GitHub avatar
GITHUB User

Yousef Rabie ↗

Mid-Level Software Engineer

El Santa, Al Gharbia, Egypt
LanguagesDart

Packages published by this repository

Dependencies used

Dependency list 14 items

Original README

English project snapshot. Visit GitHub for the latest content.

Expand / collapse project README

Quick Print

A comprehensive Flutter package for handling PDF printing across different platforms and devices. This package provides a unified interface for printing PDFs using various printer types, including ESC/POS, Sunmi, Bluetooth, USB, and system printers.

pub package likes popularity

Features

  • 🖨️ Multi-printer Support
    • Sunmi printer support for Android devices
    • Bluetooth printer integration (including BLE)
    • USB printer compatibility
    • Desktop system printer support
    • Mobile device printing
  • 🖼️ Image Printing Support
    • Print images (Uint8List) directly to any supported printer
  • 📄 Paper Size Options
    • 80mm paper width (POS printers)
    • 58mm paper width (Thermal printers)
    • A4 paper size
  • 🎯 Platform Support
    • Android
    • iOS
    • Windows
    • Linux
    • macOS
  • 🔍 Printer Discovery
    • Discover Bluetooth, BLE, USB, and desktop printers
    • Unified API for managing discovered printers
  • 🛠️ Error Handling
    • Custom exceptions for invalid files, unconnected devices, and unsupported operations

Getting Started

Add this to your package's pubspec.yaml file:

dependencies:
  quick_print: <LASTEST_VERSION>

Then run:

flutter pub get

Usage

Basic Usage
import 'package:quick_print/quick_print.dart';

// Create a printer instance
final printer = QuickPrint(PrinterDeviceType.mobile);

// Print a PDF file
await printer.instance.print(
  path: 'assets/document.pdf',
  paperSize: PaperSize.a4,
);

// Print an image (as Uint8List)
final imageBytes = await File('assets/image.png').readAsBytes();
await printer.instance.printImage(
  bytes: imageBytes,
  paperSize: PaperSize.a4,
);
Printer Discovery

The PrinterDiscoveryService class allows you to discover printers on various platforms.

import 'package:quick_print/quick_print.dart';

final discoveryService = PrinterDiscoveryService();

// Initialize the service (required for BLE on Windows)
await discoveryService.initialize();

// Discover printers
await discoveryService.discoverDevices();

// List discovered printers
final printers = discoveryService.printerDevicesList;
printers.forEach((printer) {
  print('Discovered printer: ${printer.name}');
});

// Dispose of the service when done
discoveryService.dispose();
Bluetooth Printer
import 'package:quick_print/quick_print.dart';

// Create a Bluetooth printer model
final bluetoothModel = BluetoothPrinterModel(
  name: 'Thermal Printer',
  address: '00:11:22:33:44:55',
  isBle: false,
);

// Create a printer instance
final printer = QuickPrint(PrinterDeviceType.bluetooth);

// Print with the Bluetooth printer
await printer.instance.print(
  path: 'assets/receipt.pdf',
  paperSize: PaperSize.mm80,
  model: bluetoothModel,
);
USB Printer
import 'package:quick_print/quick_print.dart';

// Create a USB printer model
final usbModel = UsbPrinterModel(
  name: 'POS-58',
  productId: '0x0483',
  vendorId: '0x5740',
);

// Create a printer instance
final printer = QuickPrint(PrinterDeviceType.usb);

// Print with the USB printer
await printer.instance.print(
  path: 'assets/receipt.pdf',
  paperSize: PaperSize.mm58,
  model: usbModel,
);

Platform-specific Setup

Android

Add the following permissions to your AndroidManifest.xml:

<!-- For Bluetooth printers -->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>

<!-- For USB printers -->
<uses-feature android:name="android.hardware.usb.host"/>
iOS

Add the following to your Info.plist:

<key>UISupportedExternalAccessoryProtocols</key>
<array>
    <string>com.printer.protocol</string>
</array>

<!-- For Bluetooth printers -->
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Need BT access for printing</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Need BT access for printing</string>
macOS

Add the following entitlements to your app:

com.apple.security.print
com.apple.security.device.usb
com.apple.security.device.bluetooth

Error Handling

The package uses custom exceptions for error handling:

  • PrinterException: General printer errors
  • InvalidFileException: Errors related to invalid files
  • InvalidTypeException: Errors for invalid printer models
  • UnConnectedDeviceException: Errors for unconnected devices

Example:

try {
  await printer.instance.print(
    path: 'assets/document.pdf',
    paperSize: PaperSize.a4,
  );
} on PrinterException catch (e) {
  print('Printing failed: ${e.message}');
  if (e.cause != null) {
    print('Cause: ${e.cause}');
  }
}

Additional Information

  • Documentation: Full API documentation is available here.
  • Examples: Check the example directory for more detailed examples.
  • Issues: File issues, bugs, or feature requests here.
  • Contributing: See CONTRIBUTING.md for guidelines.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For support and questions, please:

  1. Check the FAQ section
  2. Search for existing issues
  3. Create a new issue if needed

Acknowledgments

  • Thanks to all contributors who have helped make this package better
  • Special thanks to the Flutter and Dart teams for their amazing work

/// Printer implementation for USB-connected printers. class UsbPrinter extends IConnectionPrinter { }