我在自定义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];
}
}
}
我无法想象这个问题。请帮忙......
答案 0 :(得分:2)
printingItem
的{{1}}属性为documented,仅支持PDF和图片数据:
该对象必须是NSURL,NSData,UIImage或ALAsset类的实例。前两种类型的对象必须引用或包含图像数据或PDF数据。
如果要使用UIPrintInteractionController
打印非PDF,非图像数据(如Office文档),则必须使用UIPrintInteractionController
属性。
您可以通过其打印格式化程序打印printFormatter
,UIWebView
和UITextView
内容,而无需任何自定义逻辑。这在UIViewPrintFormatter documentation:
UIViewPrintFormatter类的实例列出了用于打印的视图的绘制内容。视图的内容可以跨越多个页面。
三个系统类的实例为应用程序提供了可用的视图打印格式化程序:UIKit框架的UIWebView和UITextView以及Map Kit框架的MKMapView。要获取打印作业的视图打印格式化程序,请调用UIView方法viewPrintFormatter并初始化打印格式化程序的继承布局属性。
不幸的是,MKMapView
的观点没有记录为返回有效的QLPreviewController
。这意味着您将无法使用viewPrintFormatter
滚动自己的自定义打印代码。取而代之的是,您可以考虑使用QLPreviewController
来呈现文档。