Member-only story

Create PDF from any Microsoft Document loaded in UIWebView in iOS

Mr.Javed Multani
1 min readOct 2, 2020

--

#define kPaperSizeA4 CGSizeMake(595.2,841.8)

First of all implement UIPrintPageRenderer protocol

@interface UIPrintPageRenderer (PDF)
- (NSData*) printToPDF;
@end
@implementation UIPrintPageRenderer (PDF)- (NSData*) printToPDF
{NSMutableData *pdfData = [NSMutableData data];
UIGraphicsBeginPDFContextToData( pdfData, self.paperRect, nil );
[self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];
CGRect bounds = UIGraphicsGetPDFContextBounds();
for ( int i = 0 ; i < self.numberOfPages ; i++ )
{UIGraphicsBeginPDFPage();[self drawPageAtIndex: i inRect: bounds];
}UIGraphicsEndPDFContext();return pdfData;
}@end

Then, call below method after document finished loading in UIWebView

-(void)createPDF:(UIWebView *)webView {
UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0];float padding = 10.0f;
CGRect paperRect = CGRectMake(0, 0, kPaperSizeA4.width, kPaperSizeA4.height);CGRect printableRect = CGRectMake(padding, padding, kPaperSizeA4.width-(padding * 2), kPaperSizeA4.height-(padding * 2));[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];NSData *pdfData = [render printToPDF];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{if (pdfData) {
[pdfData writeToFile:directoryPath atomically: YES];}else{
NSLog(@"PDF couldnot be created");} });}

--

--

Mr.Javed Multani
Mr.Javed Multani

Written by Mr.Javed Multani

Software Engineer | Certified ScrumMaster® (CSM) | UX Researcher | Youtuber | Tech Writer

No responses yet