Вы можете создать контекст Quartz с PDF-файлом в качестве места назначения рендеринга и просто нарисовать его.Например, следующий код создаст файл PDF внутри объекта NSData, который вы затем можете прикрепить к электронному письму или сохранить на диск:
NSMutableData *pdfData = [[NSMutableData alloc] init];
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
const CGRect mediaBox = CGRectMake(0.0f, 0.0f, drawingWidth, drawingHeight);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &mediaBox, NULL);
UIGraphicsPushContext(pdfContext);
CGContextBeginPage(pdfContext, &mediaBox);
// Draw your content here
CGContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
UIGraphicsPopContext();
CGContextRelease(pdfContext);
CGDataConsumerRelease(dataConsumer);
Здесь происходит несколько вещей.Сначала мы создаем экземпляр NSMutableData и устанавливаем его в качестве потребителя данных (место назначения для контекста PDF для записи).Поскольку Core Graphics использует типы Core Foundation, а не классы Какао, CGDataConsumerCreateWithCFData()
требует аргумент CFMutableDataRef.Мы можем просто привести класс NSMutableData, который мы создали как этот тип, потому что NSData является бесплатным мостовым классом.Это означает, что его можно использовать в методах Какао или в функциях Core Foundation без преобразования между типами.
После этого мы устанавливаем размер страницы контекста PDF (в пунктах) и создаем контекст PDF,используя потребителя данных, который мы создали ранее.Затем мы делаем это активным контекстом для рисования, используя UIGraphicsPushContext()
.
. В этом случае мы создаем только одну страницу в PDF-файле, который мы рисуем, поэтому мы начинаем страницу, рисуем, затем заканчиваемстраница.Если вы хотите сделать несколько страниц, вы можете повторить это для каждой страницы.
Обратите внимание, что весь этот рисунок будет выполнен в координатном пространстве Кварца, поэтому, если вы настроили свои процедуры рисования для правильного отображенияв представлении iPhone это будет перевернуто здесь.Чтобы противодействовать этому переключению, вы можете поместить следующее в свой чертежный код (после UIGraphicsPushContext()
):
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);