在我前幾篇文章里面分別介紹了PDF文件預覽的幾種方法、PDF文檔的格式轉換,今天來介紹下怎么實現PDF文檔批注與修改的功能。在iOS系統下直接實現PDF批注的功能有些困難,這個時候就要借助第三方福昕來實現這些功能,大家可以點進去了解一下,廢話不多說。
PDF工具包介紹
首先去官網下載工具包,比較坑爹的是要先注冊個賬號才能下載。需要注意的是使用工具包有以下系統要求:
- iOS 8.0及以上版本
- 對Objective-C語言,須Xcode 7.0及以上版本
- 對Swift語言,須Xcode 8.0及以上版本
打開libs文件夾是我們主要需要用到的東西
- FoxitRDK.framework - 動態庫
- libFoxitRDKUIExtensions.a - 靜態庫
- uiextensions - UI EXTENSIONS組件
UI EXTENSIONS組件基于View Control提供,支持自定義用戶界面,且包括大量的內置工具,如文本選擇、文本標注和繪圖、表單填寫、自定義文本輸入、標準和動態圖章、夜間模式、大綱導覽和全文搜索等 。這是一套高級的帶內置界面的PDF擴展工具,提供了默認的界面和交互,同時提供了組件源代碼,開發人員可以通過對源代碼的直接修改,來實現默認交互,以及默認界面的修改。
運行下里面的Demo,先看下效果圖:
集成
下載好的工具包里面有一份開發文檔,開發文檔里面有介紹具體怎么集成,不過是一份全英文的文檔,不知道為什么國內公司開發的工具包不提供一份中文文檔,還好那些英文我還能看得懂,但是我不推薦大家看那份文檔,很坑,一些重要的東西沒講到,我當時看了幾天,踩了很多坑。所以我自己又簡單封裝了里面的一些主要代碼。我這邊來介紹一下怎么集成它的SDK。
-
第一步:將WYPDFEditTool文件夾拖入至工程中,該文件夾可以在文章末尾的Demo里面找到。
-
第二步:將Demo里面的[libs]文件夾拖到工程根目錄文件夾下,切記不要和上一步一樣導入工程里,因為里面的代碼大部分是在MRC環境下寫的,直接導入工程會報很多錯,再提醒一遍是拖到根目錄文件夾下。
-
第三步:嵌入依賴庫
-
第四步:在other Linker Flags里面添加
-objc
、-force_load
,然后將WYPDFEditTool文件夾下的libFoxitRDKUIExtensions.a文件按照圖示拖到指定位置。
按照這個步驟來就算是集成成功了。
實現PDF批注功能
集成成功之后就可以寫代碼了,我自己寫了一個Demo示例,簡單實現了PDF涂鴉、PDF添加文字、PDF全文搜索的功能。先看下效果圖:
我這邊是寫了一個單例類去實現一些簡單的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,如果是要集成到自己公司項目里,那估計是要去買正式版的來使用了,好像價格還不便宜。
如果發現本文有任何錯誤還請多多指出,包括如果大家發現更好的解決方法也請告訴我,謝謝!!!