Я унаследовал некоторый код iOS, который открывает исходный PDF и создает CGContextRef
, к которому мы рисуем одну страницу из исходного документа. Проблема в том, что есть определенные страницы с одним документом, к сожалению, наш справочный документ, который вызывает сбой этого кода.
Конечная цель - кэшировать 8 страниц за раз, чтобы улучшить взаимодействие с пользователем.
CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0);
CGDataConsumerRef contextConsumer = CGDataConsumerCreateWithCFData(consumerData);
CGPDFPageRef page = CGPDFDocumentGetPage(sourceDocument, pageNumber);
const CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
CGContextRef pdfOutContext = CGPDFContextCreate(contextConsumer, &mediaBox, NULL);
CGContextDrawPDFPage(pdfOutContext, page); //If I comment out this line, no exception occurs
CGPDFPageRelease(page);
CGPDFContextEndPage(pdfOutContext);
CGPDFContextClose(pdfOutContext); //EXC_BAD_ACCESS
CGContextRelease(pdfOutContext);
(Это упрощенная версия кода, оригинал открывает исходный документ и страницу, проверяет нулевое значение в page
и ctx
, а затем записывает ctx
в новый документ.)
Нет проблем, если вместо рисования в контексте PDF я рисую в контексте UIGraphics, созданном таким образом:
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
Также нет проблем, когда я рисую другие вещи в контексте PDF.
Кроме того, это работает для 99% документов и для 75% страниц в нарушающем документе. Оскорбительный документ корректно отображается в нескольких программах просмотра PDF.
Так что я не думаю, что у меня проблема с памятью. Я вполне уверен, что в коде CGPDF есть что-то с ошибками (и я говорю это только после того, как потратил неделю, пытаясь решить эту проблему).
У меня вопрос, есть ли другой способ, которым я должен / мог бы делать это?