使用下面函数创建一个pdf

1. CGPDFDocumentRef CGPDFDocumentCreateWithProvider ( CGDataProviderRef provider );

复制代码



创建provider使用下面函数


    1. CGDataProviderRef CGDataProviderCreateWithCFData ( CFDataRef data );



    复制代码



    CGContextRef context = UIGraphicsGetCurrentContext();

    画一个正方形图形 没有边框

    CGContextSetRGBFillColor(context, 0, 0.25, 0, 0.5);
    CGContextFillRect(context, CGRectMake(2, 2, 270, 270));
    CGContextStrokePath(context);

     

    写文字

    CGContextSetLineWidth(context, 1.0);
    CGContextSetRGBFillColor (context,  1, 1, 1, 1.0);UIFont  *font = [UIFont boldSystemFontOfSize:11.0];
    [@"fangyp" drawInRect:CGRectMake(40, 40, 80, 20) withFont:font];

     

    画一条线

    CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//线条颜色
    CGContextMoveToPoint(context, 20, 20);
    CGContextAddLineToPoint(context, 200,20);
    CGContextStrokePath(context);

     

    画正方形边框

    CGContextSetRGBStrokeColor(context, 1, 1.0, 1.0, 1.0); 
    CGContextSetLineWidth(context, 2.0);
    CGContextAddRect(context, CGRectMake(2, 2, 270, 270));
    CGContextStrokePath(context);

     

    画方形背景颜色


    CGContextTranslateCTM(ctx, 0.0f, self.view.bounds.size.height); 
      
     
      
    
           CGContextScaleCTM(ctx, 1.0f, -1.0f); 
      
     
      
    
           UIGraphicsPushContext(ctx); 
      
     
      
    
          CGContextSetLineWidth(ctx,320); 
      
     
      
    
          CGContextSetRGBStrokeColor(ctx, 250.0/255, 250.0/255, 210.0/255, 1.0);  
      
     
      
    
          CGContextStrokeRect(ctx, CGRectMake(0, 0, 320, 460)); 
      
     
     
      UIGraphicsPopContext();

    iOS读取和显示PDF文档

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

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

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

    iOS开发 pdf在线查看_iOS开发 pdf在线查看

    本文方法参考了:官方文档。见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];