iOS PDF文档批注与修改

在我前几篇文章里面分别介绍了PDF文件预览的几种方法PDF文档的格式转换,今天来介绍下怎么实现PDF文档批注与修改的功能。在iOS系统下直接实现PDF批注的功能有些困难,这个时候就要借助第三方福昕来实现这些功能,大家可以点进去了解一下,废话不多说。

PDF工具包介绍

首先去官网下载工具包,比较坑爹的是要先注册个账号才能下载。需要注意的是使用工具包有以下系统要求:

  • iOS 8.0及以上版本
  • 对Objective-C语言,须Xcode 7.0及以上版本
  • 对Swift语言,须Xcode 8.0及以上版本

打开libs文件夹是我们主要需要用到的东西


Snip20170705_5.png
  • FoxitRDK.framework - 动态库
  • libFoxitRDKUIExtensions.a - 静态库
  • uiextensions - UI EXTENSIONS组件

UI EXTENSIONS组件基于View Control提供,支持自定义用户界面,且包括大量的内置工具,如文本选择、文本标注和绘图、表单填写、自定义文本输入、标准和动态图章、夜间模式、大纲导览和全文搜索等 。这是一套高级的带内置界面的PDF扩展工具,提供了默认的界面和交互,同时提供了组件源代码,开发人员可以通过对源代码的直接修改,来实现默认交互,以及默认界面的修改。

运行下里面的Demo,先看下效果图:![PDFDemo.gif](http://upload-images.jianshu.io/upload_images/1786260-27d4167f138ebb61.gif?
imageMogr2/auto-orient/strip)

集成

下载好的工具包里面有一份开发文档,开发文档里面有介绍具体怎么集成,不过是一份全英文的文档,不知道为什么国内公司开发的工具包不提供一份中文文档,还好那些英文我还能看得懂,但是我不推荐大家看那份文档,很坑,一些重要的东西没讲到,我当时看了几天,踩了很多坑。所以我自己又简单封装了里面的一些主要代码。我这边来介绍一下怎么集成它的SDK。

Snip20170705_6.png
  • 第二步:将Demo里面的[libs]文件夹拖到工程根目录文件夹下,切记不要和上一步一样导入工程里,因为里面的代码大部分是在MRC环境下写的,直接导入工程会报很多错,再提醒一遍是拖到根目录文件夹下。
Snip20170705_7.png
  • 第三步:嵌入依赖库
Snip20170705_8.png
  • 第四步:在other Linker Flags里面添加-objc-force_load,然后将WYPDFEditTool文件夹下的libFoxitRDKUIExtensions.a文件按照图示拖到指定位置。
Snip20170705_9.png

按照这个步骤来就算是集成成功了。

实现PDF批注功能

集成成功之后就可以写代码了,我自己写了一个Demo示例,简单实现了PDF涂鸦、PDF添加文字、PDF全文搜索的功能。先看下效果图:


PDFEdit.gif

我这边是写了一个单例类去实现一些简单的PDF批注功能,这里贴上.h代码,具体实现代码可以在文章末尾下载我的Demo:

#import <Foundation/Foundation.h>
#import <FoxitRDK/FSPDFObjC.h>
#import "FoxitRDK/FSPDFViewControl.h"
#import "../../../libs/uiextensions_src/uiextensions/UIExtensionsManager.h"

typedef NS_ENUM(NSInteger, WYPDFAnnotType){
    WYPDFAnnotTypeSelect,
    WYPDFAnnotTypeNote,         // 文字标注
    WYPDFAnnotTypeMarkup,       // 添加高亮标记
    WYPDFAnnotTypeShape,        // 添加形状选框
    WYPDFAnnotTypeFreetext,     // 添加自由文本
    WYPDFAnnotTypePencil,       // 画笔涂鸦
    WYPDFAnnotTypeEraser,       // 橡皮擦
    WYPDFAnnotTypeLine,         // 直线
    WYPDFAnnotTypeStamp,        // 图章
    WYPDFAnnotTypeInsert,       // 插入文字
    WYPDFAnnotTypeReplce,       // 替换
    WYPDFAnnotTypeAttachment,   // 附件
    WYPDFAnnotTypeSignature,    // 签名
    WYPDFAnnotTypeSearch        // 全文搜索
};

@interface WYPDFManager : NSObject


/**
 set pdfView frame
 */
@property (nonatomic, assign) CGRect pdfDocFrame;

+ (instancetype)defalutManager;

/**
 unlock Foxit MobilePDF SDK using a license before calling any APIs.
 */
+ (BOOL)applyTheLicenseKey;


/**
 打开文档
 @param filePath 文档路径
 */
- (void)openPDFDocWithFilePath:(NSString *)filePath showInView:(UIView *)view;


/**
 添加文档编辑功能
 */
