Cari lettori, quello che vi presento oggi è un breve ed efficace tutorial per l’utilizzo della funzione AirPrint all’interno delle applicazioni iOS. CocoaTouch ci mette a disposizione un controllore per l’interazione con le stampanti supportate da AirPrint, chiamato UIPrintInteractionController. Questo controllore, che invocheremo sempre sulla sua istanza shared sharedPrintController, ci permette di interagire con un’interfaccia utente per la gestione e la stampa dei documenti in formato PDF, immagini ed altri contenuti disponibili su iOS. sharedPrintController, rappresenta un job di stampa. Esso include il contenuto da stampare e le informazioni relative alla stampa stessa (nome job, tip di stampa, pagine da stampare, etc.).
Stampare un PDF dalla nostra applicazione iPhone o iPad
L’utilizzo del controllore è quando di più semplice possa esserci. Proviamo a vedere come istanziare ed istruire il nostro codice per stampare un PDF.
- (void)printdoc:(NSData *)myData {
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
if(pic && [UIPrintInteractionController canPrintData: myData] ) {
pic.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = @"AllertaSoglie";
printInfo.duplex = UIPrintInfoDuplexLongEdge;
pic.printInfo = printInfo;
pic.showsPageRange = YES;
pic.printingItem = myData;
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
if (!completed && error) {
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Attenzione"
message:@"Si è verificato un errore durante la stampa.\nControlla le impostazioni di AirPrint e riprova."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[anAlert show];
[anAlert release];
}
};
[pic presentAnimated:YES completionHandler:completionHandler];
}
}
Come funziona? La prima cosa da fare è ottenere un riferimento all’istanza shared di UIPrintInteractionController.
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
Se il risultato è un valore non NULL, allora possiamo procedere con le successive operazioni di configurazione:
pic.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = @"AllertaSoglie";
Assegnamo come delegato della nostra istanza shared la classe stessa, che implementa il metodo sopra (tipicamente un UIViewController) avendo cura di aggiungere nella sua dichiarazione di classe, la conformità al protocollo UIPrintInteractionControllerDelegate.
Successivamente invochiamo sull’istanza shared, il metodo printInfo che ci ritorna un oggetto che incapsula al suo interno informazioni circa il job che stiamo per eseguire.
Una volta ottenuta questa informazione, possiamo customizzare il job con alcune informazioni personali del job in essere, quali il tipo di output (nel nostro caso UIPrintInfoOutputGeneral, specifica che ci troviamo di fronte ad un documento misto immagini, testo, etc.), il nome del job e la modalità di stampa duplex.
pic.printInfo = printInfo;
pic.showsPageRange = YES;
pic.printingItem = myData;
Riassegniamo l’oggetto così modificato all’istanza shared ed aggiungiamo due ulteriori informazioni. showsPageRange ci permette di mostrare il range di pagine da stampare e pic.printingItem assegna l’oggetto NSData (il nostro PDF) da stampare.
A questo punto, siamo quasi pronti per invocare la stampa, o meglio mostrare il controllore modale che lancerà la stampa. Prima, però, abbiamo bisogno di creare un blocco che gestisca le eccezioni di stampa (ad esempio, se qualcosa và male, la stampante non è in linea, etc.).
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
if (!completed && error) {
UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Attenzione"
message:@"Si è verificato un errore durante la stampa.\nControlla le impostazioni di AirPrint e riprova."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[anAlert show];
[anAlert release];
}
};
Il blocco sopra, serve proprio a questo. In pratica, quello che facciamo è creare una funzione (o blocco) di nome completionHandler che verrà eseguita SOLO in caso di non completamento o altri errori. Se vogliamo customizzare il messaggio, possiamo utilizzare i parametri passati come argomento alla funzione (pic, completed ed error).
In queto caso, giusto per rendere le cose più semplici, mostreremo un generico messaggio di errore, che ci notifica che qualcosa è andato storto.
Adesso, possiamo mostrare il nostro controllore modale, con l’istruzione:
[pic presentAnimated:YES completionHandler:completionHandler];
Il controllo della nostra applicazione, passerà alla finestra modale che ci mostra cosa stiamo per stampare, come da figura. Se siamo in prossimità di una stampante che supporta AirPrint, avremo la possibilità di stampare il documento.
Abilitare qualsiasi stampante con AirPrint
Un’ultima cosa. Per testare il sistema è possibile utilizzare un simpatico hack che trovate in rete (http://netputing.com/airprintactivator/airprint-activator-v2-0/). In questo modo potrete rendere compatibile una stampante generica con il protocollo AirPrint, attraverso l’uso di un computer Mac/Windows.
Supportaci
Questa funzione, insieme a tante altre caratteristiche, è stata aggiunta alla nuova versione di AllertaSoglie. Se vi è piaciuto quest’articolo (ed avete bisogno di AllertaSoglie) vi invito a scaricarlo da AppStore. Questo servirà a supportarmi e a far si che possa proporvi sempre nuovi ed interessanti articoli.
Grazie per l’attenzione.
10 Responses to “T#101 – Integrare AirPrint per stampare dalle applicazioni iPhone e iPad”
13 Settembre 2011
Installoso AppsincoMa così non va, eh? Adesso mi leggete pure nel pensiero?! Era questo il tutorial che speravo faceste, giuro che ci pensavo proprio ieri sera!!! Grandi come sempre ;)!
23 Ottobre 2011
tommasoSe volessi stampare una webview?
29 Ottobre 2011
DaniloMa se quello che voglio stampare non è un PDF? 🙂
24 Novembre 2011
Adrianoaiuto, non ho ben capito come si usa questo tutorial, ho copiato il tutto nel mio file .m, ho dichiarato l’azione nel mio file .h, ho creato un bottone nella pagina che vorrei stampare nel mio file.xib, ho collegato l’azione con il file owner, ho aggiunto nel mio file .h in questo modo:
@interface viste3ViewController : UIViewController {
non ho nessun tipo di errore ma neanche funziona nulla, cosa devo fare ulteriormente? please, niente paroloni che non me ne intendo.
24 Novembre 2011
Adrianonella dichiarazione di sopra mancano le dichiarazione dei delegati che non mi sono state stampate, ci riprovo…
@interface viste3ViewController : UIViewController {
24 Novembre 2011
Adrianonon ha funzionato, proviamo cosi’
@interface viste3ViewController : UIViewController {
24 Novembre 2011
Adrianoneanche ora ha funzionato, lo scivero a parole:
@interface viste3ViewController : UIViewController “SIMBOLO DI MINORE” UITextFieldDelegate, UIPrintInteractionControllerDelegate”SIMBOLO DI MAGGIORE” {
24 Novembre 2011
AdrianoFINALMENTE cell’ho fatta… cosa mi manca per far funzionare tutto?
16 Gennaio 2012
FABIOraga non è possibile avere il progetto in formato zip?? ho qualche difficoltà nell esecuzione
Grazie
17 Gennaio 2012
FABIOtutto risolto grazie lo stesso 🙂