/ /最初のpdfページの画像iossdk-iphone、objective-c、ios、pdf、uiimage

最初のpdfページの画像iOS SDK-iPhone、Objective-C、IOS、PDF、UIImage

PDFファイルの最初のページをUIImageViewに保存する方法を知っていますか? PDFのプレビューを作成する必要があります。 何か考えはありますか?

手伝ってくれてありがとう ニッコ

回答:

回答№1の場合は7

次の方法では、PDFファイルからサムネイルを作成します。これは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 pathn", inputPDFFileAsCString);
return NULL;
}

return document;
}

最後に、次のようにサムネイル画像をUIImageViewに表示できます。

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

[self.view addSubview:thumbnailImageView];

回答№2の6

私が取り組んでいたプロジェクトの一環として、呼び出しで変数とともに使用されるようにinwitのコードを変更しました。同様の解決策を探している人を助けるために、ここに投稿すると思いました。

それらを呼び出すには:

//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 pathn", inputPDFFileAsCString);
return NULL;
}

return document;
}

回答№3の場合は0

UIViewのスクリーンショットを撮る方法はいくつかあります。

ここを見て http://www.icodeblog.com/2009/07/27/1188/

こちらもご覧ください。 UIViewのスクリーンショットを撮るにはどうすればよいですか?

これはハッキーかもしれませんが、UIWebviewでPDFを開いて、UIImageViewへの上記のリンクのいずれかのコードを使用して最初のページのスクリーンショットを撮ることができます。次に、PDFを閉じます。


回答№4の場合は0

これはあなたが探しているものですか?- http://ipdfdev.com/2011/03/28/convert-a-pdf-page-to-image-on-the-iphone-and-ipad/。出力はUIImageであるため、UIImageViewに表示できるはずです。