2012-06-01 97 views
3

我添加了一个动作按钮到我的自定义QLPreviewController的navigationItem。当点击动作按钮时,我呈现一个UIPrintInteractionController。 我从我的应用程序的文档目录中获取文件。预览时没有问题。但是当我通过点击操作按钮打印相同的文件时,[UIPrintInteractionController canPrintData:data]返回false。但它的工作原理是,如果文件在我的应用程序根目录中。UIPrintInteractionController打印问题

下面是代码,点击操作按钮时执行。

- (void)tappedPrintButton:(id) sender { 
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController]; 

NSURL *fileURL = (NSURL *)[self currentPreviewItem]; 

NSData *data = [NSData dataWithContentsOfURL:fileURL]; 

if (pic && [UIPrintInteractionController canPrintData:data]) { 

    pic.delegate = self; 



    UIPrintInfo *printInfo = [UIPrintInfo printInfo]; 

    printInfo.outputType = UIPrintInfoOutputGeneral; 

    printInfo.jobName = [(NSURL *)[self.files objectAtIndex:0] lastPathComponent]; 

    printInfo.duplex = UIPrintInfoDuplexLongEdge; 

    pic.printInfo = printInfo; 

    pic.showsPageRange = YES; 

    pic.printingItem = data; 



    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = 

    ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { 

     if (!completed && error) 

      NSLog(@"FAILED! due to error in domain %@ with error code %u", 

        error.domain, error.code); 

    }; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 

     [pic presentFromBarButtonItem:self.myActionBarButton animated:YES 

        completionHandler:completionHandler]; 

    } else { 

     [pic presentAnimated:YES completionHandler:completionHandler]; 

    } 
} 
} 

我无法想象这个问题。请帮助...

回答

2

UIPrintInteractionControllerprintingItem属性是documented只支持PDF和图像数据:

的对象必须是NSURL,NSData的,UIImage的,或ALAsset类的一个实例。前两种类型的对象必须引用或包含图像数据或PDF数据。

如果你想使用UIPrintInteractionController打印非PDF,非图像数据,如Office文档,您必须改用printFormatter属性。

您可以通过其打印格式化程序打印UIWebViewUITextViewMKMapView内容,而无需任何自定义逻辑。这在UIViewPrintFormatter documentation中有记录:

UIViewPrintFormatter类的一个实例展示了打印视图的绘制内容。视图的内容可以跨越多个页面。

三个系统类的实例为应用程序提供可用的视图打印格式器:UIKit框架的UIWebView和UITextView以及Map Kit框架的MKMapView。要获取打印作业的视图打印格式化程序,请调用UIView方法viewPrintFormatter并初始化打印格式程序的继承布局属性。

不幸的是,QLPreviewController的视图没有记录为回送有效的viewPrintFormatter。这意味着您将无法使用QLPreviewController滚动您自己的自定义打印代码。取而代之,您可以考虑使用UIWebView来呈现文档。