码迷,mamicode.com
首页 > 移动开发 > 详细

iOS:quartz2D绘图(显示绘制在PDF上的图片)

时间:2015-10-11 18:03:10      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

quart2D既可以用来绘制图像到pdf上,也可以从pdf上读取图像并显示出来。在使用这种方式之前,还有一种方式可以用来读取显示pdf上的图像,即使用UIWebView网页视图控件- (void)loadRequest:(NSURLRequest *)request方法加载绘制到视图上显示,这里我将会将这两种方式都演示一遍。

 

具体的实例如下:

方式一:采用网页视图控件UIWebView的方式显示在pdf上的绘图

1、在故事板视图中拖入两个子控件,分别是网页视图控件webView和显示按钮

技术分享 技术分享

2、将网页视图控件webView IBOutLet关联到控制器类中,为显示按钮添加显示事件IBAction

技术分享

 

技术分享

 

3、写按钮事件代码显示pdf上绘制的图片

#param mark -使用网页视图控件显示PDF内容

- (IBAction)showPDF:(UIButton *)sender
{
    //设置pdf文件的路径
    NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
    //文档目录
    NSString *document = [documents lastObject];
    //NSLog(@"%@",document);
    
    //拼接pdf路径
    NSString *PDFpath = [document stringByAppendingPathComponent:@"img.pdf"];
    
    //创建URL
    NSURL *url = [NSURL URLWithString:PDFpath];
    
    //创建request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //在网页中显示
    [self.webView loadRequest:request];
}

点击按钮后,显示的pdf上的绘图截图为:

技术分享

 

 

 

方式二:采用quartz2D的方式用其封装好的函数显示在pdf上的绘图

1.在故事板视图中拖入两个按钮控件,分别命名为上一页和下一页,用来翻看前面和后面的绘图。

技术分享

2、自定义一个视图类PDFView,并将控制器视图关联此类,同时将之前创建保存在沙盒目录下的pdf文件imageBook.pdf拖入文件

技术分享 技术分享 技术分享

3、在自定义的PDFView类中为两个按钮添加事件IBAction

技术分享

技术分享

4、再就是具体的代码了,如下:

在PDFView类中:

//PDFView.h文件中声明打开pdf文件方法和绘制图片显示方法

@interface PDFView : UIView
//打开pdf文件
-(void)openPDF:(NSURL *)url;
//绘制图片显示在视图上
-(void)drawPDFWithPage:(size_t)page andContext:(CGContextRef) context;
@end

//PDFView.m文件中说明pdf一些属性

@implementation PDFView
{
    //pdf文档
    CGPDFDocumentRef _pdfDoc;
    //当前页
    size_t _currentPageNum;
    //总页数
    size_t _totalPageNums;
}

//打开PDF文件

-(void)openPDF:(NSURL *)url
{
    //创建pdfDoc
    _pdfDoc = CGPDFDocumentCreateWithURL((__bridge CFURLRef)url);
    
    //总页数
    _totalPageNums = CGPDFDocumentGetNumberOfPages(_pdfDoc);
    
    //第一页
    _currentPageNum = 1;
}

//上一页

- (IBAction)pagePrev:(UIButton *)sender
{
    if (_currentPageNum >1)
    {
        _currentPageNum--;
        [self setNeedsDisplay];
    }
}

//下一页

- (IBAction)pageNext:(UIButton *)sender
{
    if (_currentPageNum < _totalPageNums)
    {
        _currentPageNum++;
        [self setNeedsDisplay];
    }
}

//显示PDF

-(void)drawPDFWithPage:(size_t)page andContext:(CGContextRef) context
{
    //获取页
    CGPDFPageRef pdfPage = CGPDFDocumentGetPage(_pdfDoc, page);
    
    //画pdf页面
    CGContextDrawPDFPage(context, pdfPage);
}

//重写drawRect:(CGRect rect)方法绘制从pdf文件获取的图像(由于quartzD坐标系是反的,所以需要旋转坐标系)

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //旋转坐标系
    CGContextTranslateCTM(context, 80, self.frame.size.height-60);
    CGContextScaleCTM(context, 1, -1);
    
    [self drawPDFWithPage:_currentPageNum andContext:context];
}

 

 

在控制器ViewController类中:

//调用执行

- (void)viewDidLoad {
    [super viewDidLoad];
   
    //加载pdf文件
    NSString *pdfFileName = [[NSBundle mainBundle]pathForResource:@"imageBook" ofType:@"pdf"];
    
    NSURL *url = [NSURL fileURLWithPath:pdfFileName];
    
    PDFView *pdfView = (PDFView*)self.view;
    
    [pdfView openPDF:url];
}

 

演示结果如下:
技术分享  技术分享

 

iOS:quartz2D绘图(显示绘制在PDF上的图片)

标签:

原文地址:http://www.cnblogs.com/XYQ-208910/p/4869576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!