通过本地PDF文件连接生产图片
#pragma mark - pdf转图片
// 通过本地PDF文件连接生产图片
+ (UIImage *)imageFromPDF:(NSURL *)url page:(NSInteger)page
{
page = MAX(1, page);
CFURLRef ref = (__bridge CFURLRef)url;
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL(ref);
// 获取 PDF 页数
NSInteger pageCount = CGPDFDocumentGetNumberOfPages(pdf);
UIImage *amg;
if (pageCount > 1) {
NSMutableArray *imgs = @[].mutableCopy;
for (int i = 1; i <= pageCount ; i++) {
CGImageRef imageRef = createPDFPageToCGImage(i,pdf);
UIImage *img = [UIImage imageWithCGImage:imageRef];
[imgs addObject:img];
CGImageRelease(imageRef);
}
amg = [self mergeImagesVertically:imgs];
}
else {
CGImageRef imageRef = createPDFPageToCGImage(pageCount,pdf);
amg = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
}
CGPDFDocumentRelease(pdf);
return amg;
}
CGContextRef CreateARGBBitmapContext(size_t pixelsWide, size_t pixelsHigh)
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void *bitmapData;
size_t bitmapByteCount;
size_t bitmapBytesPerRow;
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow *pixelsHigh);
// Use the generic RGB colorspace.
colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
if(colorSpace == NULL) {
fprintf(stderr, "Error allocating colorspace\n");
return NULL;
}
// Allocate memory for image data.This is the destination in memory
// where any drawing to the bitmapcontext will be rendered.
bitmapData = malloc( bitmapByteCount );
if(bitmapData == NULL)
{
fprintf (stderr, "Memory notallocated!");
CGColorSpaceRelease(colorSpace );
return NULL;
}
context = CGBitmapContextCreate(bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if(context == NULL) {
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease( colorSpace);
return context;
}
CGImageRef createPDFPageToCGImage(size_t pageNumber, CGPDFDocumentRef document)
{
CGPDFPageRef page;
CGRect pageSize;
CGContextRef outContext;
CGImageRef ThePDFImage;
page = CGPDFDocumentGetPage (document, pageNumber);
if(page) {
pageSize =CGPDFPageGetBoxRect(page,kCGPDFMediaBox);
outContext= CreateARGBBitmapContext(pageSize.size.width, pageSize.size.height);
if(outContext) {
CGContextDrawPDFPage(outContext, page);
ThePDFImage= CGBitmapContextCreateImage(outContext);
CFRelease(outContext);
return ThePDFImage;
}
}
return NULL;
}
+ (UIImage *)mergeImagesVertically:(NSArray<UIImage *> *)imagesArray {
CGFloat totalHeight = 0;
CGFloat maxWidth = 0;
// 计算总高度和最大宽度
for (UIImage *image in imagesArray) {
totalHeight += image.size.height;
maxWidth = MAX(maxWidth, image.size.width);
}
// 开始创建图片上下文
CGSize size = CGSizeMake(maxWidth, totalHeight);
UIGraphicsBeginImageContext(size);
CGFloat currentHeight = 0;
for (UIImage *image in imagesArray) {
[image drawAtPoint:CGPointMake((maxWidth - image.size.width) / 2, currentHeight)];
currentHeight += image.size.height;
}
// 从上下文获取合并后的图片
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return finalImage;
}
网友评论