在我前几篇文章里面分别介绍了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:https://img.haomeiwen.com/i1786260/27d4167f138ebb61.gif?
imageMogr2/auto-orient/strip)
集成
下载好的工具包里面有一份开发文档,开发文档里面有介绍具体怎么集成,不过是一份全英文的文档,不知道为什么国内公司开发的工具包不提供一份中文文档,还好那些英文我还能看得懂,但是我不推荐大家看那份文档,很坑,一些重要的东西没讲到,我当时看了几天,踩了很多坑。所以我自己又简单封装了里面的一些主要代码。我这边来介绍一下怎么集成它的SDK。
-
第一步:将WYPDFEditTool文件夹拖入至工程中,该文件夹可以在文章末尾的Demo里面找到。
-
第二步:将Demo里面的[libs]文件夹拖到工程根目录文件夹下,切记不要和上一步一样导入工程里,因为里面的代码大部分是在MRC环境下写的,直接导入工程会报很多错,再提醒一遍是拖到根目录文件夹下。
-
第三步:嵌入依赖库
-
第四步:在other Linker Flags里面添加
-objc
、-force_load
,然后将WYPDFEditTool文件夹下的libFoxitRDKUIExtensions.a文件按照图示拖到指定位置。
按照这个步骤来就算是集成成功了。
实现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,如果是要集成到自己公司项目里,那估计是要去买正式版的来使用了,好像价格还不便宜。
-
如果发现本文有任何错误还请多多指出,包括如果大家发现更好的解决方法也请告诉我,谢谢!!!
网友评论
- (void)openPDFDocWithFilePath:(NSString *)filePath showInView:(UIView *)view{
FSPDFDoc* pdfdoc = [FSPDFDoc createFromFilePath:filePath];
if(e_errSuccess != [pdfdoc load:nil]) {
return;
}
_pdfViewCtrl.frame = view.frame;
[_pdfViewCtrl setDoc:pdfdoc];
[view addSubview:_pdfViewCtrl];
}