UIPrintInteractionController打印问题

时间:2012-06-01 17:00:03

标签: airprint

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

以下是点击操作按钮时执行的代码。

- (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];

    }
}
}

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

1 个答案:

答案 0 :(得分:2)

printingItem的{​​{1}}属性为documented,仅支持PDF和图片数据:

  

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

如果要使用UIPrintInteractionController打印非PDF,非图像数据(如Office文档),则必须使用UIPrintInteractionController属性。

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

中有记录
  

UIViewPrintFormatter类的实例列出了用于打印的视图的绘制内容。视图的内容可以跨越多个页面。

     

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

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