From 57061da20d15717897243ad81c64d7e8502a38a5 Mon Sep 17 00:00:00 2001 From: Mark M2 Macbook Date: Mon, 11 May 2026 20:44:17 +0200 Subject: [PATCH] a --- .../tickets/ui/ticket_form_screen.dart | 51 +++++++++++++------ .../tickets/utils/ticket_pdf_service.dart | 13 ++--- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/lib/features/tickets/ui/ticket_form_screen.dart b/lib/features/tickets/ui/ticket_form_screen.dart index 659364f..9510c57 100644 --- a/lib/features/tickets/ui/ticket_form_screen.dart +++ b/lib/features/tickets/ui/ticket_form_screen.dart @@ -1,3 +1,5 @@ +import 'package:flutter/foundation.dart'; // Per kIsWeb +import 'dart:io' show Platform; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flux/core/blocs/session/session_cubit.dart'; @@ -179,19 +181,25 @@ class _TicketFormScreenState extends State { _ActionButton( icon: Icons.print, label: "Ricevuta A4", - onTap: () { - TicketPdfService().generateTicketReceipt(ticket); - - // 1. Costruiamo la struttura (velocissimo) - /* final doc = await TicketPdfService() + onTap: () async { + final doc = await TicketPdfService() .generateTicketReceipt(ticket); + final bytes = await doc.save(); + final fileName = 'Ricevuta_${ticket.referenceId}.pdf'; - // 2. Lanciamo layoutPdf esattamente come facevi tu! - await Printing.layoutPdf( - name: 'Ricevuta_${ticket.referenceId}.pdf', - onLayout: (PdfPageFormat format) async => - doc.save(), // La magia è qui! - ); */ + if (kIsWeb || Platform.isMacOS) { + // Forza il download/salvataggio senza passare per il print spooler + await Printing.sharePdf( + bytes: bytes, + filename: fileName, + ); + } else { + // Su Android/iOS continuiamo a usare la stampa diretta che funziona + await Printing.layoutPdf( + onLayout: (format) async => bytes, + name: fileName, + ); + } }, ), if (company.labelFormat != LabelFormat.none) @@ -201,12 +209,23 @@ class _TicketFormScreenState extends State { onTap: () async { final doc = await TicketPdfService().generateLabelPdf( ticket, - company, - ); - await Printing.layoutPdf( - name: 'Etichetta_${ticket.referenceId}.pdf', - onLayout: (PdfPageFormat format) async => doc.save(), ); + final bytes = await doc.save(); + final fileName = 'Ricevuta_${ticket.referenceId}.pdf'; + + if (kIsWeb || Platform.isMacOS) { + // Forza il download/salvataggio senza passare per il print spooler + await Printing.sharePdf( + bytes: bytes, + filename: fileName, + ); + } else { + // Su Android/iOS continuiamo a usare la stampa diretta che funziona + await Printing.layoutPdf( + onLayout: (format) async => bytes, + name: fileName, + ); + } }, ), _ActionButton( diff --git a/lib/features/tickets/utils/ticket_pdf_service.dart b/lib/features/tickets/utils/ticket_pdf_service.dart index c635bf2..33bbb72 100644 --- a/lib/features/tickets/utils/ticket_pdf_service.dart +++ b/lib/features/tickets/utils/ticket_pdf_service.dart @@ -1,3 +1,5 @@ +import 'dart:typed_data'; + import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:get_it/get_it.dart'; import 'package:pdf/pdf.dart'; @@ -10,7 +12,7 @@ class TicketPdfService { final CompanyModel company = GetIt.I.get().state.company!; /// Funzione principale: Genera il PDF A4 con le due metà - Future generateTicketReceipt(TicketModel ticket) async { + Future generateTicketReceipt(TicketModel ticket) async { final pdf = pw.Document(); // Carichiamo il font per essere sicuri che i caratteri siano ok @@ -64,9 +66,7 @@ class TicketPdfService { ), ); - final savedPdf = await pdf.save(); - - await Printing.layoutPdf(onLayout: (PdfPageFormat format) => savedPdf); + return pdf; } /// Helper per costruire una singola metà (Cliente o Negozio) @@ -282,10 +282,7 @@ class TicketPdfService { ); } - Future generateLabelPdf( - TicketModel ticket, - CompanyModel company, - ) async { + Future generateLabelPdf(TicketModel ticket) async { final pdf = pw.Document(); final font = await PdfGoogleFonts.robotoRegular(); final boldFont = await PdfGoogleFonts.robotoBold();