Вы можете создать контекст Кварц с 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, а не классы Cocoa, 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);
не видели никаких открытий с открытым исходным кодом для этого (тоже не выглядели), но для этого в api яблока есть вся поддержка. попробуйте найти CGPFDocument и вещи такого характера. –