Skip to content

自定义 UI

“ComPDFKit_Tools” 文件夹包含了可引导快速集成 ComPDFKit PDF SDK 的 UI 组件。我们还使用这个 UI 组件库构建了6个独立的功能程序,分别是 ViewerAnnotationsContentEditorFormsDocsEditorDigitalSignature。此外,我们还开发了一个叫做 PDFViewer 的程序,它集成了所有以上提到的示例功能供您参考。在本节中,我们会从以下几部分介绍如何使用它:

  1. "ComPDFKit_Tools" 概述: 展示文件夹结构和对应的功能板块。

  2. UI 组件:介绍 UI 组件以及如何轻松快速地使用它们。

  3. 使用 CPDFListView 类: 包含使用 CPDFListView的详细步骤。

  4. 了解更多:展示适用于 iOS 开发平台的特殊代码结构和功能。

如何使用默认 UI 制作 iOS 应用程序

ComPDFKit PDF SDK 的 "ComPDFKit_Tools" 是示例工程的 UI 组件库,它包括应用程序的基本 UI。要使用 ComPDFKit PDF SDK 的默认 UI 制作自定义的 iOS 应用程序 UI,可在 Lib/Tools/Objective-C/Lib/Tools/Swift/ 路径中找到对应开发语言的 "ComPDFKit_Tools" 文件,并引入到你的工程中。

"ComPDFKit_Tools" 概述

"ComPDFKit_Tools" 中有九个模块: "Common""Viewer""Annotations""ContentEditor""Forms""DocsEditor""DigitalSignature""Security""Watermark"。如下表所示,每个模块都包含对应 PDF 功能的代码和 UI 组件。

FolderSubfolderDescription
Common-包含 Viewer、Annotations、ContentEditor、Forms 和 DocsEditor 模块的可复用的 UI 组件以及视图控制器。
ViewerPDFBookmark包含实现文档书签列表和页面跳转的 UI 组件以及视图控制器。
PDFOutline包含实现文档大纲和大纲跳转的 UI 组件以及视图控制器。
PDFSearch包含实现文档搜索功能和生成搜索列表的 UI 组件以及视图控制器。
PDFMoreMenu包含实现阅读设置、获取文档信息、文档分享、文档选择和文档页面编辑的 UI 组件以及视图控制器。
PDFThumbnail包含实现文档缩略图的 UI 组件以及视图控制器。
AnnotationsPDFAnnotationBar包含实现修改注释属性和返回/撤销返回注释的操作的工具栏。
PDFAnnatationList包含实现注释列表的 UI 组件以及视图控制器。
PDFAnnotationProperties包含实现修改注释属性的属性面板以及视图控制器。
ContentEditorPDFEditBar包含实现 PDF 文字编辑、图片编辑和返回/撤销返回对文字/图片的操作的工具栏。
PDFEditProperties包含实现文档文字编辑和图片编辑的属性面板以及视图控制器。
FormsPDFFormBar包含实现修改表格属性和返回/撤销返回对表格属性的操作的工具栏。
PDFFormProperties包含实现修改表格属性的属性面板以及视图控制器。
DocsEditorPDFPageEdit包含实现文档页面编辑的 UI 控件以及视图控制器。
PDFPageEditBar实现新页面创建、页面替换、旋转、提取和删除的工具栏。
PDFPageEditInsert实现空白页面创建和 PDF 文档页面插入的 UI 组件以及视图控制器。
DigitalSignaturePDFDigitalSignatureBar包含创建 Form 签名域、填写数字签名和验证数字签名的工具栏。
PPDFDigitalSignatureProperties包含实现修改数字签名属性和外观的属性面板以及视图控制器。
WatermarkWatermarkSetting包含实现图片水印和文字水印属性的属性面板,以及实现水印平铺的视图。
Security-包含实现添加和移除文档开启密码和设置权限密码的属性面板。

UI 组件

本节主要介绍 "ComPDFKit_Tools" 的 UI 组件与 API 配置之间的联系,这不仅可以帮助你快速上手 ComPDFKit 默认的 UI,还可以帮助你查看相关的API配置。这些 UI 组件可以被使用和修改,以创建你自定义的 UI。

Part 1:

2-11-1

