2010-07-12 5 views
2

Кто-нибудь знает о проекте создания PDF с открытым исходным кодом для iPhone для создания документов из шаблона (с использованием Quartz)? Или есть какие-либо функции, которые люди написали для выравнивания и т. Д.? Я видел libHaru, но я понимаю, что ему не хватает некоторых важных функций.Библиотека или функции для создания iPhone iPhone

Благодаря

+0

не видели никаких открытий с открытым исходным кодом для этого (тоже не выглядели), но для этого в api яблока есть вся поддержка. попробуйте найти CGPFDocument и вещи такого характера. –

ответ

1

Вы можете создать контекст Кварц с 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); 
+0

Спасибо за код. Я также надеялся найти обертки более высокого уровня для некоторых функций. – RaelG

+0

@ Rael - Они немного улучшили некоторые из общих функций создания PDF в версии 3.2+ с UIGraphicsBeginPDFContextToData() и т. П., Но похоже, что вы хотите, чтобы что-то абстрагировалось от фактического набора и компоновки страницы, а не для создания сам PDF. –

+0

Да, это то, что я имел в виду, если я не был ясен. – RaelG

0

Там 2 способы создания PDF-в iPhone SDK. Первый из них использует Core Graphics методы:

  1. CGContextRef CGPDFContextCreateWithURL (CFURLRef URL, Const CGRect * MediaBox, CFDictionaryRef auxiliaryInfo)
  2. недействительным CGContextBeginPage (CGContextRef с, Const CGRect * MediaBox)
  3. недействительным CGContextEndPage (CGContextRef c) Второй способ - использовать методы UIKit для создания контекста PDF. Вы можете найти его here.

Существует хорошее руководство по созданию программного обеспечения с программным обеспечением iPhone SDK, и вы можете найти его here.

Смежные вопросы