很久以前,我在一个完全不同的平台上生成 PDF 文件并遇到了此类问题。解决方案是一次生成一页(在打开下一页进行成像之前关闭每一页(而不是文档))。这对我的多页文档产生了巨大的影响。查看您的代码,这与您在这里面临的问题相同。实际上,你还有一个额外的问题,那就是你首先以图形方式在内存中构建所有页面数据,然后在内存中构建所有 pdf 页面,并且它崩溃了。请阅读下文,了解如何解决该问题的详细信息。
Reading here http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/GeneratingPDF/GeneratingPDF.html
看来您想要的顺序是:
// start pdf document using default page size (CGRectZero)
UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);
// then loop through your content drawing it one page at a time.
for ( page p in pages ) // or whatever you are cycling over for page content
{
UIGraphicsBeginPDFPage(); // or UIGraphicsBeginPDFPageWithInfo
// do your drawing to the page here by drawing to the current graphics context.
// if you are setting up transforms and such
}
// close out the last page and the document both
UIGraphicsEndPDFContext();
因此,这应该做的是将内存中渲染的数据量保持为一次一页(加上文档全局数据的一些开销)。
好的。我查看了你的代码,如果我理解正确的话,你最终会在内存中得到至少 2 个渲染页面的副本。
关键是——一次只画一页。你没有展示出所有的东西ICPDFEICRPage1
等等,但它们似乎是将页面内容渲染到某种 UIView 的对象?这意味着它们拥有整个视图的像素数据(即副本 1)。因此,在渲染任何 pdf 页面之前,您将一次性绘制的每个页面都使用内存。然后打开 PDF 页面上下文,将其呈现给NSMutableData
(这是数据的第二个副本)。
另一个问题是:为什么要渲染到某种内存构造(视图),而不是在打印该页面时仅渲染到每个页面的 pdf 页面图形上下文上?我是guessing这是因为您有一个 UIView 层次结构,其中包含 xib 文件中定义的字段和所有内容,这样您就不必手动进行所有布局和字符串绘制等操作。正确的?
如果是这样,那么要做的就是让您的页面数组成为一个数组,该数组是某种列表,其中包含以下内容:ICPDFEICR...
您想要的对象按照您想要的顺序排列,而不是实际分配的对象本身。也许为每种可能的页面类型、观察结果、分发板等定义一个枚举。那么您的页面数组只是一个整数数组(这些枚举按照您想要在文档中显示的顺序排列)。
然后只为当前页面分配实际对象,将其映像到该页面,然后在执行下一个页面之前释放它。
另外,我假设(希望!)您正在使用 ARC,因为否则这段代码中会有很多内存泄漏(!!!)。
希望这足以让您走上正确的轨道。哦,使用文件技术,您需要给它一个文件路径,然后将该路径作为 file:// url 传递给 webview 来显示。
现在我想起来了,为什么你要使用 UIWebView 来显示 PDF?看着那(这缩放 PDF 查看器 http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html示例的替代方案不会尝试将整个 PDF 文档加载到内存中来显示它。