求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
iOS开发笔记——PDF的显示和浏览
 

作者:yiyaaixuexi,发布于2012-10-9,来源:新浪博客

 

今天的任务是:在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];   
}  

利: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);   
}   

这样显示出来的pdf单页是倒立的,Quartz坐标系和UIView坐标系不一样所致,调整坐标系,使pdf正立:

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];   
}  


相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程

 
分享到
 
 
     


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...