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.
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 errorsInvalidFileException
: Errors related to invalid filesInvalidTypeException
: Errors for invalid printer modelsUnConnectedDeviceException
: 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:
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 { }
Libraries
- 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.