上图的左图显示了与 Viewer 模块 API 相关的主要 UI 组件,这些也是 "ComPDFKit_Tools" 的基本 UI 组件。上图的右图显示了与 Text search 的 API 相关的主要 UI 组件。以下是 UI 组件和 APIs 之间对应的详细情况。

编号功能模块功能描述
1-1PDFListViewCPDFListView见 2.5.3 使用 CPDFListView 类。
1-2Tools switcherCPDFToolsViewController功能模式切换。
1-3Text searchCSearchToolbar进入搜索模式。
1-4BOTACPDFBOTAViewController进入大纲、书签和注释模块。
1-5MoreCPDFPopMenuView进入 More 菜单。
1-6ThumbnailsCPDFThumbnailViewController进入文档缩略图.
1-7BackCNavBarButtonItem退出预览界面。
1-8ToolsCToolModel功能模式切换的枚举类型。
1-9SliderCPDFSlider允许用户快速跳过页面。
1-10Search toolbarCSearchToolbar允许关键字搜索。
1-11Search listCPDFSearchResultsViewController搜索结果列表。
1-12Search settingCSearchSettingViewController允许用户设置搜索属性。
1-13Replace toolbarCSearchToolbar允许关键字搜索和替换。
1-14Replace menuCSearchContentView允许替换单个关键字的上下文菜单。

以下是初始化 Tools switcher (编号2) 的方法:

swift
// CPDFToolsViewController:初始化CToolModel类型的数组toolArrays
// toolArrays:保存Tools展示模式的类型和数量
let toolsVc = CPDFToolsViewController(customizeWithToolArrays: [NSNumber(value: CPDFToolFunctionTypeState.viewer.rawValue),
                                                                        NSNumber(value: CPDFToolFunctionTypeState.edit.rawValue),
                                                                        NSNumber(value: CPDFToolFunctionTypeState.annotation.rawValue),
                                                                        NSNumber(value: CPDFToolFunctionTypeState.form.rawValue)])
objective-c
// CPDFToolsViewController:初始化CToolModel类型的数组toolArrays
// toolArrays:保存Tools展示模式的类型和数量
CPDFToolsViewController * toolsVc = [[CPDFToolsViewController alloc] initCustomizeWithToolArrays:@[@(CToolModelViewer),@(CToolModelEdit),@(CToolModelAnnotation),@(CToolModelForm)]];

以下是初始化 BOTA(编号4)的方法:

swift
// CPDFBOTAViewController:初始化CPDFListview对象 - pdfView,和CPDFBOTATypeState类型数组 - navArrays
// navArrays:保存BOTA展示的列表类型和数量
  let navArrays: [CPDFBOTATypeState] = [.CPDFBOTATypeStateOutline,
                                        .CPDFBOTATypeStateBookmark,
                                        .CPDFBOTATypeStateAnnotation]
        if(self.pdfListView != nil) {
            let botaViewController = CPDFBOTAViewController(customizeWith: self.pdfListView!, navArrays: navArrays)
        }
objective-c
// CPDFBOTAViewController:初始化CPDFListview对象 - pdfView,和CPDFBOTATypeState类型数组 - navArrays
// navArrays:保存BOTA展示的列表类型和数量
CPDFBOTAViewController *botaVC = [[CPDFBOTAViewController alloc] initCustomizeWithPDFView:pdfListView navArrays:@[@(CPDFBOTATypeStateOutline),@(CPDFBOTATypeStateBookmark),@(CPDFBOTATypeStateAnnotation)]];

Part 2:

2-11-2

上面的左图展示了与CPDFBOTAViewController API 关联的主要 UI 组件。上面的右图展示了与CPDFPopMenuView API 关联的主要UI组件。请参阅以下 UI 组件与 API 的对应情况。

编号功能模块功能描述
2-1OutlinesCPDFOutlineViewController进入文档大纲。
2-2BookmarksCPDFBookmarkViewController进入文档书签列表。
2-3AnnotationsCPDFAnnotationViewController进入文档注释列表。
2-4View settingCPDFDisplayViewController进入文档页面设置。
2-5Page editCPDFPageEditViewController进入文档页面编辑。
2-6Document infoCPDFInfoViewController进入文档信息列表。
2-7Save-文档保存。
2-8Save as Flattened-文档另存为Flattened副本。
2-9Share-文档分享。
2-10Open-选择文档。

