zoukankan      html  css  js  c++  java
  • iOS:quartz2D绘图(显示绘制在PDF上的图片)

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

    演示结果如下:
      

  • 相关阅读:
    python爬虫学习笔记(七)-数据提取之正则表达式
    python爬虫学习笔记(六)-Request库的用法
    python爬虫学习笔记(五)-URLError与Cookie
    python爬虫学习笔记(四)-urllib库的高级用法
    python爬虫学习笔记(三)-爬取数据之urllib库
    20183215 实验四《Python程序设计》实验报告
    20183215 实验二《Python程序设计》实验报告
    20183215 实验一《Python程序设计》实验报告
    文件读写
    类和正则表达(自动更正、代数运算)
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4869576.html
Copyright © 2011-2022 走看看