Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions EUExPDFReader/EUExPDFReader.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
5A9FF0C71890A84500E16C52 /* ThumbsMainToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A9FF0B01890A84500E16C52 /* ThumbsMainToolbar.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A9FF0C81890A84500E16C52 /* ThumbsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A9FF0B21890A84500E16C52 /* ThumbsViewController.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A9FF0C91890A84500E16C52 /* UIXToolbarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A9FF0B41890A84500E16C52 /* UIXToolbarView.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
C628055D2192FAA60033CBDC /* UexPDFGTMBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = C628055B2192FAA60033CBDC /* UexPDFGTMBase64.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -140,6 +141,9 @@
5A9FF0B21890A84500E16C52 /* ThumbsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThumbsViewController.m; sourceTree = "<group>"; };
5A9FF0B31890A84500E16C52 /* UIXToolbarView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIXToolbarView.h; sourceTree = "<group>"; };
5A9FF0B41890A84500E16C52 /* UIXToolbarView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIXToolbarView.m; sourceTree = "<group>"; };
C628055A2192FAA60033CBDC /* UexPDFGTMBase64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UexPDFGTMBase64.h; sourceTree = "<group>"; };
C628055B2192FAA60033CBDC /* UexPDFGTMBase64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UexPDFGTMBase64.m; sourceTree = "<group>"; };
C628055C2192FAA60033CBDC /* UexEMMGTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UexEMMGTMDefines.h; sourceTree = "<group>"; };
FC16252A18AB6BCD00BEF700 /* EUExPDFReader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EUExPDFReader.h; sourceTree = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -249,6 +253,7 @@
5A9FF08A1890A84400E16C52 /* sourceCode */ = {
isa = PBXGroup;
children = (
C62805592192FA880033CBDC /* GTMBase64 */,
427A05481EADE91A002BC8DE /* AppCanKit.framework */,
5A9FF08E1890A84500E16C52 /* ReaderViewController.h */,
5A9FF08F1890A84500E16C52 /* ReaderViewController.m */,
Expand Down Expand Up @@ -300,6 +305,16 @@
path = Sources;
sourceTree = "<group>";
};
C62805592192FA880033CBDC /* GTMBase64 */ = {
isa = PBXGroup;
children = (
C628055A2192FAA60033CBDC /* UexPDFGTMBase64.h */,
C628055B2192FAA60033CBDC /* UexPDFGTMBase64.m */,
C628055C2192FAA60033CBDC /* UexEMMGTMDefines.h */,
);
path = GTMBase64;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
Expand Down Expand Up @@ -415,6 +430,7 @@
5A9FF0BB1890A84500E16C52 /* ReaderContentTile.m in Sources */,
5A9FF0C71890A84500E16C52 /* ThumbsMainToolbar.m in Sources */,
5A9FF0BA1890A84500E16C52 /* ReaderContentPage.m in Sources */,
C628055D2192FAA60033CBDC /* UexPDFGTMBase64.m in Sources */,
5A9FF0C01890A84500E16C52 /* ReaderThumbCache.m in Sources */,
5A9FF0C21890A84500E16C52 /* ReaderThumbQueue.m in Sources */,
5A9FF0BE1890A84500E16C52 /* ReaderMainPagebar.m in Sources */,
Expand Down
2 changes: 2 additions & 0 deletions EUExPDFReader/EUExPDFReader/EUExPDFReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

#import <AppCanKit/AppCanKit.h>

#define kStringWithFormat(object) object?[NSString stringWithFormat:@"%@",object]:nil


@interface EUExPDFReader : EUExBase

Expand Down
168 changes: 155 additions & 13 deletions EUExPDFReader/EUExPDFReader/EUExPDFReader.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@

#import "EUExPDFReader.h"
#import "ReaderViewController.h"
#import "UexPDFGTMBase64.h"



@interface EUExPDFReader()<ReaderViewControllerDelegate,UIWebViewDelegate>
@property (nonatomic,strong)ReaderViewController *readerController;
@property (nonatomic,strong)UIWebView *pdfView;
@property(copy,nonatomic)NSString *filepath;

@end

@implementation EUExPDFReader
Expand All @@ -22,8 +25,8 @@ @implementation EUExPDFReader

- (void)openPDFReader:(NSMutableArray *)inArguments{

ACArgsUnpack(NSString *inPath,ACJSFunctionRef *callback) = inArguments;

ACArgsUnpack(NSString *inPath,NSString *encryptStr,ACJSFunctionRef *callback) = inArguments;
NSInteger isEncryptValue = [encryptStr integerValue];
if (!inPath) {

[callback executeWithArguments: ACArgsPack(@(1))];
Expand All @@ -35,7 +38,6 @@ - (void)openPDFReader:(NSMutableArray *)inArguments{
if (self.readerController) {
return;
}

NSString *absPath = [self absPath:inPath];
NSString *kResScheme = @"res://";
if ([inPath hasPrefix:kResScheme]) {
Expand All @@ -45,31 +47,168 @@ - (void)openPDFReader:(NSMutableArray *)inArguments{
if([[NSFileManager defaultManager] copyItemAtPath:absPath toPath:copyPath error:nil]){
absPath = copyPath;
}

}


//判断是否是加密的PDF(isEncryptValue:是否为加密 1:加密 0:非加密)
if (isEncryptValue == 1) {
//将获取到的文件路径放入PreferencePanes目录(临时文件,避免在沙盒中查到)
ReaderDocument *document = [ReaderDocument withDocumentFilePath:absPath password:nil];
NSString *documentPath2 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
NSString *fileName = [ReaderDocument GUID];
NSString *preferencePanesPath = [documentPath2 stringByAppendingPathComponent:fileName];
NSLog(@"ssssssss === %@",absPath);
[self func_decodeFile:absPath withNewName:preferencePanesPath];
absPath = preferencePanesPath;
self.filepath = preferencePanesPath;
}

//Document password (for unlocking most encrypted PDF files)
NSString *phrase = nil;
ReaderDocument *document = [ReaderDocument withDocumentFilePath:absPath password:phrase];
ReaderDocument *document = [ReaderDocument withDocumentFilePath:absPath password:phrase];

if (!document) {

[callback executeWithArguments: ACArgsPack(@(1))];

NSLog(@"没有PDF文件");
return;
}
else
else
{
[callback executeWithArguments: ACArgsPack(@(0))];

}

if (!self.readerController) {
self.readerController = [[ReaderViewController alloc] initWithReaderDocument:document];
self.readerController = [[ReaderViewController alloc] initWithReaderDocument:document withEUExObj:self];
}
self.readerController.delegate = self;
[[self.webViewEngine viewController] presentViewController:self.readerController animated:YES completion:nil];
}


/**
*文件加密
\array
\filePath 需要加密的文件路径
*/
-(void)fileEncrypt:(NSMutableArray *)array{
@try{
if ([array isKindOfClass:[NSMutableArray class]] && [array count] > 0) {
NSLog(@"appcan-->uexEMM-->fileEncrypt-->array is %@",array);
NSString *srcPath = [array objectAtIndex:0];
// srcPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/1.mp4"];
if (![[NSFileManager defaultManager] fileExistsAtPath:srcPath]) {
NSString *jsString = [NSString stringWithFormat:@"uexPDFReader.cbFileEncrypt(\"0\",\"0\",\'');"];
if ([NSThread isMainThread]) {
// [self.meBrwView stringByEvaluatingJavaScriptFromString:jsString];
[self.webViewEngine evaluateScript:jsString];

}else{
[self performSelectorOnMainThread:@selector(callBackMethod:) withObject:jsString waitUntilDone:NO];
}
return;
}
[self func_encodeFile:srcPath withNewName:srcPath];
NSString *jsString = [NSString stringWithFormat:@"uexPDFReader.cbFileEncrypt(\"0\",\"0\",\"%@\");",srcPath];
if ([NSThread isMainThread]) {
// [self.meBrwView stringByEvaluatingJavaScriptFromString:jsString];
[self.webViewEngine evaluateScript:jsString];

}else{
[self performSelectorOnMainThread:@selector(callBackMethod:) withObject:jsString waitUntilDone:NO];
}
}
}@catch (NSException * e){
NSLog(@"appcan-->uexEMM-->fileEncrypt-->catch e is %@",e);
}
}

#define Key_Count (17)//加密字符串长度
static char arrayForEncode[Key_Count] = "appcan@3g2win.com";
#pragma mark ----- 解密method
-(BOOL)func_decodeFile:(NSString *)filePath withNewName:(NSString *)newFilePath {
if (nil == filePath || NO == [[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSString *jsString = [NSString stringWithFormat:@"uexPDFReader.cbFileDecrypt(\"0\",\"0\",\'');"];
if ([NSThread isMainThread]) {
// [self.meBrwView stringByEvaluatingJavaScriptFromString:jsString];
[self.webViewEngine evaluateScript:jsString];

}else{
[self performSelectorOnMainThread:@selector(callBackMethod:) withObject:jsString waitUntilDone:NO];
}
return NO;
}
@autoreleasepool {
// 读取被加密文件对应的数据
NSData *dataEncoded = [NSData dataWithContentsOfFile:filePath];
// 对NSData进行base64解码
NSData *dataDecode = [UexPDFGTMBase64 decodeData:dataEncoded];

// 对前1000位进行异或处理
unsigned char * cByte = (unsigned char*)[dataDecode bytes];
for (int index = 0; (index < [dataDecode length]) && (index < Key_Count); index++, cByte++)
{
*cByte = (*cByte) ^ arrayForEncode[index];
}
NSLog(@"解密成功");
BOOL yes = [dataDecode writeToFile:newFilePath atomically:NO];
if (yes) {
NSLog(@"解密文件写入成功");
}else{
NSLog(@"解密文件写入失败");
}
return yes;
}
}

#pragma mark ----- 加密method(暂时没有被调用到)
-(BOOL)func_encodeFile:(NSString *)filePath withNewName:(NSString*)newFilePath {
if (nil == filePath || NO == [[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
return NO;
}
@autoreleasepool {
//文件路径转换为NSData
NSData *imageDataOrigin = [NSData dataWithContentsOfFile:filePath];
// 对前1000位进行异或处理
unsigned char * cByte = (unsigned char*)[imageDataOrigin bytes];
for (int index = 0; (index < [imageDataOrigin length]) && (index < Key_Count); index++, cByte++)
{
*cByte = (*cByte) ^ arrayForEncode[index];
}

//对NSData进行base64编码
NSData *imageDataEncode = [UexPDFGTMBase64 encodeData:imageDataOrigin];
NSLog(@"加密成功");
NSLog(@"=================%@",newFilePath);
return [imageDataEncode writeToFile:newFilePath atomically:YES];


}
}

/**
*回调方法
\jsString 回调的js
*/
-(void)callBackMethod:(NSString *)jsString{

// [self.meBrwView stringByEvaluatingJavaScriptFromString:jsString];
[self.webViewEngine evaluateScript:jsString];
}

////原生异步回调JS给网页
//- (void)doCallback:(NSMutableArray *)inArguments{
// NSDictionary *dict = @{
// @"key":@"value"
// };
// //ac_JSONFragment 方法,可以将NSDictionary转换成JSON字符串
// [self.webViewEngine callbackWithFunctionKeyPath:@"uexPDFReader.cbDoCallback"
// arguments:ACArgsPack(dict.ac_JSONFragment)
// completion:^(JSValue * _Nullable returnValue) {
// if (returnValue) {
// ACLogDebug(@"回调成功!");
// }
// }];
//}


- (void)openView:(NSMutableArray *)inArguments{
Expand Down Expand Up @@ -111,6 +250,7 @@ - (void)openView:(NSMutableArray *)inArguments{

}


- (void)closeView:(NSMutableArray *)inArguments{
[self.pdfView removeFromSuperview];
self.pdfView.delegate = nil;
Expand All @@ -119,13 +259,15 @@ - (void)closeView:(NSMutableArray *)inArguments{


- (void)dismissReaderViewController:(ReaderViewController *)viewController{
//MARK:关闭查看PDF时删除解密存储文件。
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:self.filepath error:nil];

NSLog(@"self.filepath =============== %@",self.filepath);
[self close:nil];

}




- (void)close:(NSMutableArray *)inArguments{
[self.readerController dismissViewControllerAnimated:YES completion:nil];
self.readerController.delegate = nil;
Expand Down
Loading