- (void)addAnnotToolHandle:(WYPDFAnnotType)annotType;


/**
 取消编辑功能返回预览模式
 */
- (void)cancalAnnot;


/**
 保存修改后的文档
 */
- (BOOL)savePDFDocWithFilePath:(NSString *)filePath;

@end

这里需要注意的几个地方:

  • #import"../../../libs/uiextensions_src/uiextensions/UIExtensionsManager.h",这边导入的头文件就是我们放在工程根目录下的那个文件夹里的文件,如果这里报错说找不到头文件,只需要调整../的个数,../代表的是父级目录也就是上级目录。
  • + (BOOL)applyTheLicenseKey;,想使用批注功能必须先调一遍这个方法。建议在AppDelegate.m中实现。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    /****************** Apply the license key ******************/
    
    [WYPDFManager applyTheLicenseKey];
    
    return YES;
}

然后是在VC里面调用单例类的方法去实现批注功能

  • 打开文档
 // 打开PDF文档
    [[WYPDFManager defalutManager] openPDFDocWithFilePath:self.pdfPath showInView:self.contentView];
    // 设置Frame
    [WYPDFManager defalutManager].pdfDocFrame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 49 - 64);

  • 实现具体功能
/****************** 保存 ******************/
- (void)saveClick{
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"123.pdf"];
    [[WYPDFManager defalutManager] savePDFDocWithFilePath:filePath];
}

/****************** 画笔涂鸦 ******************/
- (IBAction)pencilClick:(UIButton *)sender {
    [[WYPDFManager defalutManager] addAnnotToolHandle:WYPDFAnnotTypePencil];
}

/****************** 添加文字 ******************/
- (IBAction)wordClick:(UIButton *)sender {
    [[WYPDFManager defalutManager] addAnnotToolHandle:WYPDFAnnotTypeFreetext];
}

/****************** 全文搜索 ******************/
- (IBAction)searchClick:(UIButton *)sender {
     [[WYPDFManager defalutManager] addAnnotToolHandle:WYPDFAnnotTypeSearch];
}

/****************** 取消编辑动作 ******************/
- (IBAction)completClick:(UIButton *)sender {
    [[WYPDFManager defalutManager] cancalAnnot];
}


其实实现批注功能主要就是一句代码[[WYPDFManager defalutManager] addAnnotToolHandle:<#(WYPDFAnnotType)#>];然后根据枚举值选择你需要的批注功能

typedef NS_ENUM(NSInteger, WYPDFAnnotType){
    WYPDFAnnotTypeSelect,
    WYPDFAnnotTypeNote,         // 文字标注
    WYPDFAnnotTypeMarkup,       // 添加高亮标记
    WYPDFAnnotTypeShape,        // 添加形状选框
    WYPDFAnnotTypeFreetext,     // 添加自由文本
    WYPDFAnnotTypePencil,       // 画笔涂鸦
    WYPDFAnnotTypeEraser,       // 橡皮擦
    WYPDFAnnotTypeLine,         // 直线
    WYPDFAnnotTypeStamp,        // 图章
    WYPDFAnnotTypeInsert,       // 插入文字
    WYPDFAnnotTypeReplce,       // 替换
    WYPDFAnnotTypeAttachment,   // 附件
    WYPDFAnnotTypeSignature,    // 签名
    WYPDFAnnotTypeSearch        // 全文搜索
};

我这里只是封装了一些很简单的功能,还有很多功能大家可以自行研究官方Demo和开发文档。

补充

  • 因为官方Demo都是全英文的,就连一些文字提示也是英文,如果需要把它改成中文,可以修改WYPDFEditTool文件夹下的Localizable.string文件。

  • 福昕提供的SDK不是免费的,我这边用的是试用版的,大概两个礼拜就会到期,所以如果程序崩溃,很有可能就是试用到期了,要重新去官网下载最新的SDK包更换sn和key,如果是要集成到自己公司项目里,那估计是要去买正式版的来使用了,好像价格还不便宜。

  • 如果发现本文有任何错误还请多多指出,包括如果大家发现更好的解决方法也请告诉我,谢谢!!!

本文Demo下载地址
福昕官网
官网Demo下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,515评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 人生没有永远,事事都会有变迁。 人,在辉煌的时候,最容易失去一双识别真假的慧眼。 要学会对名和利放手,做一颗默默无...
    ayanmei阅读 385评论 0 0
  • 去年的时候,读了一本书,是英国作家克莱儿·麦克福尔著作的《摆渡人》,看过之后,我很用心的推荐给了身边的其他朋友,总...
    摇钱草阅读 712评论 2 4
  • 前言: 最近发布了es2017(即ES8),然后我也趁热学习一下ES8 1、为什么要引入Object.entrie...
    lane_developer阅读 2,096评论 1 2