今天的任務是:在iOS上加載顯示pdf文件。
方法一:利用webview
- -(void)loadDocument:(NSString *)documentName inView:(UIWebView *)webView
- {
- NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil];
- NSURL *url = [NSURL fileURLWithPath:path];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [webView loadRequest:request];
- }
- -(void)loadDocument:(NSString *)documentName inView:(UIWebView *)webView
- {
- NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil];
- NSURL *url = [NSURL fileURLWithPath:path];
- NSURLRequest *request = [NSURLRequest requestWithURL:url];
- [webView loadRequest:request];
- }
利:1.實現簡單
2.還是實現簡單
弊:1.僅能瀏覽,拿不到任何回調,safari不會鳥任何人。
2.固定豎版拖動,想實現翻頁動效果就扒瞎
下面的方法可以解決webview 顯示pdf的弊,相對的,要付出一些汗水作為代價了。
方法二:利用CGContextDrawPDFPage
- CGPDFDocumentRef GetPDFDocumentRef(NSString *filename)
- {
- CFStringRef path;
- CFURLRef url;
- CGPDFDocumentRef document;
- size_t count;
- path = CFStringCreateWithCString (NULL, [filename UTF8String], kCFStringEncodingUTF8);
- url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);
- CFRelease (path);
- document = CGPDFDocumentCreateWithURL (url);
- CFRelease(url);
- count = CGPDFDocumentGetNumberOfPages (document);
- if (count == 0) {
- printf("[%s] needs at least one page!\n", [filename UTF8String]);
- return NULL;
- } else {
- printf("[%ld] pages loaded in this PDF!\n", count);
- }
- return document;
- }
- void DisplayPDFPage (CGContextRef myContext, size_t pageNumber, NSString *filename)
- {
- CGPDFDocumentRef document;
- CGPDFPageRef page;
- document = GetPDFDocumentRef (filename);
- page = CGPDFDocumentGetPage (document, pageNumber);
- CGContextDrawPDFPage (myContext, page);
- CGPDFDocumentRelease (document);
- }
- CGPDFDocumentRef GetPDFDocumentRef(NSString *filename)
- {
- CFStringRef path;
- CFURLRef url;
- CGPDFDocumentRef document;
- size_t count;
- path = CFStringCreateWithCString (NULL, [filename UTF8String], kCFStringEncodingUTF8);
- url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);
- CFRelease (path);
- document = CGPDFDocumentCreateWithURL (url);
- CFRelease(url);
- count = CGPDFDocumentGetNumberOfPages (document);
- if (count == 0) {
- printf("[%s] needs at least one page!\n", [filename UTF8String]);
- return NULL;
- } else {
- printf("[%ld] pages loaded in this PDF!\n", count);
- }
- return document;
- }
- void DisplayPDFPage (CGContextRef myContext, size_t pageNumber, NSString *filename)
- {
- CGPDFDocumentRef document;
- CGPDFPageRef page;
- document = GetPDFDocumentRef (filename);
- page = CGPDFDocumentGetPage (document, pageNumber);
- CGContextDrawPDFPage (myContext, page);
- CGPDFDocumentRelease (document);
- }
這樣顯示出來的pdf單頁是倒立的,Quartz坐標系和UIView坐標系不一樣所致,調整坐標系,使pdf正立:
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextTranslateCTM(context, 80, self.frame.size.height-60);
- CGContextScaleCTM(context, 1, -1);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextTranslateCTM(context, 80, self.frame.size.height-60);
- CGContextScaleCTM(context, 1, -1);
配合iOS5強大的UIPageViewController實現翻頁瀏覽
- - (PDFViewController *)viewControllerAtIndex:(NSUInteger)index
- {
- //Return the PDFViewController for the given index.
- if (([self.pagePDF count] == 0 )|| (index > [self.pagePDF count]) ) {
- return nil;
- }
- //Create a new view controller and pass suitable data.
- PDFViewController *dataViewController = [[PDFViewController alloc]initWithNibName:@"PDFViewController" bundle:nil];
- //dataViewController.pdfview = [self.pagePDF objectAtIndex:index];
- dataViewController.pdfview = [[PDFView alloc]initWithFrame:self.view.frame atPage:index];
- [dataViewController.view addSubview:dataViewController.pdfview];
- NSLog(@"index = %d",index);
- return dataViewController;
- }
- - (NSUInteger) indexOfViewController:(PDFViewController *)viewController
- {
- return [self.pagePDF indexOfObject:viewController.pdfview];
- }
- - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
- {
- NSUInteger index = [self indexOfViewController:(PDFViewController *)viewController];
- if ((index == 0 ) || (index == NSNotFound)){
- return nil;
- }
- index--;
- return [self viewControllerAtIndex:index];
- }
- - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
- {
- NSUInteger index = [self indexOfViewController:(PDFViewController *)viewController];
- if (index == NSNotFound)
- {
- return nil;
- }
- index++;
- if (index == [self.pagePDF count]){
- return nil;
- }
- return [self viewControllerAtIndex:index];
- }
- -
- (PDFViewController *)viewControllerAtIndex:(NSUInteger)index
- {
- //Return the PDFViewController for the given index.
- if (([self.pagePDF count] == 0 )|| (index > [self.pagePDF count])
- ) {
- return nil;
- }
- //Create a new view controller and pass suitable data.
- PDFViewController *dataViewController = [[PDFViewController
- alloc]initWithNibName:@"PDFViewController" bundle:nil];
- //dataViewController.pdfview = [self.pagePDF objectAtIndex:index];
- dataViewController.pdfview = [[PDFView
- alloc]initWithFrame:self.view.frame atPage:index];
- [dataViewController.view addSubview:dataViewController.pdfview];
- NSLog(@"index = %d",index);
- return dataViewController;
- }
- - (NSUInteger) indexOfViewController:(PDFViewController *)viewController
- {
- return [self.pagePDF indexOfObject:viewController.pdfview];
- }
- - (UIViewController *)pageViewController:(UIPageViewController
- *)pageViewController
- viewControllerBeforeViewController:(UIViewController *)viewController
- {
- NSUInteger index = [self indexOfViewController:(PDFViewController
- *)viewController];
- if ((index == 0 ) || (index == NSNotFound)){
- return nil;
- }
- index--;
- return [self viewControllerAtIndex:index];
- }
- - (UIViewController *)pageViewController:(UIPageViewController
- *)pageViewController viewControllerAfterViewController:(UIViewController
- *)viewController
- {
- NSUInteger index = [self indexOfViewController:(PDFViewController
- *)viewController];
- if (index == NSNotFound)
- {
- return nil;
- }
- index++;
- if (index == [self.pagePDF count]){
- return nil;
- }
- return [self viewControllerAtIndex:index];
- }
后續將完成塗鴉pdf后保存創建新pdf的功能。
轉載:http://blog.csdn.net/wanglang3081/article/details/7663624