【问题标题】:Create PDF on the fly from NSMutableData从 NSMutableData 动态创建 PDF
【发布时间】:2012-01-15 00:39:42
【问题描述】:

我有一个包含 PDF 文件的 NSMutableData 对象。我知道如何打开存储在系统上的 PDF,我可以这样做:

CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)pathToPDF, NULL, NULL);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);

但现在我不想将文件存储在系统上,而是动态创建 PDF 对象(因为 PDF 作为加密 PDF 存储在系统上,我不想保存解密后的出于安全原因的文件。)

因此,我不想从文件中加载 CGPDFDocumentRef pdf,而是直接从 NSMutableData 对象中加载它。

我该怎么做?

提前致谢!

【问题讨论】:

    标签: iphone ios xcode ipad xcode4


    【解决方案1】:

    使用CGDataProvider 从任意来源获取字节:

    NSData *encrypted = [NSData dataWithContentsOfFile: ...];
    if (encrypted) {
        NSData *decrypted = MyDecrypt(encrypted);
        if (decrypted) {
            CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)decrypted);
            if (dataProvider) {
                CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(dataProvider);
                CGDataProviderRelease(dataProvider);
            }
        }
    }
    

    您还可以创建一个CGDataProvider 的实例,该实例使用回调在运行中解密,如果这更适合您的流程。有关详细信息,请参阅文档。

    【讨论】:

    • 当我使用 CGPDFDocumentCreateWithProvider 创建 CGPDFDocumentRef 时,它立即开始提供回调,并要求从 pdf 中获取几乎所有字节,这需要更多时间来完成“CGPDFDocumentRef pdf = CGPDFDocumentCreateWithProvider(dataProvider);”。你会建议为什么会发生这种情况,只有当我们从 pdf 中获取任何页面时它才应该给出回调对吗?
    • 这应该是一个单独的问题,而不是评论。我对CG的实现细节一无所知。
    猜你喜欢
    • 2014-09-29
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多