注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

倚天剑

青春要在奔跑中度过

 
 
 

日志

 
 
 
 

iOS读取和显示PDF文档  

2012-11-20 11:35:11|  分类: 开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

iOS创建PDF文件中简单介绍了如何生成pdf文件。现在有需求要显示PDF文档。看了一下Apple的API,大概有两种方法:

  • 使用WebView,可以直接读取PDF,这个比较简单,可参见:最简单的WebView应用,缺点是自定义的能力较弱,优点是简单,像读取网页一样;
  • 使用自定义的UIView,需要继承UIView,自定义效果很好,问题是需要了解和使用的API较多。

本文只说明自定义UIView的方法。实现的在iPad模拟器上的效果:

image

本文方法参考了:官方文档。见A function that draw a PDF page的代码部分:

void MyDisplayPDFPage (CGContextRef myContext, 
                    size_t pageNumber, 
                    const char *filename) 

    CGPDFDocumentRef document; 
    CGPDFPageRef page; 
    CGRect box; 
  
    document = MyGetPDFDocumentRef (filename);// 1 
    page = CGPDFDocumentGetPage (document, pageNumber);// 2 
    CGContextDrawPDFPage (myContext, page);// 3 
    CGPDFDocumentRelease (document);// 4 
}

可见,编写读取的代码很简单,只需给定三个参数即可。后两个很容易,pageNumber是int型的数字,表示第几页,filename是肯定知道的。问题是如何获取CGContextRef,这个类型对象是用于绘图的上下文对象引用,没有它就没法绘制到屏幕界面上。

查了一下文档,特别是这个帖子:

http://stackoverflow.com/questions/3287635/how-to-parse-pdf-in-objective-c-for-ipad

看来要继承UIView,才能得到当前视图的Context。基本思路是覆盖UIView的drawRect方法,在该方法中:

- (void)drawRect:(CGRect)rect { 
    [self drawInContext:UIGraphicsGetCurrentContext()]; 
}

调用UIGraphicsGetCurrentContext方法,将当前的图形上下文设置给调用PDF的代码。drawRect方法会在iOS系统绘制界面的时候调用。

下面来说说编写代码的步骤,首先创建一个view-based application,然后,通过IB,设置控制器到view的关联。

以下不再用IB了,PDF的UIView是通过程序生成的。

创建PdfView类,是UIView的子类。头文件:

#import <Foundation/Foundation.h>

@interface PdfView : UIView { 
    CGPDFDocumentRef pdf; 
}

-(void)drawInContext:(CGContextRef)context;

@end

 

里面带一个成员,pdf,代表pdf文档对象的引用。一个方法,用于根据图形上下文在视图中绘制制定的pdf页面。

m文件:

#import "PdfView.h"

@implementation PdfView 
- (id)initWithFrame:(CGRect)frame{ 
    
    if ((self = [super initWithFrame:frame])) 
    { 
        // Initialization code 
        if(self != nil) 
        { 
            CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("test.pdf"), NULL, NULL); 
            pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 
            CFRelease(pdfURL); 
        } 
    } 
    return self; 
}

-(void)drawInContext:(CGContextRef)context 

    // PDF page drawing expects a Lower-Left coordinate system, so we flip the coordinate system 
    // before we start drawing. 
    CGContextTranslateCTM(context, 0.0, self.bounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    
    // Grab the first PDF page 
    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1); 
    // We’re about to modify the context CTM to draw the PDF page where we want it, so save the graphics state in case we want to do more drawing 
    CGContextSaveGState(context); 
    // CGPDFPageGetDrawingTransform provides an easy way to get the transform for a PDF page. It will scale down to fit, including any 
    // base rotations necessary to display the PDF page correctly. 
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, self.bounds, 0, true); 
    // And apply the transform. 
    CGContextConcatCTM(context, pdfTransform); 
    // Finally, we draw the page and restore the graphics state for further manipulations! 
    CGContextDrawPDFPage(context, page); 
    CGContextRestoreGState(context); 
}

- (void)drawRect:(CGRect)rect { 
    [self drawInContext:UIGraphicsGetCurrentContext()]; 
}

在这里使用的pdf文档,是放在项目的Resources目录下的。

再往下,就是在Controller中通过程序创建PdfView实例,并将它关联为Controller根视图的子视图:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    CGRect frame = CGRectMake(0, 0, 768, 1000); 
    
    PdfView *pdfView = [[PdfView alloc] initWithFrame:frame]; 
    pdfView.backgroundColor=[UIColor whiteColor]; 
    [self.view addSubview:pdfView]; 
    
}

 

这里因为是使用iPad,因此长宽是1000(上面留点空间)和768。另外,需要设置底色,默认情况下底色是黑色的,和黑体的文字在一起就显示不出文字了,我设置的是白色:

pdfView.backgroundColor=[UIColor whiteColor];

这样就可以了,而且中文啥的都没问题。



转自:http://marshal.easymorse.com/archives/3585

  评论这张
 
阅读(228)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017