Objective C PDFKit:PDF预览正常但打印报错解决
问题根因
printWithInfo并非系统PDFKit提供的公开方法,该接口属于第三方商业PDF SDK(如PSPDFKit)的自定义实现,未集成对应SDK时直接调用,必然触发Unrecognised Method崩溃。- 现有代码中
[pdfView.document allowsPrinting];为无效调用:该接口是返回布尔值的只读属性,作用是判断PDF本身是否设置了打印权限限制,并非打印流程的触发入口,调用后不会启动任何打印逻辑。 - 存在引用缺陷:当前代码中的
pdfView为方法内局部变量,仅通过视图层级被持有,打印逻辑所在的其他方法无法访问到它持有的PDFDocument实例,会导致打印流程拿不到有效文档源。
稳定可运行的实现方案
1. 修正变量引用
将原局部变量pdfView改为类私有属性,确保整个类生命周期内可访问文档实例:
// 类匿名扩展中声明 @interface YourViewController () <PDFViewDelegate> @property (nonatomic, strong) PDFView *pdfView; @end
将原初始化代码中的局部变量赋值替换为属性赋值,后续所有布局、文档加载逻辑中,把原代码里的pdfView替换为self.pdfView即可,原有预览、缩略图的功能逻辑完全不需要改动。
2. 替换错误的打印调用
完全移除对printWithInfo的调用,基于系统原生打印能力实现全流程,无额外SDK依赖:
- (void)triggerPrint { // 前置校验 if (!self.pdfView.document) { NSLog(@"无有效PDF文档,无法打印"); return; } if (![self.pdfView.document allowsPrinting]) { NSLog(@"当前PDF已限制打印权限"); return; } // 初始化打印配置 UIPrintInfo *printInfo = [UIPrintInfo printInfo]; printInfo.outputType = UIPrintInfoOutputGeneral; printInfo.jobName = self.pdfView.document.documentAttributes[@"Title"] ?: @"未命名PDF"; printInfo.duplex = NO; // 获取系统共享打印控制器 UIPrintInteractionController *printVC = [UIPrintInteractionController sharedPrintController]; printVC.printInfo = printInfo; // 传入PDF原生二进制数据作为打印源,系统自动处理矢量内容输出,打印清晰度与源文件一致 printVC.printingItem = [self.pdfView.document dataRepresentation]; // 适配iPad的打印面板弹出逻辑 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { printVC.printPage = [UIPrintPaper bestPaperForPageSize:CGSizeMake(215.9, 279.4) withPapersFromArray:@[]]; } // 唤起打印面板 [printVC presentAnimated:YES completionHandler:^(UIPrintInteractionController * _Nonnull printInteractionController, BOOL completed, NSError * _Nullable error) { if (completed && !error) { NSLog(@"打印任务提交成功"); } if (error) { NSLog(@"打印失败:%@", error.localizedDescription); } }]; }
关键注意事项
- 不需要手动遍历PDF页面做截屏渲染:直接传递PDF的原生数据作为打印源,系统会保留矢量内容,不会出现打印模糊的问题,实现复杂度更低。
- 上述实现基于系统原生PDFKit与打印框架,支持iOS 11及以上所有系统版本,无版本兼容问题。
- 如需自定义打印范围(如仅打印指定页面),可通过自定义
UIPrintPageRenderer结合PDFKit的页面渲染能力实现,不需要改动核心打印流程。
内容的提问来源于stack exchange,提问作者Paras Saini
相关产品推荐
相关产品推荐