Part 3:

2-11-3

上面的左图展示了与 Annotations API 关联的主要 UI 组件。上面的右图展示了与ContentEditor API 关联的主要 UI 组件。请参阅以下 UI 组件与 API 的对应情况。

NumberNameFunctionalityDescription
3-1Annotation toolbarCPDFAnnotationToolbar修改各类注释属性和返回/撤销返回对注释属性的操作。
3-2Properties-打开属性面板。
3-3Edit toolbarCPDFEditToolBar修改 PDF 文本/图片属性和返回/撤销返回对 PDF 文字/图片属性的操作。

以下是初始化CAnnotationManage(编号19)的方法:

swift
// 初始化CAnnotationManage对象。
  var annotationManage = CAnnotationManage.init(pdfListView: self.pdfListView!)

// 设置CAnnotationManage对象管理当前选中的注释。
annotationManage.setAnnotStyle(from: pdfListView.activeAnnotations)

// 设置CAnnotationManage对象管理默认的注释。
annotationManage.setAnnotStyle(from: pdfListView.annotationMode)

// 设置CAnnotationManage对象去修改当前选中的注释的属性。
annotationManage.refreshPage(with: annotStyle.annotations)

// CPDFAnnotationToolbar:初始化一个CAnnotationManage对象annotationManage。
// annotationManage:管理注释属性单独model数据。
let annotationBar = CPDFAnnotationToolBar.init(annotationManage: annotationManage)
objective-c
// 初始化CAnnotationManage对象。
CAnnotationManage *annotationManage = [[CAnnotationManage alloc] initWithPDFView:pdfListView];

// 设置CAnnotationManage对象管理当前选中的注释。
[annotManage setAnnotStyleFromAnnotations:pdfListView.activeAnnotations];

// 设置CAnnotationManage对象管理默认的注释。
[annotManage setAnnotStyleFromMode:pdfListView.annotationMode];

// 设置CAnnotationManage对象去修改当前选中的注释的属性。
[annotManage refreshPageWithAnnotations:annotStyle.annotations];

// CPDFAnnotationToolbar:初始化一个CAnnotationManage对象annotationManage。
// annotationManage:管理注释属性单独model数据。
CPDFAnnotationToolbar *annotationToolbar = [[CPDFAnnotationToolbar alloc] initAnnotationManage:annotationManage];

Part 4:

2-11-4

上面的左图展示了与 Forms API 关联的主要 UI 组件。上面的右图展示了与DocsEditor API 关联的主要 UI 组件。请参阅以下 UI 组件与 API 的对应情况。

NumberNameFunctionalityDescription
4-1Form toolbarCPDFFormToolbar修改 forms 属性和返回/撤销返回对 forms 属性的操作。
4-2PageEdit toolbarCPageEditToolBar对页面进行编辑。

Part 5:

2-11-5

上面的左图展示了与CPDFNoteViewController API 关联的主要 UI 组件。上面的右图展示了与CPDFFormCheckBoxViewController API 关联的主要 UI 组件。请参阅以下 UI 组件与 API 的对应情况。

NumberNameFunctionalityDescription
5-1NoteCPDFNoteViewController修改便签注释的属性。
5-2Check boxCPDFFormCheckBoxViewController修改 Check box 表单的属性。

Part 6:

上面的上图图展示了与Digital Signature API 关联的主要 UI 组件。请参阅以下 UI 组件与 API 的对应情况。

NumberNameFunctionalityDescription
6-1Digital Signature ToolbarCPDFDigitalSignatureToolBar增加和验证数字签名的属性。
6-2Customize Signature PreviewCAddSignatureViewController自定义数字签名外观的属性。
6-3Sign InfoCAddSignatureViewController验证签名后的信息显示属性

使用 CPDFListView 类

