Convert the PDF into images in objective C


Convert the PDF into images in objective C

Here is the function, which will convert the PDF into images. Add the following lines of code.

 

 

-(void)splitPDF:(NSURL *)sourcePDFUrl withOutputName:(NSString *)outputBaseName intoDirectory:(NSString *)directory
{

CGPDFDocumentRef SourcePDFDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)sourcePDFUrl);

size_t numberOfPages = CGPDFDocumentGetNumberOfPages(SourcePDFDocument);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filePathAndDirectory = [documentsDirectory stringByAppendingPathComponent:directory];

NSError *error;

if (![[NSFileManager defaultManager] createDirectoryAtPath:filePathAndDirectory
withIntermediateDirectories:NO
attributes:nil
error:&error])
{
NSLog(@”Create directory error: %@”, error);
return;

}
for(int currentPage = 1; currentPage <= numberOfPages; currentPage ++ )
{
CGPDFPageRef SourcePDFPage = CGPDFDocumentGetPage(SourcePDFDocument, currentPage);
// CoreGraphics: MUST retain the Page-Refernce manually

CGPDFPageRetain(SourcePDFPage);

NSString *relativeOutputFilePath = [NSString stringWithFormat:@"%@/%@%d.png", directory, outputBaseName, currentPage];

NSString *ImageFileName = [documentsDirectory stringByAppendingPathComponent:relativeOutputFilePath];

CGRect sourceRect = CGPDFPageGetBoxRect(SourcePDFPage, kCGPDFMediaBox);

UIGraphicsBeginPDFContextToFile(ImageFileName, sourceRect, nil);

UIGraphicsBeginImageContext(CGSizeMake(sourceRect.size.width,sourceRect.size.height));

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(currentContext, 0.0, sourceRect.size.height); //596,842 //640×960,

CGContextScaleCTM(currentContext, 1.0, -1.0);

CGContextDrawPDFPage (currentContext, SourcePDFPage); // draws the page in the graphics context

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

NSString *imagePath = [documentsDirectory stringByAppendingPathComponent: relativeOutputFilePath];

[UIImagePNGRepresentation(image) writeToFile: imagePath atomically:YES];

}
}

 

Here, is the description of line of codes those are mentioned above.

 

CGPDFDocumentRef SourcePDFDocument = CGPDFDocumentCreateWithURL((__bridge CFURLRef)sourcePDFUrl);

size_t numberOfPages = CGPDFDocumentGetNumberOfPages(SourcePDFDocument);

 

Firstly it will create a document reference and then through that reference it will ake out the number of pages.

 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *filePathAndDirectory = [documentsDirectory stringByAppendingPathComponent:directory];

NSError *error;

if (![[NSFileManager defaultManager] createDirectoryAtPath:filePathAndDirectory
withIntermediateDirectories:NO
attributes:nil
error:&error])
{
NSLog(@”Create directory error: %@”, error);
return;

}

 

Then it will check either the PDF, which we are converting into images, exists or not. If it does not exist or there is any error it returns from the same part.

 

 for(int currentPage = 1; currentPage <= numberOfPages; currentPage ++ )

 

In this it will start the loop and start fetching the each page of the PDF

 

CGPDFPageRef SourcePDFPage = CGPDFDocumentGetPage(SourcePDFDocument, currentPage);
// CoreGraphics: MUST retain the Page-Refernce manually

CGPDFPageRetain(SourcePDFPage);

 

It will fetch the current Page from PDF and then it will retain it.

 

NSString *relativeOutputFilePath = [NSString stringWithFormat:@"%@/%@%d.png", directory, outputBaseName, currentPage];

NSString *ImageFileName = [documentsDirectory stringByAppendingPathComponent:relativeOutputFilePath];

 

It will create a path to save the Images

 

CGRect sourceRect = CGPDFPageGetBoxRect(SourcePDFPage, kCGPDFMediaBox);

UIGraphicsBeginPDFContextToFile(ImageFileName, sourceRect, nil);

UIGraphicsBeginImageContext(CGSizeMake(sourceRect.size.width,sourceRect.size.height));

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(currentContext, 0.0, sourceRect.size.height); //596,842 //640×960,

CGContextScaleCTM(currentContext, 1.0, -1.0);

CGContextDrawPDFPage (currentContext, SourcePDFPage); // draws the page in the graphics context

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

 

Here, the Current PDF page will be converted into Image.

 

NSString *imagePath = [documentsDirectory stringByAppendingPathComponent: relativeOutputFilePath];

[UIImagePNGRepresentation(image) writeToFile: imagePath atomically:YES];

 

It will save the file into the directory.