iPhone – tisk z iPhone
Z aplikace napsané pro iPhone nebo jiné podobné zařízení lze snadno tisknout dokumenty na lokálních tiskárnách.
Vytvoření tiskového dialogu
Pro vytvoření dialogu pro tisk použijeme komponentu UIPrintInteractionController, kterou můžeme standartně navázat na událost například kliknutí na tlačítko.
UIPrintInteractionController si sám vytváří interface pro tisk, včetně tiskového dialogu.
Můžeme si tedy vytvořit akci:
1 2 3 |
- (IBAction)printPage:(id)sender{ UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; } |
Po vytvoření controlleru bychom měli provést kontrolu, zda systém samotný k němu má přístup, můžeme provést standartně:
1 2 3 4 |
if(!controller){ NSLog(@"Couldn't get shared UIPrintInteractionController!"); return; } |
Tím zjistíme, zda je možné UIPrintInteractionController použít a pokud ne, můžeme případ ošetřit.
V případě že je vše vpořádku, vytvoříme tiskový handler:
1 2 3 4 5 6 7 |
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { if(!completed && error){ NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code); } }; |
který je obsahem funkce pro vyovolanou událost.
Pro nastavení tisku máme k dispozici UIPrintInfo, ve kterém můžeme nastavovat vlastnosti tisku, uspořádání tisku, atp.
Můžeme jej nastavit pomocí [controller setPrintInfo:<#(UIPrintInfo *)#>], takže v našem kódu například:
1 2 3 4 5 6 |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; printInfo.outputType = UIPrintInfoOutputGeneral; printInfo.jobName = @"job_name"; printInfo.duplex = UIPrintInfoDuplexLongEdge; controller.printInfo = printInfo; controller.showsPageRange = YES; |
Vlastností které můžeme nastavovat je spousta, stačí mrknout do dokumentace.
PrintFormater
Pro samotný tisk si vytvoříme PrintFormater, který bude vytvářet strukturu, kterou tiskneme. V tomto případě si můžeme například vytvořit HTML kód, který se bude posílat na tiskárnu, aby bylo vidět možnosti tisku:
1 2 |
UIMarkupTextPrintFormatter *htmlFormater = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText: [self getPrintString]]; |
Do formateru předáváme text, který se bude zpracovávat, a který se bude zobrazovat na výstupu. V tomto případě pro testovací účely jsem vytvořil funkci, která text vrací:
1 2 3 4 5 6 7 8 |
- (NSString *)getPrintString{ NSString *text = @""; for (int i = 0; i < 400; i++) { text = [NSString stringWithFormat:@"%@text line<br />", text]; } return text; } |
Funkce vrací 400 řádků textu, která se bude tisknout.
Do našeho controlleru jej předáme pomocí:
1 |
controller.printFormatter = htmlFormater; |
Printing handler
Celý handler pro tisk může tedy vypadat následovně, podle našeho vytvořeného příkladu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
- (NSString *)getPrintString{ NSString *text = @""; for (int i = 0; i < 400; i++) { text = [NSString stringWithFormat:@"%@text line<br />", text]; } return text; } - (IBAction)printPage:(id)sender{ UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; if(!controller){ NSLog(@"Couldn't get shared UIPrintInteractionController!"); return; } void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { if(!completed && error){ NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code); } }; UIPrintInfo *printInfo = [UIPrintInfo printInfo]; printInfo.outputType = UIPrintInfoOutputGeneral; printInfo.jobName = @"job_name"; printInfo.duplex = UIPrintInfoDuplexLongEdge; controller.printInfo = printInfo; controller.showsPageRange = YES; UIMarkupTextPrintFormatter *htmlFormater = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText: [self getPrintString]]; controller.printFormatter = htmlFormater; [controller presentAnimated:YES completionHandler:completionHandler]; } |
Spuštění iPhone printer simulator
Abychom mohli správně testovat tisk, budeme potřebovat tisk simulovat v prostředí, ve kterém vyvýjíme. Stejně tak budeme potřebovat vyzkoušet jak tisk vypadá a zda probíhá správně.
Pro tyto účely si spustíme aplikaci Printer Simulator, kterou najdeme v:
1 |
/Developer/Platforms/iPhoneOS.platform/Developer/Applications/ |
Po spuštění se nám zobrazí dialogové okno:
Tisk z iPhone
Samotný tisk a jeho dialogová okna potom budou vypadat následovně:
Tiskový dialog, který se otevře po kliknutí na tisk
Výběr tiskáren, které jsou lokálně k dispozici.
Výběr stránek, které budou pro tisk použity.
Vytištěný dokument a dialog pro tisknutí. Z dialogu je možné se vrátit zpět.
Docela složité, neexistuje nějaká aplikace která tohle umí?