我们正在使用UIWebViews
显示PDF内容。理想情况下,我希望能够在UITableView
中显示缩略图,而不会同时加载许多不同的UIWebViews
......它们足够慢加载一个文档 - 不要介意10+!如何以编程方式生成iPhone SDK的PDF缩略图?
有没有人有关于如何去做这件事的任何提示?
我想过屏幕捕获使用UIDocumentInteractionController
或UIWebView
加载的文档,但这意味着它们都必须在显示表之前缩略图。
我们正在使用UIWebViews
显示PDF内容。理想情况下,我希望能够在UITableView
中显示缩略图,而不会同时加载许多不同的UIWebViews
......它们足够慢加载一个文档 - 不要介意10+!如何以编程方式生成iPhone SDK的PDF缩略图?
有没有人有关于如何去做这件事的任何提示?
我想过屏幕捕获使用UIDocumentInteractionController
或UIWebView
加载的文档,但这意味着它们都必须在显示表之前缩略图。
Apple直接在CoreGraphics
级别提供了大量方法来绘制PDF内容。据我所知,在UIKit
级别都没有整齐地包装起来,所以在这一点上它可能不适合你的项目,特别是如果你不太适应C级。但是,相关函数是CGContextDrawPDFPage;
,按照正常的方式有其他方法可以从数据源创建PDF引用,然后从PDF获取页面引用。然后,您需要处理缩放并转换为您需要的视图,并且需要警告您需要执行水平翻转操作,因为PDF(和OS X)使用左下角作为原点,而iOS使用左上角。示例代码,从我的头顶:
UIGraphicsBeginImageContext(thumbnailSize);
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithProvider((CGDataProviderRef)instanceOfNSDataWithPDFInside);
CGPDFPageRef pageRef = CGPDFDocumentGetPage(pdfRef, 1); // get the first page
CGContextRef contextRef = UIGraphicsGetCurrentContext();
// ignore issues of transforming here; depends on exactly what you want and
// involves a whole bunch of normal CoreGraphics stuff that is nothing to do
// with PDFs
CGContextDrawPDFPage(contextRef, pageRef);
UIImage *imageToReturn = UIGraphicsGetImageFromCurrentImageContext();
// clean up
UIGraphicsEndImageContext();
CGPDFDocumentRelease(pdfRef);
return imageToReturn;
在猜测,你可能会想使用CGPDFPageGetBoxRect(pageRef, kCGPDFCropBox)
获得页面的裁剪框,然后制定出如何缩放/动议,以适应您的图片大小。
可能更容易上CALayer
(见QA 1703)的-renderInContext:
方法 - 让一个屏幕截图是UIGetScreenImage
的老手段,但从来没有真正官方的API,并似乎暂时只允许因的RedLaser的意外审批。通过QA中的代码,您可以自行设置从其他视图获取UIImage,而不必在屏幕上显示该视图。哪些可能解决您的屏幕捕获问题?尽管这意味着您只能支持OS 4.x。
无论是哪种情况,PDF都不会很快得出。您可能需要填充表格,然后在后台线程上绘制缩略图,并在可用时向上推动缩略图。你不能在后台线程上安全地使用UIKit对象,但所有的东西都是安全的。
以下是考虑转换的示例代码。 :)
NSURL* pdfFileUrl = [NSURL fileURLWithPath:finalPath];
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl);
CGPDFPageRef page;
CGRect aRect = CGRectMake(0, 0, 70, 100); // thumbnail size
UIGraphicsBeginImageContext(aRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
UIImage* thumbnailImage;
NSUInteger totalNum = CGPDFDocumentGetNumberOfPages(pdf);
for(int i = 0; i < totalNum; i++) {
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, aRect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetGrayFillColor(context, 1.0, 1.0);
CGContextFillRect(context, aRect);
// Grab the first PDF page
page = CGPDFDocumentGetPage(pdf, i + 1);
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, aRect, 0, true);
// And apply the transform.
CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, page);
// Create the new UIImage from the context
thumbnailImage = UIGraphicsGetImageFromCurrentImageContext();
//Use thumbnailImage (e.g. drawing, saving it to a file, etc)
CGContextRestoreGState(context);
}
UIGraphicsEndImageContext();
CGPDFDocumentRelease(pdf);
这里是产生一个UIImage缩略图PDF页面
static func getThumbnailForPDF(_ urlString:String, pageNumber:Int) -> UIImage? {
let bundle = Bundle.main
let path = bundle.path(forResource: urlString, ofType: "pdf")
let pdfURL = URL(fileURLWithPath: path!)
let pdf = CGPDFDocument(pdfURL as CFURL)!
let page = pdf.page(at: pageNumber)!
let rect = CGRect(x: 0, y: 0, width: 100.0, height: 70.0) //Image size here
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()!
context.saveGState()
context.translateBy(x: 0, y: rect.height)
context.scaleBy(x: 1.0, y: -1.0)
context.setFillColor(gray: 1.0, alpha: 1.0)
context.fill(rect)
let pdfTransform = page.getDrawingTransform(CGPDFBox.mediaBox, rect: rect, rotate: 0, preserveAspectRatio: true)
context.concatenate(pdfTransform)
context.drawPDFPage(page)
let thumbImage = UIGraphicsGetImageFromCurrentImageContext()
context.restoreGState()
UIGraphicsEndImageContext()
return thumbImage
}
嗨,Emil,你晚了约7年 - 但感谢没有让这个问题继续存在面对同一问题的任何人;-) – 2017-04-29 18:17:27
嗨alones迅速3的方法,我用你的代码来获取PDF缩略图。看起来像CGContextConcatCTM(上下文,pdfTransform)行产生一个内存瓶颈,我发现如果我离开这条线,那就没关系。但我不能离开它,因为我需要这个适当的缩略图。你有什么想法可以改进吗? Thx btw ... – aslisabanci 2011-08-10 15:11:15
这一个适合我......上面的一个我不知道为什么,但它产生了一个虚拟或垃圾缩图...谢谢... – Underdog 2011-08-31 14:17:42
doc的说UIGraphicsGetImageFromCurrentImageContext()是不是线程安全的 – 2012-05-15 18:16:59