3

我在自定义 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];

    }
}
}

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

4

1 回答 1

2

printingItem属性UIPrintInteractionController记录为仅支持 PDF 和图像数据:

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

如果要用于UIPrintInteractionController打印 Office 文档等非 PDF、非图像数据,则必须改为使用该printFormatter属性。

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

UIViewPrintFormatter 类的一个实例布置视图的绘制内容以进行打印。视图的内容可以跨越多个页面。

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

不幸的QLPreviewController是,没有记录为返回有效的viewPrintFormatter. 这意味着您将无法使用QLPreviewController. 取而代之的是,您可以考虑使用 aUIWebView来呈现文档。

于 2012-10-25T23:19:06.243 回答