为了账号安全,请及时绑定邮箱和手机立即绑定

FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?

FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?

iOS
沧海一幻觉 2019-06-27 15:55:49
FAST和精益PDF查看器用于iPhone/iPad/IOS-提示和提示?最近有很多关于绘制PDF的问题。是的,您可以很容易地使用UIWebView但这不能给出您期望的良好PDF查看器的性能和功能。您可以绘制PDF页面。给一个卡莱尔或到UIImage..苹果甚至有示例代码来展示如何绘制一个大的PDF在可缩放的UIScrollview中但同样的问题不断出现。UIImage方法:PDF在一个UIImage不要像用图层法那样进行光学缩放。CPU和内存在生成UIImages从PDFcontext限制/防止使用它来创建新的缩放级别的实时呈现。CATILedLayer法:有一个很大的开销(时间)将完整的PDF页绘制到CALayer:可以看到单个瓷砖的呈现(即使是平铺大小的调整)。CALayers不能提前准备(在屏幕外呈现)。一般来说,PDF阅读器的内存也很重。甚至监控苹果的可缩放PDF示例的内存使用情况。在我当前的项目中,我正在开发一个PDF查看器,并呈现一个UIImage一个单独的线程中的页面(这里也有问题!)在刻度为x1的时候呈现出来。CATiledLayer一旦渲染的比例大于1,iBooks就会采用类似的双取方式,就像滚动页面一样,在清晰的版本出现之前,您可以在不到一秒钟的时间内看到页面的较低分辨率版本。我呈现每页2页的焦点,这样PDF图像就可以在开始绘图之前掩盖图层,当页面离焦点页面+2页时,页面就会再次被销毁。有没有人有任何洞察力,无论多小或多明显,都能提高PDF的性能/内存处理能力吗?或者这里讨论的其他问题?编辑:一些小贴士(信用-卢克·麦克奈斯,维德梅德·T,马特·加拉格尔,约翰):可以时将任何媒体保存到磁盘。如果在平铺上渲染,请使用更大的平铺尺寸在经常使用占位符对象的数组中,另一种设计方法是这一个注意,图像呈现速度比CGPDFPageRef使用NSOperations或GCD&砌块提前准备页面。打电话CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);以前CGContextDrawPDFPage减少绘图时的内存使用在你的NSOperations使用docRef是个坏主意(内存),将docRef包装成一个单例。取消不必要NSOperations当你可以的时候,特别是如果他们要使用内存的话,小心不要让上下文打开!回收页面对象并销毁未使用的视图在不需要任何开放上下文时立即关闭它们接收内存警告释放和重新加载DocRef和任何页面缓存其他PDF功能:获取PDF中的链接(和这里和这里)理解用于链接定位的PDF RECT转换PDF annot日期字符串获取链接的目标(从/Dest(数组)得到一张目录文件标题和关键词获取原始文本(和这里和这里和这里(定位重点)搜索(和这里)(并非所有PDF都有效(有些只显示奇怪的字符,我想这是编码问题,但我不确定)-CreditBrainfeed)CA层和离屏渲染-渲染下一页以快速/平滑显示文献资料石英PDFObjects(用于元信息、注释、拇指)以上PDF规格示例项目苹果/ZoomingPDF-放大,UIScrollView, CATiledLayerVFR/阅读器-放大,寻呼,UIScrollView, CATiledView眉/叶-具有良好过渡的分页脱脂-看上去的一切(OSX的PDF阅读器/编辑器)
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我使用近似相同的方法构建了这样的应用程序,除了:

  • 我将生成的映像缓存在磁盘上,并且总是在一个单独的线程中预先生成两到三个映像。
  • 我不会用

    UIImage

    但是,当缩放为1时,则在图层中绘制图像。当发出内存警告时,这些瓷砖将自动释放。

每当用户开始缩放时,我将获取CGPDFPage并使用适当的CTM进行渲染。代码- (void)drawLayer: (CALayer*)layer inContext: (CGContextRef) context就像:

CGAffineTransform currentCTM = CGContextGetCTM(context);    if (currentCTM.a == 1.0 && baseImage) {
    //Calculate ideal scale
    CGFloat scaleForWidth = baseImage.size.width/self.bounds.size.width;
    CGFloat scaleForHeight = baseImage.size.height/self.bounds.size.height; 
    CGFloat imageScaleFactor = MAX(scaleForWidth, scaleForHeight);

    CGSize imageSize = CGSizeMake(baseImage.size.width/imageScaleFactor, baseImage.size.height/imageScaleFactor);
    CGRect imageRect = CGRectMake((self.bounds.size.width-imageSize.width)/2, (self.bounds.size.height-imageSize.height)/2, imageSize.width, imageSize.height);
    CGContextDrawImage(context, imageRect, [baseImage CGImage]);} else {
    @synchronized(issue) { 
        CGPDFPageRef pdfPage = CGPDFDocumentGetPage(issue.pdfDoc, pageIndex+1);
        pdfToPageTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFMediaBox, layer.bounds, 0, true);
        CGContextConcatCTM(context, pdfToPageTransform);    
        CGContextDrawPDFPage(context, pdfPage);
    }}

问题的对象是CGPDFDocumentRef..同步访问pdfDoc属性,因为我在接收内存警告时释放它并重新创建它。似乎CGPDFDocumentRef对象执行一些我没有找到的内部缓存。


查看完整回答
反对 回复 2019-06-27
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

iOS 11,您可以使用名为PDFKit用于显示和操作PDF。

导入PDFKit之后,应该初始化PDFView使用本地或远程URL,并将其显示在视图中。

if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") {
    let pdfView = PDFView(frame: view.frame)
    pdfView.document = PDFDocument(url: url)
    view.addSubview(pdfView)}

在Apple Developer文档中阅读更多关于PDFKit的信息。


查看完整回答
反对 回复 2019-06-27
  • 3 回答
  • 0 关注
  • 393 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信