PDF SDK For iOS(1.3.0.0) 说明

  1. 简介

  2. 最新版下载地址:http://www.ycanpdf.cn/download/pages/pdfsdk/ios.html

    PDFSDK.framwork是优看科技出品的iOS平台下PDF阅读器底层程序库,提供PDF阅读器最基础的功能,适合需要高级定制功能的开发者。如果无需高级定制功能,可使用本公司另一款快速开发阅读器的产品:Reader SDK for iOS。

      1. 支持翻页动画:滑动,仿真,简洁。

      2. 支持阅后即焚文件生成/阅读控制。

      3. 支持夜间模式。

      4. 支持搜索。

      5. 支持文字选择,添加笔记,显示书签等操作。

      6. 支持目录提取。

      7. 支持裁边(手动/自动)。

      8. 支持页面缩放。

      9. 支持其他基本阅读功能。

    • 支持文件格式:PDF。

    • 支持语言:Objective-c。

    • 支持最低系统:ios 8.0。

    • 开发工具:xcode 8.3.2。

    • 接口主要分2类:YCANPDFViewController类接口和YCANPDFViewControllerDelegate回调接口。

  3. 在xcode中集成:

    1. 选择要集成的 targets,切换到 Build Phases 标签。

    2. Link Binary With Libaraies 中分别添加 PDFSDK.frameworkSecurity.frameworklibiconv.tbd和c++动态库libc++.tbd

    3. Copy Bundle Resources 中添加 SDKResource.bundle

  4. 具体接口调用流程(Objective-c代码为例)

  5. 调用sdk接口前,需要在app启动时注册sdk,否则sdk不可用。可以通过在线注册开发者账号,获取appKey和appSecret,详情请参考registerSDKWithAppKey函数的注意部分。注册示例代码:

    // AppDelegate 回调函数
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
        (NSDictionary *) launchOptions {
        [YCANPDFViewController registerSDKWithAppKey:@"5E2FADFEAE365427FFFF041412FE8C5"
            appSecret:@"13C49F0807DF56809E492DEF0CDCD"
        completeHandler:^(NSDictionary *info, NSError *error)
        {
            NSLog(@"info=%@, error=%@", info, error);
        }];
        return YES;
    }

    下面的示例程序以在UIViewController中的使用方式为来说明。首先创建YCANPDFViewController对象,然后显示pdf页面。由于YCANPDFViewController是UIViewController子类,可以像使用普通的UIViewController对象使用YCANPDFViewController实例对象。YCANPDFViewController包含了阅读pdf的所有基础功能,开发者需要自己设计使用这些功能的界面(如果无需高级定制功能,可使用本公司另一款快速开发阅读器的产品:Reader            SDK for iOS)。            
    注意: 需要引入头文件 <PDFSDK/PDFSDK.h>。

    NSString *path =  // pdf file path;
    NSString *password = nil;
    PDFError code = 0;
    NSString *fontPath = // TrueType font file path
    
    // 设置默认TrueType字体文件,不必每次打开pdf时都调用,建议在app启动时调用。
    [YCANPDFViewController setDefaultTrueTypeFontWithFontPath:fontPath];
    
    // 检查文件是否是阅后即焚文件
    long enc =  [YCANPDFViewController isFileEncWithPath:path];
    if( enc == -1){
        // 文件无法打开
        return;
    } 
    
    // 打开文件
    YCANPDFViewController *pdf = [YCANPDFViewController instanceWithPath:path password:password errorCode:ampcode isDRMFile:(enc==1)];
    if(pdf == nil){
        if( code == pdf_err_password_error ){
            // 需要正确的密码才能打开
        }
    } else {
        pdf.pdfDelegate = self;
    
        // 显示阅读界面
        [self addChildViewController:pdf];
        // 在此处添加其他初始化代码...
    
        UIView *pdfView = pdf.view;
        [self.view addSubview:pdfView];
        [self.view sendSubviewToBack:pdfView];
        pdfView.frame = self.view.bounds;
        [pdf didMoveToParentViewController:self];
    }
    
    ...
    // pdf对象不再使用,请调用close接口,防止pdf对象释放后,后台仍然在进行异步计算而导致程序崩溃。
    // 如果不调用此接口,SDK将无法打开新的文件,并返回 pdf_err_can_not_open_two_files_in_same_time 错误。
    [pdf close];

    在用户阅读过程中,开发者可能需要知道用户的某些阅读行为。为此可以指定YCANPDFViewController对象的delegate 并实现YCANPDFViewControllerDelegate协议即可。细节请参考YCANPDFViewControllerDelegate说明

  6. 接口说明

    1. YCANPDFViewController类接口

    2. YCANPDFViewController 定义如下:(摘自PDFSDK.h)

      //YCANPDFViewController
      ////////////////////////////////////////////////////
      ////////////////////////////////////////////////////
      @interface YCANPDFViewController : UIViewController
      // register sdk api
      +(void)registerSDKWithAppKey:(NSString*)appKey
          appSecret:(NSString*)appSecret
          completeHandler:(void(^)(NSDictionary* info, NSError *error))completeHandler;
      +(void)setDefaultTrueTypeFontWithFontPath:(NSString*)path;
      
      // open pdf page api
      +(instancetype)instanceWithPath:(NSString*)path password:(NSString*)password errorCode:(PDFError*)code;
      +(NSString*)version;
      -(void)update;
      -(NSArray<PDFOutlineItem *>*)outlineArray;
      -(void)gotoPage:(NSInteger)pageNum animate:(BOOL)animate;
      -(NSInteger)currPageNum;
      -(NSString*)textForPage:(NSUInteger)page;
      -(void)close;
      @property (nonatomic, assign) BOOL isNightMode;
      @property (nonatomic, assign) id<YCANPDFViewControllerDelegate> pdfDelegate;
      @property (nonatomic, assign, readonly) NSInteger maxPageNum;
      @property (nonatomic, assign) CGFloat pageZoom; // 1-4
      @property (nonatomic, assign) PDFPageFlipMode pageFlipMode;
      @property (nonatomic, strong) NSMutableArray<PDFAnnotItem*> *annotArray;
      
      // image for page api
      -(UIImage*)imageForPageNum:(NSUInteger)pageNum boundsSize:(CGSize)boundsSize useQuartz:(BOOL)useQuartz;
          
      // search api
      -(void)searchWithKeyword:(NSString*)keyword;
      -(void)searchMoreResules;
      -(void)showSearResultWithSearchItem:(PDFSearchItem*)searchItem;
      -(void)searchNext;
      -(void)searchPrev;
      -(void)cancelSearchWithFinishHandle:(void(^)(NSString* keyword))finishHandle;
      @property (nonatomic, assign, readonly) BOOL isSearching;
      @property (nonatomic, strong, readonly) NSArray<PDFSearchItem*>* searchResultArray;
          
      // cut page api
      @property (nonatomic, assign) BOOL enableCutPage;
      @property (nonatomic, assign) UIEdgeInsets cutPageEdge;
      @property (nonatomic, assign) BOOL cutPageEdgeManually;
      @property (nonatomic, assign) BOOL enableOddEvenSimmetry;
      @property (nonatomic, assign, readonly) BOOL isCuttingPage;
      -(void)applyCutPageSettings;
      
      // drm api
      +(long)isFileEncWithPath:(NSString*)path;
      +(long)makeDRMFileWithDestPath:(NSString*)destPath srcPath:(NSString*)srcPath ctrlInfo:(NSString*)info;
      -(long)readingCountLastForDRMFile;
      -(long)readingTimeLastForDRMFileWithType:(int)type;
      -(long)drmCtrlType;
      -(void)stopDRMTimeLong:(BOOL)stop;
      @end

      接口详细说明:

      1. +(void)registerSDKWithAppKey:(NSString*)appKey appSecret:(NSString*)appSecret completeHandler:(void(^)(NSDictionary* info, NSError *error))completeHandler;                        

        • 功能:

        • 注册sdk。

        • 参数:

        • appKey 注册账号后得到的字符串(App Key)。

          appSecret 注册账号后得到的字符串(App Secret)。

          completeHandler 可以为nil,注册完成后调用。

        • 返回值:

        • 无。

        • 注意:

          • 开发者账号登陆/注册网址http://sdk.ycanpdf.com

          • 注册开发者账号时请注意:填写的 Bundle ID 必须要与 app 的 Bundle ID 一致。

          • app Bundle ID 获取方法:

            1. 选中app target

            2. 切换到 General标签。

            3. 展开IdentifyBundle Identifier 的值就是要填的 Bundle ID

          • 调用方式和时机,请参考:注册SDK代码示例

      2. + (void)setDefaultTrueTypeFontWithFontPath:(NSString*)path;                        

        • 功能:

        • 设置默认TrueType字体文件。

        • 参数:

        • path TrueType字体文件路径。

        • 返回值:

        • 无。

        • 注意:

        • 由于存在非内嵌字体的pdf文件,解析这类文件时,需要pdf文件外部提供默认字体文件,否则页面文字会显现不正常。调用此接口,可以为解析引擎提供默认字体。提供的字体文件必须是完整的 TrueType 类型的中文字体文件,建议提供 “黑体”字体文件(simhei.ttf)。

      3. +(instancetype)instanceWithPath:(NSString*)path password:(NSString*)password errorCode:(PDFError*)code;                        

        • 功能:

        • 打开文件。

        • 参数:

        • path 文件路径。

          password pdf文件密码,某些pdf文档受密码保护,需要密码才能打开。

          errCode 错误码,请参考PDFError

        • 注意:

        • 此接口是唯一获取YCANPDFViewController对象的接口,请不要使用其他UIVeiewController类获取对象的接口,否则得到的对象的所有行为是未定义的。


      4. +(NSString*)version;                        

        • 功能:

        • 返回SDK版本号。

        • 参数:

        • 无。

        • 返回值:

        • SDK版本号, 如:1.0.0.0。


      5. -(void)update;                        

        • 功能:

        • 刷新页面。

        • 参数:

        • 无。

        • 返回值:

        • 无。

        • 注意:

        • 此接口将强制YCANPDFViewController调用某些delegate回调函数。


      6.       -(NSArray<PDFOutlineItem *>*)outlineArray;                        

        • 功能:

        • 获取pdf目录。

        • 参数:

        • 无。

        • 返回值:

        • PDFOutlineItem数组,详情请参考:PDFOutlineItem


      7. -(void)gotoPage:(NSInteger)pageNum animate:(BOOL)animate;                        

        • 功能:

        • 跳转到某页。

        • 参数:

        • pageNum 指定跳转到某页的页码,起始页码以1开始。

          animate 是否有翻页动画,YES为有,反之为无。

        • 返回值:

        • 无。


      8. -(NSInteger)currPageNum;                        

        • 功能:

        • 获取当前正在显示的页面页码。

        • 参数:

        • 无。

        • 返回值:

        • 当前正在显示的页面页码。


      9. -(NSString*)textForPage:(NSUInteger)page;                        

        • 功能:

        • 获取页面所有文字。

        • 参数:

        • page 指定获取第几页的文字。

        • 返回值:

        • 页面文本

        • 注意:

        • 此接口只获取页面的文字,图片等都被过滤掉了。


      10. -(void)close;                        

        • 功能:

        • 停止所有可能的后台异步计算。

        • 参数:

        • 无。

        • 返回值:

        • 无。

        • 注意:

        • 如果YCANPDFViewController对象不再使用,请调用close接口,以停止可能存在的后台异步计算,否则可能引起程序崩溃,且SDK将无法打开新的文件,并返回 pdf_err_can_not_open_two_files_in_same_time 错误。


      11. @property (nonatomic, assign) BOOL isNightMode;                        

        • 功能:

        • 设置页面是否为夜间模式。

        • 注意:

        • isNightMode值为YES时,页面会立刻以夜间模式显示;为NO时,页面会立刻以非夜间模式显示。


      12. @property (nonatomic, assign) id<YCANPDFViewControllerDelegate> pdfDelegate;                        

        • 功能:

        • 指定委托对象。

        • 注意:

        • YCANPDFViewController对象的所有通知,都是通过此对象通知的,遵循YCANPDFViewControllerDelegate协议,详情请参考:YCANPDFViewControllerDelegate说明,可以为nil。


      13. @property (nonatomic, assign, readonly) NSInteger maxPageNum;                        

        • 功能:

        • 获取PDF最大页码,第一页以1开始。


      14. @property (nonatomic, assign) CGFloat pageZoom;                        

        • 功能:

        • 设置/获取缩放页面。

        • 注意:

        • 取值范围:1.0 - 4.0。


      15. @property (nonatomic, assign) PDFPageFlipMode pageFlipMode;                        

        • 功能:

        • 设置/获取翻页方式。


      16. @property (nonatomic, strong) NSMutableArray<PDFAnnotItem*> *annotArray;                        

        • 功能:

        • 设置/获取注释列表。

        • 注意:

        • annotArray数组中的所有对象必须是PDFAnnotItem对象,用户对注释的所有操作(增删改等),会通过YCANPDFViewControllerDelegate通知,结果都会保存在annotArray中。


      17. -(UIImage*)imageForPageNum:(NSUInteger)pageNum boundsSize:(CGSize)boundsSize useQuartz:(BOOL)useQuartz;                        

        • 功能:

        • 获取页面图像(用于获取PDF封面)。

        • 参数:

        • pageNum 指定第几页为封面,起始页码以1开始,一般为1。

          boundsSize 封面大小。

          useQuartz 是否使用 quartz 获取封面, 由于阅读时,获取封面可能导致程序崩溃,但是,使用quartz,可避免这种情况。

        • 返回值:

        • 图片。


      18. -(void)searchWithKeyword:(NSString*)keyword;                        

        • 功能:

        • 启动后台搜索功能。

        • 参数:

        • keyword 指定搜索关键字。

        • 返回值:

        • 无。


      19. -(void)searchMoreResules;                        

        • 功能:

        • 通知后台继续执行搜索任务。

        • 参数:

        • 无。

        • 返回值:

        • 注意:

        • 调用后,后台会从最后一次暂停的位置开始,继续执行搜索。如果搜到了结果,将引发pdf:hasSearchedMoreResultsByKeyword:接口回调,结果会追加到searchResultArray中,后台搜索暂停,若需要搜到更多结果,请再次调用searchMoreResules接口;如果搜索完所有页面,将引发pdf:canNotSearchMoreResultsByKeyWord:接口回调, 后台搜索停止;若已经搜到文件尾,YCANPDFViewController将不会执行任何操作。


      20. -(void)showSearResultWithSearchItem:(PDFSearchItem*)searchItem;                        

        • 功能:

        • 显示已经搜到的某一项结果。

        • 参数:

        • searchItem searchResultArray中的对象。

        • 返回值:

        • 无。

        • 注意:

        • 调用后,将会以图形方式显示,使用户精确确定结果在页面上的具体位置,然后 searchNextsearchPrev才可用。


      21. -(void)searchNext;                        

        • 功能:

        • 在页面上显示下一个搜索结果的具体位置。

        • 参数:

        • 无。

        • 返回值:

        • 无。


      22. -(void)searchPrev;                        

        • 功能:

        • 在页面上显示上一个搜索结果的具体位置。

        • 参数:

        • 无。

        • 返回值:

        • 无。


      23. -(void)cancelSearchWithFinishHandle:(void(^)(NSString* keyword))finishHandle;                        

        • 功能:

        • 取消搜索,调用后页面搜索结果标记将消失,后台搜索将停止。

        • 参数:

        • finishHandle 后台搜索停止时,将会执行,可以为nil。

        • 返回值:

        • 无。

        • 注意:

        • cancelSearchWithFinishHandle: 接口调用后,后台搜索不会立即停止,是异步的。为了某些避免意外情况,后台搜索在停止时,会调用finishHandle代码块。 此外,还会使searchResultArray的值变成nil,请留意此处。


      24. @property (nonatomic, assign, readonly) BOOL isSearching;                        

        • 功能:

        • 指示后台搜索是否正在执行。

        • 注意:

        • 后台一次只能执行一个关键字的搜索,不能同时执行多个关键字搜索。


      25. @property (nonatomic, strong, readonly) NSArray<PDFSearchItem*>* searchResultArray;                        

        • 功能:

        • 获取后台搜索结果。


      26.  @property (nonatomic, assign) BOOL enableCutPage;                        

        • 功能:

        • 开启/关闭页面裁边功能。


      27. @property (nonatomic, assign) UIEdgeInsets cutPageEdge;                        

        • 功能:

        • 设置页面裁边边距。


      28. @property (nonatomic, assign) BOOL cutPageEdgeManually;                        

        • 功能:

        • 设置是否手动裁边;YES-手动裁边,NO-自动裁边。


      29. @property (nonatomic, assign) BOOL enableOddEvenSimmetry;                        

        • 功能:

        • 手动裁边时,是否奇偶对称;YES-奇偶对称裁边,NO-非奇偶对称裁边。

        • 注意:

        • 应当与applyCutPageSettings配合使用,详情请参考:applyCutPageSettings:。奇偶对称裁边:偶数页裁边的左边距=奇数页裁边的右边距;偶数页裁边的右边距=奇数页裁边的左边距;奇偶页的上下边距相同。非奇偶对称裁边:所有页的裁边边距相同。


      30. @property (nonatomic, assign, readonly) BOOL isCuttingPage;                        

        • 功能:

        • 指示YCANPDFViewController对象是否正在与用户交互手动裁边。

        • 注意:

        • YCANPDFViewController对象处理手动裁边时,会出现一个供用户操作的手动裁边界面,这时isCuttingPage的值为YES,用户退出手动裁边界面后,isCuttingPage的值为NO。


      31. -(void)applyCutPageSettings;                        

        • 功能:

        • 通知YCANPDFViewController对象执行裁边设置。

        • 参数:

        • 无。

        • 返回值:

        • 无。

        • 注意:

        • applyCutPageSettings执行的时候,首先检查是否开启裁边功能(enableCutPage),若未开启(enableCutPage==NO),YCANPDFViewController不会执行裁边功能;若开启,则进一步检查是否为自动裁边cutPageEdgeManually); 若是,YCANPDFViewController会自动分析页面并裁边,而忽略其他裁边设置;若否,YCANPDFViewController会使用传入的cutPageEdgeenableOddEvenSimmetry值,并自动切换到手动裁边交互界面,当用户完成手动裁边后,YCANPDFViewController返回到阅读界面,并将裁边结果保存在对应的变量中,通过didCutPageSettingsChangedInPDF:接口通知页面剪裁设置发生改变。


      32. + (long)isFileEncWithPath:(NSString*)path;                        

        • 功能:

        • 检查文件是否是阅后即焚文件。

        • 参数:

        • path 文件路径。

        • 返回值:

        • 0为未加密文件,1为加密文件,-1为原始文件无法打开。

        • 注意:

        • 在打开文件之前,必须要区分文件是否被加密,否则文件将无法打开。


      33. + (long)makeDRMFileWithDestPath:(NSString*)destPath srcPath:(NSString*)srcPath ctrlInfo:(NSString*)info;                        

        • 功能:

        • 生产阅后即焚文件。

        • 参数:

        • destPath sdk存放制作的DRM文件路径。

          srcPath 将要被加密的文件路径。

          ctrlInfo 文件控制信息,使用标准的xml格式字符串传递,示例:

          <ReadCtrlWay>0</ReadCtrlWay> // 控制方式,0逻辑或,1逻辑与

          <ReadDuration>0 </ReadDuration> // 时长,秒数,若无控制则可不包含此项

          <ReadCount>10</ReadCount> // 次数控制,若无控制传-1

          <UseReadTime> // 若无控制则可不包含此项,时间格式须严格按下面的格式书写

              <RStart>0000-00-00 00:00:00</RStart>

              <REnd>2018-05-15 18:00:00</REnd>

          </UseReadTime>

        • 返回值:

        • -1表示目标文件出错;-2表示文件大小为0;-3 表示目标文件存在,不允许覆盖或覆盖失败;-4表示原始文件出错 0表示文件加密成功.

        • 注意:

        • 此接口只是针对pdf文件格式;若要打开生成的文件,需调用YCANPDFViewController的打开文件接口。


      34. -(long)readingCountLastForDRMFile;                        

        • 功能:

        • 获取阅后即焚文件的剩余次数。

        • 参数:

        • 无。

        • 返回值:

        • -1表示阅读次数未控制; 大于0表示文件剩余的阅读次数。


      35. - (long)readingTimeLastForDRMFileWithType:(int)type;                        

        • 功能:

        • 获取剩余阅读时间

        • 参数:

        • type 获取的类型,0:时段, 1:时长

        • 返回值:

        • -1表示未控制阅读时间; 大于0表示剩余文件阅读时间(单位:秒)。


      36. - (long)drmCtrlType;                        

        • 功能:

        • 获取控制方式。

        • 参数:

        • 无。

        • 返回值:

        • 0逻辑或,1逻辑与。


      37. - (void)stopDRMTimeLong:(BOOL)stop;                        

        • 功能:

        • 暂停/开始计时

        • 参数:

        • stop YES暂停计时,NO继续计时。

        • 返回值:

        • 无。

    3. YCANPDFViewControllerDelegate

    4. YCANPDFViewControllerDelegate 定义如下:(摘自PDFSDK.h)。

      //YCANPDFViewController
      ////////////////////////////////////////////////////
      ////////////////////////////////////////////////////
      @class YCANPDFViewController;
      @protocol YCANPDFViewControllerDelegate <NSObject>
      @optional
      // search delegate
      // search list
      -(void)pdf:(YCANPDFViewController*)pdf hasSearchedMoreResultsByKeyword:(NSString*)keyword;
      -(void)pdf:(YCANPDFViewController*)pdf canNotSearchMoreResultsByKeyWord:(NSString *)keyword;
      
      // search page
      -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword willEnterBackgroundAtPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword isSearched:(BOOL)isSearched;
      
      // annot delegate
      -(BOOL)pdf:(YCANPDFViewController*)pdf canCopyFrom:(NSInteger)fromIndex to:(NSInteger)toIndex atPage:(NSInteger)pageNum;
      -(BOOL)pdf:(YCANPDFViewController*)pdf canAddPDFAnnotType:(PDFAnnotType)type from:(NSInteger)fromIndex to:(NSInteger)toIndex atPage:(NSInteger)pageNum;
      -(BOOL)pdf:(YCANPDFViewController*)pdf canRemovePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(BOOL)pdf:(YCANPDFViewController*)pdf canSharePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf sharePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf didAddPDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf didRemovePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf didPDFAnnotNoteChange:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController *)pdf didPDFAnnotColorChange:(PDFAnnotItem *)annotItem atPage:(NSInteger)pageNum;
      
      // page delegate
      -(void)pdf:(YCANPDFViewController*)pdf pageMayTransitionFrom:(NSInteger)from to:(NSInteger)to;
      -(void)pdf:(YCANPDFViewController*)pdf pageDidTransitionFrom:(NSInteger)from to:(NSInteger)to;
      -(BOOL)pdf:(YCANPDFViewController*)pdf canShowBookmarkAtPage:(NSInteger)pageNum;
      -(void)pdf:(YCANPDFViewController*)pdf bookmarkDidClickedAtPage:(NSInteger)pageNum;
      -(NSInteger)pageNumberForInitPDF:(YCANPDFViewController*)pdf;
      
      // cut page
      -(void)didCutPageSettingsChangedInPDF:(YCANPDFViewController*)pdf;
      @end

      协议接口详细说明:

      1. -(void)pdf:(YCANPDFViewController*)pdf hasSearchedMoreResultsByKeyword:(NSString*)keyword;                        


      2. -(void)pdf:(YCANPDFViewController*)pdf canNotSearchMoreResultsByKeyWord:(NSString *)keyword;                        


      3. -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword willEnterBackgroundAtPage:(NSInteger)pageNum;                        

        • 说明:

        • 进入后台搜索时调用。可以不实现,详情请参考:searchNextsearchPrev


      4. -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword atPage:(NSInteger)pageNum;                        

        • 说明:

        • 后台搜索过程中会调用。可以不实现,详情请参考:searchNextsearchPrev


      5. -(void)pdf:(YCANPDFViewController*)pdf searchKeyword:(NSString*)keyword isSearched:(BOOL)isSearched;                        

        • 说明:

        • 后台搜索暂停时调用,参数isSearched指示出搜索暂停的原因,若为YES,表示搜到了结果。若为NO,表示没有搜到结果,并已经搜到了文件头或文件尾,无法继续执行搜索了。可以不实现,详情请参考:searchNextsearchPrev


      6. -(BOOL)pdf:(YCANPDFViewController*)pdf canCopyFrom:(NSInteger)fromIndex to:(NSInteger)toIndex atPage:(NSInteger)pageNum;                        

        • 说明:

        • 弹出菜单前调用,若返回NO,弹出的菜单将没有复制选项。反之则有。


      7. -(BOOL)pdf:(YCANPDFViewController*)pdf canAddPDFAnnotType:(PDFAnnotType)type from:(NSInteger)fromIndex to:(NSInteger)toIndex atPage:(NSInteger)pageNum;                        

        • 说明:

        • 弹出菜单前调用,若返回NO,弹出的菜单将没有对应的注释类型选项。反之则有。


      8. -(BOOL)pdf:(YCANPDFViewController*)pdf canRemovePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 弹出菜单前调用,若返回NO,弹出的菜单将没有删除注释的选项。反之则有。

      9. -(BOOL)pdf:(YCANPDFViewController*)pdf canSharePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 弹出菜单前调用,若返回NO,弹出的菜单将没有分享注释的选项。反之则有。


      10. -(void)pdf:(YCANPDFViewController*)pdf sharePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户点击了分享菜单命令时调用,通知执行分享注释操作。


      11. -(void)pdf:(YCANPDFViewController*)pdf didAddPDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户添加注释时调用,通知删除注释操作。注意:YCANPDFViewController会自动维护 annotArray。


      12. -(void)pdf:(YCANPDFViewController*)pdf didRemovePDFAnnotItem:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户删除注释时调用,通知删除注释操作。注意:YCANPDFViewController会自动维护 annotArray。


      13. -(void)pdf:(YCANPDFViewController*)pdf didPDFAnnotNoteChange:(PDFAnnotItem*)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户修改注释笔记时调用,通知修改注释操作。注意:YCANPDFViewController会自动维护 annotArray。


      14. -(void)pdf:(YCANPDFViewController *)pdf didPDFAnnotColorChange:(PDFAnnotItem *)annotItem atPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户修改注释颜色时调用,通知修改注释操作。注意:YCANPDFViewController会自动维护 annotArray。


      15. -(void)pdf:(YCANPDFViewController*)pdf pageMayTransitionFrom:(NSInteger)from to:(NSInteger)to;                        

        • 说明:

        • 用户有翻页动作时触发调用。

      16. -(void)pdf:(YCANPDFViewController*)pdf pageDidTransitionFrom:(NSInteger)from to:(NSInteger)to;                        

        • 说明:

        • 用户翻页后触发调用。


      17. -(BOOL)pdf:(YCANPDFViewController*)pdf canShowBookmarkAtPage:(NSInteger)pageNum;                        

        • 说明:

        • 渲染页面时会调用,若返回YES,pageNum页将会显示书签,若返回NO,则不会显示书签。

      18. -(void)pdf:(YCANPDFViewController*)pdf bookmarkDidClickedAtPage:(NSInteger)pageNum;                        

        • 说明:

        • 用户点到页面上的书签时调用。

      19. -(NSInteger)pageNumberForInitPDF:(YCANPDFViewController*)pdf;                        

        • 说明:

        • 打开pdf文件时调用,询问最先显示的页面。例如返回3,YCANPDFViewController最先渲染并显示第3页;可以不实现,从而默认最先显示第1页。

      20. -(void)didCutPageSettingsChangedInPDF:(YCANPDFViewController*)pdf;                        

  7. 结构定义

    1. PDFError(摘自PDFSDK.h)

    2. // error code
      typedef NS_ENUM(NSUInteger, PDFError) {
          pdf_err_ok,                             // 成功
          pdf_err_unknown,                        // 未知错误
          pdf_err_password_error,                 // 密码错误
          pdf_err_file_damaged,                   // 文件损坏
          pdf_err_file_is_not_exist,              // 文件不存在
          pdf_err_file_is_encrypted,              // 文件已加密
          pdf_err_file_has_no_page,               // 文件无页面
          pdf_err_file_can_not_be_opened,         // 文件无法打开
          pdf_err_verification_failed,            // 验证失败
          pdf_err_reading_time_interval_is_over,  // 时段阅读时间用完
          pdf_err_reading_duration_is_over,       // 时长阅读时间用完
          pdf_err_not_in_reading_time_interval,   // 不在阅读时段内
          pdf_err_reading_count_is_over,          // 阅读次数用完
          pdf_err_can_not_open_two_files_in_same_time, // 无法同时打开两个文件
      };

    3. PDFAnnotType(摘自PDFSDK.h)

    4. typedef NS_ENUM(NSUInteger, PDFAnnotType) {
          PDFAnnotTypeSolidUnderline, // 实线下划线
          PDFAnnotTypeWaveUnderline,  // 波浪下划线
          PDFAnnotTypeDashUnderline,  // 虚线下划线
          PDFAnnotTypeHeighlight      // 高亮
      };

    5. PDFPageFlipMode(摘自PDFSDK.h)

    6. // 翻页模式
      typedef NS_ENUM(NSUInteger, PDFPageFlipMode) {
          pdf_page_flip_mode_slide,          // 滑动
          pdf_page_flip_mode_simulation,     // 仿真
          pdf_page_flip_mode_continues,      // 连续页
          pdf_page_flip_mode_none            // 无
      };
      • 注意:

      • pdf_page_flip_mode_continues 是为pdf预留的翻页模式,暂不支持。

    7. PDFAnnotItem(摘自PDFSDK.h)

    8. // PDFAnnotItem
      // 用于表示一个注释对象
      ///////////////////////////////////////////////////
      ///////////////////////////////////////////////////
      @interface PDFAnnotItem : NSObject
      @property (nonatomic, assign) PDFAnnotType type;    // 注释类型,支持高亮和下划线
      @property (nonatomic, assign) NSUInteger pageNum;   // 注释所在的页码
      @property (nonatomic, assign) NSInteger ID;        // 本地注释id
      @property (nonatomic, assign) NSInteger annotID;   // 服务器注释id
      @property (nonatomic, strong) NSDate *addTime;      // 注释添加时间
      @property (nonatomic, strong) NSString *userNote;   // 用户笔记
      @property (nonatomic, strong) NSString *text;       // 注释包涵的文字
      @property (nonatomic, assign) NSInteger startIndex; // 起始文字索引
      @property (nonatomic, assign) NSInteger endIndex;   // 结束文字索引
      @property (nonatomic, assign) CGPoint startPoint;   // 起始点
      @property (nonatomic, assign) CGPoint endPoint;     // 结束点
      @property (nonatomic, assign) NSInteger argbAlpha;  // argb alpha(0-255)
      @property (nonatomic, assign) NSInteger argbRed;    // argb red(0-255)
      @property (nonatomic, assign) NSInteger argbGreen;  // argb green(0-255)
      @property (nonatomic, assign) NSInteger argbBlue;   // argb blue(0-255)
      @property (nonatomic, assign) NSInteger pageRotaion;// 页面旋转角度,可取 0,90.180,270
      // 以下属性在(下划线)下才有效
      @property (nonatomic, assign) NSInteger lineWidth;  // 线条宽
      @end

    9. PDFOutlineItem(摘自PDFSDK.h)

    10. //PDFOutlineItem
      ////////////////////////////////////////////////////
      ////////////////////////////////////////////////////
      @interface PDFOutlineItem : NSObject
      @property (nonatomic, strong) NSString *title;      // 目录标题
      @property (nonatomic, assign) NSInteger destPageNum;// 目录项所在页码
      @property (nonatomic, assign) NSInteger level;      // 目录项的层次,从0开始
      // 例如目录树为:
      //
      //         a
      //       / | \
      //      b  c  d
      //     / \     \
      //    e   f     g
      //
      //在 outlineArray 中存储的顺序及level表示为:
      // [a-0, b-1, e-2, f-2, c-1, d-1, g-2]
      @end

    11. PDFSearchItem(摘自PDFSDK.h)

    12. //PDFSearchItem
      ////////////////////////////////////////////////////
      ////////////////////////////////////////////////////
      @interface PDFSearchItem : NSObject
      @property (nonatomic, strong) NSString *text;           // 包含搜索关键字的文本
      @property (nonatomic, assign) NSRange keywordRange;     // text中,关键字所在的位置
      @property (nonatomic, assign) NSUInteger page;          // 搜索所在页
      @property (nonatomic, strong) id context;               // 与搜索有关的内部信息,请勿做任何改动
      @end