Создание PDF-файла с использованием новых возможностей печати в iOS 4.2

Исторически сложилось так, что мое приложение генерировало подтверждения в виде простого HTML и передало этот HTML в обычный MFMailComposeViewController для отправки клиенту по электронной почте. Я хотел попробовать использовать новые классы печати в iOS 4.2, чтобы вместо этого преобразовать HTML в PDF и отправить его в виде вложения.

Я пробовал следующее:

NSString *html = /* generate my HTML here */
NSMutableData *pdfData = [NSMutableData data];
UIMarkupTextPrintFormatter *fmt = [[UIMarkupTextPrintFormatter alloc] 
                                   initWithMarkupText:html];

// Render the html into a PDF
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );

for (NSInteger i=0; i < [fmt pageCount]; i++)
{
    UIGraphicsBeginPDFPage();
    CGRect bounds = UIGraphicsGetPDFContextBounds();
    [fmt drawInRect:bounds forPageAtIndex:i];
}

UIGraphicsEndPDFContext();

Проблема в том, что [fmt pageCount] всегда возвращает ноль, поэтому фактическое содержимое страницы никогда не отображается в PDF NSData.

Кому-нибудь удалось использовать UIMarkupTextPrintFormatter вне фактического задания на печать для преобразования HTML в PDF? Любая помощь высоко ценится.


person glenc    schedule 04.12.2010    source источник


Ответы (3)


Кажется, что средства форматирования печати (включая UIMarkupTextPrintFormatter) на самом деле не визуализируются/отрисовываются до тех пор, пока непосредственно перед печатью, как только система берет на себя управление и запускает задание на печать. (В документах Apple говорится, что drawRect: вызывается непосредственно перед печатью, чтобы предоставить содержимое для задания на печать.)

Кто-нибудь, пожалуйста, докажите, что я ошибаюсь, потому что мне нужно сделать в основном то же самое :)

person Jack Lawrence    schedule 08.12.2010
comment
Эхххх.... какой облом. Похоже, вы не можете слишком легко захватить форматировщики печати, чтобы делать что-то в памяти. - person glenc; 08.12.2010
comment
Похоже, радар в Apple в порядке :) - person Tom Irving; 08.12.2010
comment
Согласованный. Вы уже представили радар? Если да, то какой номер радара? Я тоже подам. - person Jack Lawrence; 12.12.2010
comment
На самом деле я не представил радар ... не делал этого раньше и был завален другими вещами - person glenc; 19.12.2010
comment
Я отправил запрос в службу технической поддержки Apple Developer (DTS) несколько дней назад, и парень перезвонил мне и сказал, что да, это невозможно, и велел мне отправить запрос на функцию. Мой номер ошибки 8793893. - person Jack Lawrence; 21.12.2010
comment
Привет, Джек. Просто интересно, случалось ли что-нибудь с ошибкой радара? Надеюсь, что, возможно, мы увидим некоторую радость на фронте HTML-to-PDF для iOS 5. - person glenc; 30.08.2011
comment
Привет, glenc, отчет об ошибке был закрыт как дубликат. Я свяжусь с яблоком и посмотрю, что случилось. - person Jack Lawrence; 08.09.2011
comment
Привет, mamcx, я проверил свой отчет об ошибке, и статус по-прежнему указан как открытый Apple, поэтому я предполагаю, что нет. Взгляните на документ 4.3 -> 5.0 API diff на сайте developer.apple.com, если вы хотите быть уверенным. - person Jack Lawrence; 12.12.2011

Я делаю это в одном из своих приложений. Смотрите мой ответ на аналогичный вопрос здесь:

Есть ли способ сгенерировать файл PDF из шаблона XML/HTML в iOs

person TomSwift    schedule 28.04.2012

Я сделал открытие: это возможно, если вы хотите или вам разрешено использовать частный API. (например, в корпоративном приложении.)

Метод: создайте средство форматирования как обычно; установите его в UIPrintPageRenderer.

Правильно задайте частные свойства модуля визуализации paperRect и printableRect.

numberOfPages теперь работает!

Настройте cgcontext в формате pdf, как обычно, и нарисуйте страницу с помощью метода drawPageAtIndex:inRect: рендерера. Святая корова, это сработало.

Обязательный протест: да, я знаю, что Apple не хочет, чтобы вы отправляли приложения, которые вызывают (например) [ppr setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"];, и отказывались от них.

person rgeorge    schedule 15.11.2011
comment
Спасибо за информацию - интересно узнать, как Apple это делает, надеюсь, они когда-нибудь опубликуют это в будущем выпуске ... - person glenc; 16.11.2011