第一个pdf页面的图像ios sdk

你知道如何保存到UIImageView的PDF文件的第一页? 我必须创buildpdf的预览。 你有什么主意吗?

感谢Nicco的帮助

以下方法将从PDF文件构build缩略图。 这是RetinaDisplay意识到的,所以缩略图应该是特别脆这样的设备。

- (UIImage *)buildThumbnailImage { BOOL hasRetinaDisplay = FALSE; // by default CGFloat pixelsPerPoint = 1.0; // by default (pixelsPerPoint is just the "scale" property of the screen) if ([UIScreen instancesRespondToSelector:@selector(scale)]) // the "scale" property is only present in iOS 4.0 and later { // we are running iOS 4.0 or later, so we may be on a Retina display; we need to check further... if ((pixelsPerPoint = [[UIScreen mainScreen] scale]) == 1.0) hasRetinaDisplay = FALSE; else hasRetinaDisplay = TRUE; } else { // we are NOT running iOS 4.0 or later, so we can be sure that we are NOT on a Retina display pixelsPerPoint = 1.0; hasRetinaDisplay = FALSE; } size_t imageWidth = 320; // width of thumbnail in points size_t imageHeight = 460; // height of thumbnail in points if (hasRetinaDisplay) { imageWidth *= pixelsPerPoint; imageHeight *= pixelsPerPoint; } size_t bytesPerPixel = 4; // RGBA size_t bitsPerComponent = 8; size_t bytesPerRow = bytesPerPixel * imageWidth; void *bitmapData = malloc(imageWidth * imageHeight * bytesPerPixel); // in the event that we were unable to mallocate the heap memory for the bitmap, // we just abort and preemptively return nil: if (bitmapData == NULL) return nil; // remember to zero the buffer before handing it off to the bitmap context: bzero(bitmapData, imageWidth * imageHeight * bytesPerPixel); CGContextRef theContext = CGBitmapContextCreate(bitmapData, imageWidth, imageHeight, bitsPerComponent, bytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); CGPDFDocumentRef pdfDocument = MyGetPDFDocumentRef(); // NOTE: you will need to modify this line to supply the CGPDFDocumentRef for your file here... CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDocument, 1); // get the first page for your thumbnail CGAffineTransform shrinkingTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, CGRectMake(0, 0, imageWidth, imageHeight), 0, YES); CGContextConcatCTM(theContext, shrinkingTransform); CGContextDrawPDFPage(theContext, pdfPage); // draw the pdfPage into the bitmap context CGPDFDocumentRelease(pdfDocument); // // create the CGImageRef (and thence the UIImage) from the context (with its bitmap of the pdf page): // CGImageRef theCGImageRef = CGBitmapContextCreateImage(theContext); free(CGBitmapContextGetData(theContext)); // this frees the bitmapData we malloc'ed earlier CGContextRelease(theContext); UIImage *theUIImage; // CAUTION: the method imageWithCGImage:scale:orientation: only exists on iOS 4.0 or later!!! if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) { theUIImage = [UIImage imageWithCGImage:theCGImageRef scale:pixelsPerPoint orientation:UIImageOrientationUp]; } else { theUIImage = [UIImage imageWithCGImage:theCGImageRef]; } CFRelease(theCGImageRef); return theUIImage; } 

您将需要提供与您的PDF文件相对应的CGPDFDocumentRef,如下所示。 (这个假设文件test.pdf存在于您的应用程序的主包中。)

 CGPDFDocumentRef MyGetPDFDocumentRef() { NSString *inputPDFFile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"test.pdf"]; const char *inputPDFFileAsCString = [inputPDFFile cStringUsingEncoding:NSASCIIStringEncoding]; //NSLog(@"expecting pdf file to exist at this pathname: \"%s\"", inputPDFFileAsCString); CFStringRef path = CFStringCreateWithCString(NULL, inputPDFFileAsCString, kCFStringEncodingUTF8); CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0); CFRelease (path); CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); CFRelease(url); if (CGPDFDocumentGetNumberOfPages(document) == 0) { printf("Warning: No pages in pdf file \"%s\" or pdf file does not exist at this path\n", inputPDFFileAsCString); return NULL; } return document; } 

最后,您可以在UIImageView中显示缩略图,如下所示:

  UIImageView *thumbnailImageView = [[UIImageView alloc] initWithImage:[self buildThumbnailImage]]; [self.view addSubview:thumbnailImageView]; 

作为我正在开发的一个项目的一部分,我修改了inwit的代码,以便在调用中使用variables。 我想我会张贴他们在这里帮助任何人正在寻找类似的解决scheme:

给他们打电话:

 //Assume all your PDFs you want to create thumbnails for are in an array. This method saves the paths to all PDFs in your main bundle as NSStrings. _pdfs = [[NSBundle mainBundle] pathsForResourcesOfType:@"pdf" inDirectory:nil]; //To be called in the cellForItemAtIndexPath method or a similar method where you want to create a thumbnail for the image: NSString *loc = [_pdfs objectAtIndex:indexPath.row]; UIImage *cellImage = [self buildThumbnailImage:MyGetPDFDocumentRef(loc)]; 

方法和C函数:

 - (UIImage *)buildThumbnailImage:(CGPDFDocumentRef)pdfDocument { BOOL hasRetinaDisplay = FALSE; // by default CGFloat pixelsPerPoint = 1.0; // by default (pixelsPerPoint is just the "scale" property of the screen) if ([UIScreen instancesRespondToSelector:@selector(scale)]) // the "scale" property is only present in iOS 4.0 and later { // we are running iOS 4.0 or later, so we may be on a Retina display; we need to check further... if ((pixelsPerPoint = [[UIScreen mainScreen] scale]) == 1.0) hasRetinaDisplay = FALSE; else hasRetinaDisplay = TRUE; } else { // we are NOT running iOS 4.0 or later, so we can be sure that we are NOT on a Retina display pixelsPerPoint = 1.0; hasRetinaDisplay = FALSE; } size_t imageWidth = 320; // width of thumbnail in points size_t imageHeight = 460; // height of thumbnail in points if (hasRetinaDisplay) { imageWidth *= pixelsPerPoint; imageHeight *= pixelsPerPoint; } size_t bytesPerPixel = 4; // RGBA size_t bitsPerComponent = 8; size_t bytesPerRow = bytesPerPixel * imageWidth; void *bitmapData = malloc(imageWidth * imageHeight * bytesPerPixel); // in the event that we were unable to mallocate the heap memory for the bitmap, // we just abort and preemptively return nil: if (bitmapData == NULL) return nil; // remember to zero the buffer before handing it off to the bitmap context: bzero(bitmapData, imageWidth * imageHeight * bytesPerPixel); CGContextRef theContext = CGBitmapContextCreate(bitmapData, imageWidth, imageHeight, bitsPerComponent, bytesPerRow, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); //CGPDFDocumentRef pdfDocument = MyGetPDFDocumentRef(); // NOTE: you will need to modify this line to supply the CGPDFDocumentRef for your file here... CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDocument, 1); // get the first page for your thumbnail CGAffineTransform shrinkingTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, CGRectMake(0, 0, imageWidth, imageHeight), 0, YES); CGContextConcatCTM(theContext, shrinkingTransform); CGContextDrawPDFPage(theContext, pdfPage); // draw the pdfPage into the bitmap context CGPDFDocumentRelease(pdfDocument); // // create the CGImageRef (and thence the UIImage) from the context (with its bitmap of the pdf page): // CGImageRef theCGImageRef = CGBitmapContextCreateImage(theContext); free(CGBitmapContextGetData(theContext)); // this frees the bitmapData we malloc'ed earlier CGContextRelease(theContext); UIImage *theUIImage; // CAUTION: the method imageWithCGImage:scale:orientation: only exists on iOS 4.0 or later!!! if ([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) { theUIImage = [UIImage imageWithCGImage:theCGImageRef scale:pixelsPerPoint orientation:UIImageOrientationUp]; } else { theUIImage = [UIImage imageWithCGImage:theCGImageRef]; } CFRelease(theCGImageRef); return theUIImage; } CGPDFDocumentRef MyGetPDFDocumentRef(NSString *inputPDFFile) { //NSString *inputPDFFile = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"test.pdf"]; const char *inputPDFFileAsCString = [inputPDFFile cStringUsingEncoding:NSASCIIStringEncoding]; //NSLog(@"expecting pdf file to exist at this pathname: \"%s\"", inputPDFFileAsCString); CFStringRef path = CFStringCreateWithCString(NULL, inputPDFFileAsCString, kCFStringEncodingUTF8); CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0); CFRelease (path); CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); CFRelease(url); if (CGPDFDocumentGetNumberOfPages(document) == 0) { printf("Warning: No pages in pdf file \"%s\" or pdf file does not exist at this path\n", inputPDFFileAsCString); return NULL; } return document; } 

有一些截取UIViews的截图的方法:

看这里http://www.icodeblog.com/2009/07/27/1188/

也看看这里: 我如何采取一个UIView的屏幕截图?

这可能是hacky,但是您可以在UIWebview中打开PDF,使用上述链接之一中的代码将第一页的屏幕截图显示为UIImageView。 然后closuresPDF。

这是你在找什么? – http://ipdfdev.com/2011/03/28/convert-a-pdf-page-to-image-on-the-iphone-and-ipad/ 。 输出是一个UIImage,所以你应该能够在你的UIImageView中显示。