CPDFListViewCPDFView的一个子类,它包含预览、注释、表单、PDF 内容编辑等功能的操作。

  1. ToolModel 功能模式切换

    要切换到不同的功能模式,只需通过CPDFListView::toolModel设置相应的功能模式。然后,CPDFListView将显示不同的功能的 UI 界面。下表展示的是,在各功能模式下,对注释和表单的操作的支持。

    CToolModelDescription
    CToolModelViewer- 支持文本选取、文本复制。
    - 支持表单填写和签署。
    - 不支持添加、选取、移动、删除注释,且不支持编辑注释的属性。
    - 不支持表单的添加、选取、移动、和删除,且不支持编辑表单的属性。
    CToolModelEdit- 不支持添加、选取、移动、删除注释,且不支持编辑注释的属性。
    - 不支持表单填写。
    - 不支持表单的添加、选取、移动、和删除,且不支持编辑表单的属性。
    CToolModelAnnotation- 支持文本选取、文本复制。
    - 支持添加、选取、移动、删除注释,且支持编辑注释的属性。
    - 不支持表单填写
    - 不支持表单的添加、选取、移动、和删除,且不支持编辑表单的属性。
    CToolModelForm- 支持表单的添加、选取、移动、和删除,且不支持编辑表单的属性。
    - 不支持文本选取、文本复制。
    - 不支持添加、选取、移动、删除注释,且不支持编辑注释的属性。
    - 不支持表单填写。
    CToolModelPageEdit- 不支持注释和表单的任何操作。
  2. 添加注释或表单模式:CPDFViewAnnotationMode

    当进入注释模式或表单模式时,只需在CPDFListView::annotationMode中设置相应的注释模式(表单是一种注释),在CPDFListView中创建指定的注释和表单。下表展示了每个值代表了什么注释类型。

    CPDFViewAnnotationMode描述
    CPDFViewAnnotationModeNone进入注释模式,但未选中注释类型。
    CPDFViewAnnotationModeNote便签注释。
    CPDFViewAnnotationModeHighlight标记类注释:高亮。
    CPDFViewAnnotationModeUnderline标记类注释:下划线。
    CPDFViewAnnotationModeStrikeout标记类注释:删除线。
    CPDFViewAnnotationModeSquiggly标记类注释:波浪线。
    CPDFViewAnnotationModeCircle形状类注释:圆形。
    CPDFViewAnnotationModeSquare形状类注释:矩形。
    CPDFViewAnnotationModeArrow形状类注释:箭头。
    CPDFViewAnnotationModeLine形状类注释:直线。
    CPDFViewAnnotationModeInk手绘注释。
    CPDFViewAnnotationModePencilDrawingApple Pencil 注释。
    CPDFViewAnnotationModeFreeText文字注释。
    CPDFViewAnnotationModeSignature签名。
    CPDFViewAnnotationModeStamp图章注释。
    CPDFViewAnnotationModeImage图片注释。
    CPDFViewAnnotationModeLink链接注释。
    CPDFViewAnnotationModeSound音频注释。
    CPDFViewFormModeText文本表单域。
    CPDFViewFormModeCheckBox复选框表单域。
    CPDFViewFormModeRadioButton单选框表单域。
    CPDFViewFormModeCombox列表框表单域。
    CPDFViewFormModeList下拉菜单表单域。
    CPDFViewFormModeButton动作按钮表单域。
    CPDFViewFormModeSign签名表单域。

    注:

    • 在选中注释模式或选中某一注释类型时,不支持滚动PDFCPDFListView视图。

    • 只有在 iOS 13.0 版本以上的设备才支持CPDFViewAnnotationModePencilDrawing模式。

  3. 返回/撤销返回 PDF 注释的操作

    表单和CPDFListView的注释的返回/撤销返回操作,这些操作实际上涉及到使用 KVO 观察注释属性。在初始化CPDFListView时,只需调用CPDFListView::registerAsObserverNSUndoManager对象将使用keysForValuesToObserveForUndo方法来观察已添加的注释和表单的相关属性。

