You need to enable JavaScript to run this app. Objective C PDFKit:PDF预览正常但打印报错解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 14:54:06