第一个pdf页面的图像ios sdk [英] Image of the first pdf page ios sdk

查看:99
本文介绍了第一个pdf页面的图像ios sdk的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你知道如何在UfmageView中保存pdf文件的第一页吗?
我必须为pdf创建预览。
您有什么想法吗?

Do you know how to save into a UIImageView the first page of a pdf file? I have to create the preview for the pdf. Do you have any idea?

感谢您的帮助
Nicco

Thanks for help Nicco

推荐答案

以下方法将从PDF文件构建缩略图。它是RetinaDisplay识别的,因此缩略图在这些设备上应该特别清晰。

The following method will build a thumbnail from a PDF file. It is RetinaDisplay-aware, so the thumbnails should be especially crisp on such devices.

- (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存在于你的应用程序的主包中。)

You will need to supply a CGPDFDocumentRef corresponding to your PDF file, something like the following. (This one assumes that the file test.pdf exists in your app's main bundle.)

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中显示缩略图,如下所示:

Finally, you can display the thumbnail image in an UIImageView, like so:

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

  [self.view addSubview:thumbnailImageView];

这篇关于第一个pdf页面的图像ios sdk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