swift
func startObservingNotes(newNotes: [CPDFAnnotation]) {
        if self.notes == nil {
            self.notes = []
        }
        for note in newNotes {
            if self.notes?.contains(note) == false {
                self.notes?.append(note)
            }
            let keys: Set<String> = note.keysForValuesToObserveForUndo()
            for key in keys {
                note.addObserver(self, forKeyPath: key, options: [.new, .old], context: &CPDFAnnotationPropertiesObservationContext)
            }
 }
objective-c
- (void)startObservingNotes:(NSArray *)newNotes {
    if (!self.notes) {
        self.notes = [NSMutableArray array];
    }
    for (CPDFAnnotation *note in newNotes) {
        if (![self.notes containsObject:note]) {
            [self.notes addObject:note];
        }
        for (NSString *key in [note keysForValuesToObserveForUndo]) {
            [note addObserver:self forKeyPath:key options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:&CPDFAnnotationPropertiesObservationContext];
        }
    }
}

注: 切换文档以及移除对应的注释或表单时,一定要留意移除注释属性的 KVO 监听。

下面的代码展示了如何撤消和重做注释和表单的编辑

swift
 @objc func buttonItemClicked_undo(_ button: UIButton) {
         if self.annotManage?.pdfListView?.undoPDFManager != nil && ((self.annotManage?.pdfListView?.canUndo()) == true) {
             self.annotManage?.pdfListView?.undoPDFManager?.undo()
         }
     }
     
     @objc func buttonItemClicked_redo(_ button: UIButton) {
         if self.annotManage?.pdfListView?.undoPDFManager != nil && (self.annotManage?.pdfListView?.canRedo()) == true {
             self.annotManage?.pdfListView?.undoPDFManager?.redo()
         }
     }
objective-c
- (void)buttonItemClicked_undo:(UIButton *)button {
    if(self.annotManage.pdfListView.undoPDFManager && [self.annotManage.pdfListView canUndo]) {
        [self.annotManage.pdfListView.undoPDFManager undo];
    }
}

- (void)buttonItemClicked_redo:(UIButton *)button {
    if(self.annotManage.pdfListView.undoPDFManager && [self.annotManage.pdfListView canRedo]) {
        [self.annotManage.pdfListView.undoPDFManager redo];
    }
}
  1. 实现委托函数

    关于实现委托函数,请参考 “CPDFViewController” 文件中的以下方法.

swift
 @optional
   
 // 上下文菜单选项。
     @objc optional func PDFListView(_ pdfListView: CPDFListView, customizeMenuItems menuItems: [UIMenuItem], forPage page: CPDFPage, forPagePoint pagePoint: CGPoint) -> [UIMenuItem]
 
 // 空白区域点击
     @objc optional func PDFListViewPerformTouchEnded(_ pdfListView: CPDFListView)
 
 // 功能模式切换。
     @objc optional func PDFListViewChangedToolMode(_ pdfListView: CPDFListView, forToolMode toolMode: Int)
 
 // 注释类型切换。
     @objc optional func PDFListViewChangedToolMode(_ pdfListView: CPDFListView, forToolMode toolMode: Int)
 
 // 选中注释发生变化
     @objc optional func PDFListViewChangeatioActiveAnnotations(_ pdfListView: CPDFListView, forActiveAnnotations annotations: [CPDFAnnotation])
 
 // 文档注释有发生变化。
     @objc optional func PDFListViewAnnotationsOperationChange(_ pdfListView: CPDFListView)
 
 // 编辑注释内容。
     @objc optional func PDFListViewEditNote(_ pdfListView: CPDFListView, forAnnotation annotation: CPDFAnnotation)
 
 // 修改注释属性。
     @objc optional func PDFListViewEditProperties(_ pdfListView: CPDFListView, forAnnotation annotation: CPDFAnnotation)
 
 // 取消音频添加。
     @objc optional func PDFListViewPerformPlay(_ pdfView: CPDFListView, forAnnotation annotation: CPDFSoundAnnotation)
 
 // 取消音频添加。
     @objc optional func PDFListViewPerformCancelMedia(_ pdfView: CPDFListView, atPoint point: CGPoint, forPage page: CPDFPage)
 
 // 音频是否正在录音
     @objc optional func PDFListViewPerformRecordMedia(_ pdfView: CPDFListView, atPoint point: CGPoint, forPage page: CPDFPage)
 
 // Sound annotations: If it's recording
     @objc optional func PDFListViewerTouchEndedIsAudioRecordMedia(_ pdfListView: CPDFListView) -> Bool
 
 // 添加图章注释。
     @objc optional func PDFListViewPerformAddStamp(_ pdfView: CPDFListView, atPoint point: CGPoint, forPage page: CPDFPage)
 
 // 添加图片。
     @objc optional func PDFListViewPerformAddImage(_ pdfView: CPDFListView, atPoint point: CGPoint, forPage page: CPDFPage)
 
 // 添加签名。
     @objc optional func PDFListViewPerformSignatureWidget(_ pdfView: CPDFListView, forAnnotation annotation: CPDFSignatureWidgetAnnotation)
 
 // 修改PDF文字属性。
     @objc optional func PDFListViewContentEditProperty(_ pdfListView: CPDFListView, point: CGPoint)
objective-c
@optional
  
// 上下文菜单选项。
- (NSArray<UIMenuItem *> *)PDFListView:(CPDFListView *)pdfListView customizeMenuItems:(NSArray *)MenuItems forPage:(CPDFPage *)page forPagePoint:(CGPoint)pagePoint;

// 空白区域点击。
- (void)PDFListViewPerformTouchEnded:(CPDFListView *)pdfListView;

// 功能模式切换。
- (void)PDFListViewChangedToolMode:(CPDFListView *)pdfListView forToolMode:(CToolModel)toolMode;

// 注释类型切换。
- (void)PDFListViewChangedAnnotationType:(CPDFListView *)pdfListView forAnnotationMode:(CPDFViewAnnotationMode)annotationMode;

// 选中注释发生变化。
- (void)PDFListViewChangeatioActiveAnnotations:(CPDFListView *)pdfListView forActiveAnnotations:(NSArray<CPDFAnnotation *> *)annotations;

// 文档注释有发生变化。
- (void)PDFListViewAnnotationsOperationChange:(CPDFListView *)pdfListView;

// 编辑注释内容。
- (void)PDFListViewEditNote:(CPDFListView *)pdfListView forAnnotation:(CPDFAnnotation *)annotation;

// 修改注释属性。
- (void)PDFListViewEditProperties:(CPDFListView *)pdfListView forAnnotation:(CPDFAnnotation *)annotation;

// 播放音频注释。
- (void)PDFListViewPerformPlay:(CPDFListView *)pdfView forAnnotation:(CPDFSoundAnnotation *)annotation;

// 取消音频添加。
- (void)PDFListViewPerformCancelMedia:(CPDFListView *)pdfView atPoint:(CGPoint)point forPage:(CPDFPage *)page;

// 音频注释开始录音。
- (void)PDFListViewPerformRecordMedia:(CPDFListView *)pdfView atPoint:(CGPoint)point forPage:(CPDFPage *)page;

// 音频是否正在录音。
- (BOOL)PDFListViewerTouchEndedIsAudioRecordMedia:(CPDFListView *)pdfListView;

// 添加图章注释。
- (void)PDFListViewPerformAddStamp:(CPDFListView *)pdfView atPoint:(CGPoint)point forPage:(CPDFPage *)page;

// 添加图片注释。
- (void)PDFListViewPerformAddImage:(CPDFListView *)pdfView atPoint:(CGPoint)point forPage:(CPDFPage *)page;

// 添加签名。
- (void)PDFListViewPerformSignatureWidget:(CPDFListView *)pdfView forAnnotation:(CPDFSignatureWidgetAnnotation *)annotation;

// 修改PDF文字属性。
- (void)PDFListViewContentEditProperty:(CPDFListView *)pdfListView point:(CGPoint)point;

注: 如果需要切换或取消选择注释,需要调用CPDFListView::updateActiveAnnotations才能让CPDFListView::PDFListViewChangeatioActiveAnnotations: forActiveAnnotations:得到响应。

SwiftUI

自 iOS 版本 10.1 起,ComPDFKit 公开了特定的 API,以便开箱即用地将 ComPDFKit 与 SwiftUI 结合使用。CPDFViewController.swift这使得在 SwiftUI 应用程序中处理 ComPDFKit 变得更容易,并且如果您想走 SwiftUI 路线,它不需要您自己包装。

  1. 导入资源文件,ComPDFKit_Tools iOS样例项目自带默认UI设计,包括应用程序的基本UI和功能模块UI,使用ComPDFKit PDF SDK实现,并已发布。还包括一个 CPDFViewController 视图控制器,它包含随时可用的UI模块实现。

    swiftUI-1
  2. 通过将PDF文档拖放到项目中,将它们添加到应用程序中。在显示的对话框中,选择Finish以接受默认的集成选项。您可以使用TestFile文件夹中的文档作为示例。

  3. 桥接CPDFSwiftViewController到SwiftUI

    首先,声明' CPDFSwiftViewController '结构-它符合' UIViewControllerRepresentable'协议-这样你就可以从UIKit桥接到SwiftUI。

    swift
    struct CPDFSwiftViewController: UIViewControllerRepresentable {
        @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
        class Coordinator: NSObject,CPDFViewBaseControllerDelete {
            var myview: CPDFSwiftViewController
            init(_ myview: CPDFSwiftViewController) {
                self.myview = myview
            }
            
            // MARK: - CPDFViewBaseControllerDelete
            func PDFViewBaseControllerDissmiss(_ baseControllerDelete: CPDFViewBaseController) {
                baseControllerDelete.dismiss(animated: true)
            }
                
        }
        
        func makeCoordinator() -> Coordinator {
            Coordinator(self)
        }
        
        func makeUIViewController(context: Context) -> CNavigationController {
            
            CPDFKit.setLicenseKey("", secret: "")
    				
            let filePath = Bundle.main.path(forResource: "developer_guide_ios", ofType: "pdf")
            let documentFolder = NSHomeDirectory().appending("/Documents/Samples")
    
            if !FileManager.default.fileExists(atPath: documentFolder) {
                try? FileManager.default.createDirectory(atPath: documentFolder, withIntermediateDirectories: true, attributes: nil)
            }
            
    
            let documentURL = URL(fileURLWithPath: documentFolder).appendingPathComponent((filePath as NSString?)?.lastPathComponent ?? "")
            
            if !FileManager.default.fileExists(atPath: documentURL.path) {
                try? FileManager.default.copyItem(at: URL(fileURLWithPath: filePath ?? ""), to: documentURL)
            }
            
            let configuration = CPDFConfiguration()
              
            let thumbnail = CNavBarButtonItem(viewLeftBarButtonItem: .thumbnail)
            let back = CNavBarButtonItem(viewLeftBarButtonItem: .back)
            let search = CNavBarButtonItem(viewRightBarButtonItem: .search)
            let bota = CNavBarButtonItem(viewRightBarButtonItem: .bota)
            let more = CNavBarButtonItem(viewRightBarButtonItem: .more)
    
            configuration.showleftItems = [back, thumbnail]
            configuration.showRightItems = [search, bota, more]
    
    
            let vc = CPDFViewController(filePath: documentURL.path, password: nil, configuration: configuration)
            vc.delegate = context.coordinator;
            let navController = CNavigationController(rootViewController: vc)
    
            return navController
        }
        
        func updateUIViewController(_ uiViewController: CNavigationController, context: UIViewControllerRepresentableContext<CPDFSwiftViewController>) {
            // Update the view controller.
        }
    }
  4. 在SwiftUI中使用CPDFSwiftViewController

    最后,在你的SwiftUI内容视图中使用'CPDFSwiftViewController :

    swift
    struct ContentView: View {
        @State var isPresented: Bool = false
    
        var body: some View {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundColor(.accentColor)
                Text("Hello, world!")
                
                    .toolbar {
                        
                        ToolbarItem(placement: .bottomBar) {
                            Button("Click to open the sample PDF") {
                                isPresented = true
                            }
                        }
                    }
                    .sheet(isPresented: $isPresented) {
                        CPDFSwiftViewController()
                    }
                
            }
            .padding()
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }

了解更多

  1. 如何处理 PDF 文件加载

    要处理 PDF 文档加载,请参考***“CPDFViewBaseController.m”***文件中的以下方法。

    objective-c
    - (void)reloadDocumentWithFilePath:(NSString *)filePath password:(nullable NSString *)password completion:(void (^)(BOOL result))completion;
2-11-14
  1. 为了保护用户隐私,在访问设备数据之前,你需要在你的 iOS 10.0 或更高版本的 iOS 设备中找到 ”Info“ 配置,并按照下图所示配置相关的设置。
objective-c
<key>NSCameraUsageDescription</key>
<string>Your consent is required before you could access the function.</string>

<key>NSMicrophoneUsageDescription</key>
<string>Your consent is required before you could access the function.</string>

<key>NSPhotoLibraryAddUsageDescription</key>
<string>Your consent is required before you could access the function.</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>Your consent is required before you could access the function.</string>