相关疑难解决方法(0)

适用于iPhone/iPad/iOs的快速精益PDF阅读器 - 提示和提示?

最近有很多关于绘制PDF的问题.

是的,你可以很容易地使用a来渲染PDF,UIWebView但这不能提供你期望从一个好的PDF查看器中获得的性能和功能.

您可以将PDF页面绘制到CALayerUIImage.Apple甚至有示例代码来展示如何在Zoomable UIScrollview中绘制大型PDF

但同样的问题不断出现.

UIImage方法:

  1. PDF UIImage不是光学尺度,也不是图层方法.
  2. 打生成的CPU和内存UIImagesPDFcontext 限制/防止使用它来创建一个实时渲染的新的缩放的水平.

CATiledLayer方法:

  1. 有一个重要的开销(时间)将完整的PDF页面绘制成CALayer:可以看到单个图块渲染(即使使用tileSize调整)
  2. CALayers 不能提前准备(在屏幕外呈现).

一般来说,PDF查看器的内存也很重要.甚至监视苹果可缩放PDF示例的内存使用情况.

在我目前的项目中,我正在开发一个PDF查看器,并UIImage在一个单独的线程中呈现一个页面(这里也是问题!)并在比例为x1时呈现它.CATiledLayer一旦比例> 1,渲染就会开始.iBooks采用了类似的双重拍摄方法,就好像你滚动页面一样,你可以看到页面的低分辨率版本只有不到一秒钟,然后出现一个清晰的版本.

我在页面的每一侧渲染2页焦点,以便PDF图像准备好在它开始绘制之前掩盖图层.当页面离焦点页面+2页时,它们会被再次销毁.

有没有人有任何见解,无论多么小或明显改善Drawing PDF的性能/内存处理?或者这里讨论的任何其他问题?

编辑:一些提示(信用 - 卢克麦克尼斯,VdesmedT,马特加拉格尔,约翰):

  • 尽可能将所有媒体保存到磁盘.

  • 如果在TiledLayers上渲染,请使用更大的tileSizes

  • init经常使用带占位符对象的数组,另外另一种设计方法就是这个

  • 请注意,图像渲染速度比a快 CGPDFPageRef

  • 使用NSOperations或GCD和提前准备页面.

  • CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);之前调用CGContextDrawPDFPage以减少绘制时的内存使用量

  • 使用docRef初始化你NSOperations是个坏主意(内存),将docRef包装成单例.

  • 取消不必要NSOperations当你可以,特别是如果他们将使用记忆,但要小心打开上下文!

  • 回收页面对象并销毁未使用的视图

  • 一旦您不需要它们,请立即关闭所有打开的上下文

  • 接收内存警告释放并重新加载DocRef和任何页面缓存

其他PDF功能:

pdf calayer ios

367
推荐指数
3
解决办法
10万
查看次数

使用Quartz在iOS上获取PDF超链接

我花了一整天时间尝试从我的iPad应用程序中获取PDF中的超链接元数据.CGPDF*API是一个真正的噩梦,我在网上发现的关于这一切的唯一信息是我必须寻找一个"Annots"字典,但我在我的PDF中找不到它.

我甚至使用旧的Voyeur Xcode样本来检查我的测试PDF文件,但没有这个"Annots"字典的痕迹......

要知道,这是一个功能,我在每一个PDF阅读器看-这个同样的问题已经 时间在这里没有真正的实际的答案.我通常不会直接询问示例代码,但显然这次我真的需要它...任何人都有这个工作,可能有示例代码?

更新:我刚刚意识到已经完成我的测试PDF的人刚刚插入了一个URL作为文本,而不是一个真正的注释.他尝试使用注释,我的代码现在正常工作......但这不是我需要的,所以我似乎必须分析文本并搜索URL.但那是另一个故事......

更新2:所以我终于提出了一些有效的代码.我在这里张贴它,所以希望它能帮助别人.它假定PDF文档实际上包含注释.

for(int i=0; i<pageCount; i++) {
    CGPDFPageRef page = CGPDFDocumentGetPage(doc, i+1);

    CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page);

    CGPDFArrayRef outputArray;
    if(!CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) {
        return;
    }

    int arrayCount = CGPDFArrayGetCount( outputArray );
    if(!arrayCount) {
        continue;
    }

    for( int j = 0; j < arrayCount; ++j ) {
        CGPDFObjectRef aDictObj;
        if(!CGPDFArrayGetObject(outputArray, j, &aDictObj)) {
            return;
        }

        CGPDFDictionaryRef annotDict;
        if(!CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) {
            return;
        }

        CGPDFDictionaryRef aDict;
        if(!CGPDFDictionaryGetDictionary(annotDict, "A", &aDict)) { …
Run Code Online (Sandbox Code Playgroud)

pdf iphone quartz-graphics ipad

55
推荐指数
2
解决办法
2万
查看次数

标签 统计

pdf ×2

calayer ×1

ios ×1

ipad ×1

iphone ×1

quartz-graphics ×1