AirPrint для неподдерживаемых форматов (.doc, .ppt, .xls и т. д.) работает, НО с запахом кода

Используя подсказку в этот вопрос можно распечатать DOCX, PDF, ..., загрузив его в UIWebView:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];

Теперь, чтобы получить filePath, я записываю документ для печати в каталог приложения tmp/:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSString* filePath = [NSString stringWithFormat:@"%@/%@.%@", NSTemporaryDirectory(), documentName, mimeType];
[fileManager createFileAtPath:filePath contents:documentData attributes:nil];

Мне просто нужно загрузить NSData (документ) в UIWebView, чтобы распечатать его. Можно ли получить filePath документа напрямую (без записи на диск)?

Уже пробовал [webView loadData:documentData MIMEType:mimeType textEncodingName:nil baseURL:nil]; и его вариации.


Все это:

UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
if (pic)
{
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlackOpaque];
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    printInfo.jobName = documentName;
    pic.printInfo = printInfo;

    // Apple-supported formats (.pdf & some images)
    if ([UIPrintInteractionController canPrintData:documentData]) 
        pic.printingItem = documentData;
    // Apple-un-supported formats (.doc, .xls, .ppt, ...)
    else 
    {
        NSFileManager* fileManager = [NSFileManager defaultManager];
        NSString* filePath = [NSString stringWithFormat:@"%@/%@.%@", NSTemporaryDirectory(), documentName, mimeType];
        [fileManager createFileAtPath:filePath contents:documentData attributes:nil];

        UIWebView* webView = [UIWebView new];
        [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
        pic.printFormatter = webView.viewPrintFormatter;
    }

    void (^completionHandler)(UIPrintInteractionController *,    BOOL,           NSError *) =
                            ^(UIPrintInteractionController *pic, BOOL completed, NSError *error)
    {
        if (!completed && error)
            NSLog(@"Printing error in domain %@ with error code %u", error.domain, error.code);
    };
    [pic presentAnimated:YES completionHandler:completionHandler];
}

person Blaz    schedule 28.10.2013    source источник
comment
Ваш нынешний подход работает? Потому что у меня такая же проблема (печатать doc(x), xls(x) и т.д.), и даже записать файлы на диск не получилось. Но нет, вы можете получить путь к файлу только в том случае, если файл записан на диск.   -  person Marc    schedule 01.11.2013
comment
@MarcMosby, да, описанный выше подход работает: форматирование на бумаге не идеально, но, по крайней мере, содержание есть. Вопрос поставлен только потому, что подходом пахнет... разве что действительно нет лучшего способа добраться до filePath (или еще какого-нибудь годного хэндла).   -  person Blaz    schedule 01.11.2013