Download the PDF version of this guide.
How to include RadaeePDF SDK in your project
Copy PDFViewer folder into your project’s folder.
Remove these folders from PDFViewer inside your project:
Drag PDFViewer folder with “Create groups” option selected except cmaps and fdat folders.
Drag cmaps and fdat folders into your project with the “Create folder references” option.
Add these lines in your prefix.pch file:
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "UINavigationController+autoRotate.h"
#endif
#import "RDUtils.h"
If you don’t have any prefix.pch file in your project you could copy PDFViewer-Prefix.pch from Radaee demo project in your project folder and set its path as prefix header in Build Setting/Prefix Header.
In Build Phases/Link Binary With Libraries:
Add -lz and -lstdc++ in Other Linker Flags of Build Settings tab
Add -fno-objc-arc to the following files in Build Phases/Compile Sources:
The building process may throw an error while building the project for iOS Simulator and linking in object file built for ARM64 architecture iOS, for architecture arm64:
Import RDVGlobal.h in your AppDelegate.h
Add :
- [RDVGlobal Init];
in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Add a Navigation controller in Main.storyboard, delete the Root View Controller, put a root view controller segue from your Navigation Controller to your View Controller and apply “Is Initial View Controller” to the Navigation Controller.
Import RDLoPDFViewController.h in your ViewController.h and create NSMutableArray *m_files and PDFReaderCtrl *m_pdf:
#import <UIKit/UIKit.h>
#import "RDLoPDFViewController.h"
@interface ViewController : UIViewController
{
RDLoPDFViewController *m_pdf;
NSMutableArray *m_files;
}
@end
@interface RDFileItem : NSObject
-(id)init:(NSString *)help :(NSString *)path :(int)level;
@property NSString *help;
@property NSString *path;
@property int level;
@property RDVLocker *locker;
@end
Add these functions to your ViewController.m:
- (void)refreshDocuments
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dpath = [paths objectAtIndex:0];
NSFileManager *fm = [NSFileManager defaultManager];
m_files = [[NSMutableArray alloc] init];
[self addPDFs:dpath :@"" :fm :0];
[self copyDocumentsFromAssets:dpath];
}
- (void)addPDFs:(NSString *)dpath :(NSString *)subdir :(NSFileManager *)fm :(int)level
{
NSString *path = [dpath stringByAppendingFormat:@"/%@", subdir];
NSDirectoryEnumerator *fenum = [fm enumeratorAtPath:path];
NSString *fName;
while(fName = [fenum nextObject])
{
BOOL dir;
NSString *dst = [path stringByAppendingFormat:@"%@",fName];
if( [fm fileExistsAtPath:dst isDirectory:&dir] )
{
if( dir )
{
[self addPDFs:dpath :dst :fm :level+1];
}
else if( [dst hasSuffix:@".pdf"] )
{
NSString *dis = [subdir stringByAppendingFormat:@"%@",fName];//display name
RDFileItem *item = [[RDFileItem alloc] init:dis :dst :level];
[m_files addObject:item];
}
}
}
}
- (void)copyDocumentsFromAssets :(NSString *)dpath
{
NSString *hf = [[NSBundle mainBundle] pathForResource:@"fdat" ofType:nil];
for (NSString *fpath in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:hf error:nil]) {
if([fpath.pathExtension isEqualToString:@"pdf"] || [fpath.pathExtension isEqualToString:@"PDF"]) {
NSString *documentPath = [hf stringByAppendingPathComponent:fpath];
NSString *destPath = [dpath stringByAppendingPathComponent:fpath];
if(![[NSFileManager defaultManager] fileExistsAtPath:destPath]) {
[[NSFileManager defaultManager] copyItemAtPath:documentPath toPath:destPath error:nil];
RDFileItem *item = [[RDFileItem alloc] init:[fpath stringByDeletingPathExtension] :destPath :0];
[m_files addObject:item];
}
}
}
}
- (void)presentPwdAlertControllerWithTitle:(NSString *)title message:(NSString *)message
{
}
- (void)pdf_open_path:(RDFileItem *)item :(NSString *)pswd
{
if( m_pdf == nil )
{
m_pdf = [[RDLoPDFViewController alloc] initWithNibName:@"RDLoPDFViewController" bundle:nil];
m_pdf.view.frame = self.view.frame;
}
NSLock *theLock = [[NSLock alloc] init];
if ([theLock tryLock])
{
//Open PDF file
int result = [m_pdf PDFOpen:item.path :pswd];
if(result == 1)
{
m_pdf.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:m_pdf animated:YES];
}
//return value is encryption document
else if(result == 2)
{
NSString *title = NSLocalizedString(@"Please Enter PassWord", @"Localizable");
UIAlertController *pwdAlert = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert];
[pwdAlert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.placeholder = NSLocalizedString(@"PassWord", @"Localizable");
textField.secureTextEntry = YES;
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", @"Localizable") style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
UITextField *password = pwdAlert.textFields.firstObject;
if (![password.text isEqualToString:@""]) {
int result = [self->m_pdf PDFOpen:item.path :password.text];
if(result == 1)
{
UINavigationController *nav = self.navigationController;
self->m_pdf.hidesBottomBarWhenPushed = YES;
nav.hidesBottomBarWhenPushed =NO;
[nav pushViewController:self->m_pdf animated:YES];
}
else if(result == 2)
{
NSString *str1=NSLocalizedString(@"Alert", @"Localizable");
NSString *str2=NSLocalizedString(@"Error PassWord", @"Localizable");
[self presentPwdAlertControllerWithTitle:str1 message:str2];
}
}
else
{
[self presentViewController:pwdAlert animated:YES completion:nil];
}
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", @"Localizable") style:UIAlertActionStyleCancel handler:nil];
[pwdAlert addAction:okAction];
[pwdAlert addAction:cancel];
[self presentViewController:pwdAlert animated:YES completion:nil];
}
else if (result == 0)
{
NSString *str1=NSLocalizedString(@"Alert", @"Localizable");
NSString *str2=NSLocalizedString(@"Error Document,Can't open", @"Localizable");
NSString *str3=NSLocalizedString(@"OK", @"Localizable");
UIAlertController* alert = [UIAlertController alertControllerWithTitle:str1
message:str2
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:str3 style:UIAlertActionStyleDefault handler:nil];
[alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
}
[theLock unlock];
}
}
add:
[self refreshDocuments];
in - (void)viewDidLoad
Create a method to open a pdf:
-(void)openPDF
{
for(int i = 0; i <[m_files count]; i++)
{
RDFileItem *item = [m_files objectAtIndex:i];
NSString *fName = item.help;
if([fName isEqualToString:@"help.pdf"])
{
[self pdf_open_path:item :nil];
}
}
}
RadaeePDF SDK for iOS
How to create your own APP with Swift and RadaeePDF SDK
Created : 2021-04-13 17:56:07, Last Modified : 2021-04-13 18:20:22