无法在iOS上创build超过400页的PDF文档

我正在使用下面的伪代码来生成一个PDF文档:

CGContextRef context = CGPDFContextCreateWithURL(url, &rect, NULL); for (int i = 1; i <= N; i++) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; CGContextBeginPage(context, &mediaBox); // drawing code CGContextEndPage(context); [pool release]; } CGContextRelease(context); 

它适用于小文档( N < 100页),但是如果文档大于400页(它在崩溃之前收到两条内存警告),它会使用太多的内存和崩溃。我已经确定没有泄漏仪器。 你有什么build议在iOS上创build大型的PDF文件? 非常感谢。

编辑:PDF创build是在后台线程完成。

既然你是通过CGPDFContextCreateWithURL创build一个单一的文件, CGPDFContextCreateWithURL整个事情必须保存在内存中,并附加到,通常的东西(虽然我不能肯定地说与iOS和CGPDFContextCreateWithURL )需要一个完整的前后副本的文档被保留。 即使没有前后问题,也不需要泄漏造成问题。

如果您不想捕获一堆现有的UIKit绘制的东西 – 而且在您的示例中,您似乎没有 – 使用操作系统的打印方法,而是提供内置支持打印到PDFUIGraphicsBeginPDFContextToFile将页面添加到磁盘,因为它们被添加,所以整个事情不必一次在内存中。 你应该能够以这种方式生成一个巨大的PDF。

可能不是你想听到的答案,而是从另一个angular度来看待它。

您能否将其视为设备的限制?…首先检查PDF中的页数,如果太大,请给用户一个警告。 因此,优雅地处理它。

你可以扩大这个….

您可以在iDevice上构build小型PDF,如果PDF太大,则在下一次iDevice具有networking连接时将其构build到服务器端。

如果你分配的内存太多,你的应用程序将崩溃。 为什么生成一个非常大的PDF是一个目标? 你究竟在做什么?

如何使用内存映射文件来支持您的CG数据使用者? 那么它不一定要一次装入RAM。

我在这里创build了一个例子: https : //gist.github.com/3748250

像这样使用它:

 NSURL * url = [ NSURL fileURLWithPath:@"pdf.pdf"] ; MemoryMappedDataConsumer * consumer = [ [ MemoryMappedDataConsumer alloc ] initWithURL:url ] ; CGDataConsumerRef cgDataConsumer = [ consumer CGDataConsumer ] ; CGContextRef c = CGPDFContextCreate( cgDataConsumer, NULL, NULL ) ; CGDataConsumerRelease( cgDataConsumer ) ; // write your PDF to context `c` CGPDFContextClose( c ) ; CGContextRelease( c ) ; return 0;