How to parse PDF in Objective-C for iPad

I am stuck parsing a PDF file. Please help me how to do this.

Header file

//PDFViewer.h @interface PDFViewer : UIView { CGPDFDocumentRef pdf; } -(void)drawInContext:(CGContextRef)context; @end 

Implementation file

 //PDFViewer.m @implementation PDFViewer - (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { // Initialization code if(self != nil) { CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("WR1MayJun1S08.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); } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ - (void)dealloc { CGPDFDocumentRelease(pdf); [super dealloc]; } @end 

Now I am adding this class (PDFViewer.h) to my MainViewController.

 //MainViewController.m CGRect frame = CGRectMake(0, 200, 300, 500); PDFViewer *pdfViewer = [[PDFViewer alloc] initWithFrame:frame]; CGContextRef context = UIGraphicsGetCurrentContext(); [pdfViewer drawInContext:context]; [self.view addSubview:pdfViewer]; 

He does not show anything. I get the following errors / warnings:

 local MultiView[2850] <Error>: CGContextTranslateCTM: invalid context local MultiView[2850] <Error>: CGContextScaleCTM: invalid context local MultiView[2850] <Error>: CGContextSaveGState: invalid context local MultiView[2850] <Error>: CGContextConcatCTM: invalid context local MultiView[2850] <Error>: CGContextRestoreGState: invalid context 

What am I missing?

Sincerely.

+6
objective-c pdf ipad
source share
2 answers

UIGraphicsGetCurrentContext does not return a context if it is not.

You try to get context when initializing the view, then there is no context. A valid context is -[UIView drawRect:] stack just before the call -[UIView drawRect:] . This should work:

 //PDFViewer.m @implementation PDFViewer - (void)drawRect:(CGRect)rect { [self drawInContext:UIGraphicsGetCurrentContext()]; } @end 

EDIT Despite the fact that I do not want to give anyone code to copy and paste, I do not think that there is another option if you do not understand my last comment. I don’t know what you tried, but if you try to understand what I'm really saying, this is the only thing you can think of:

 //PDFViewer.m @implementation PDFViewer - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("WR1MayJun1S08.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()]; } - (void)dealloc { CGPDFDocumentRelease(pdf); [super dealloc]; } @end 

-

 //MainViewController.m CGRect frame = CGRectMake(0, 200, 300, 500); PDFViewer *pdfViewer = [[PDFViewer alloc] initWithFrame:frame]; [self.view addSubview:pdfViewer]; 
+4
source share

I have another easy way to parse PDF for iPhone / iPad:
1. Select one UIwebView (name: pdfView ).

2.Give IBoutlet connection to it and delegate it to the file server

3.In Viewdidload

 [self.pdfView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"ObjC" ofType:@"pdf"]]]]; 

4.ObjC.pdf should be in the resource folder.

+3
source share

All Articles