Создание PDF с использованием новых материалов для печати в iOS 4.2 - PullRequest
9 голосов
/ 05 декабря 2010

Исторически мое приложение генерировало подтверждения в виде простого 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?Любая помощь высоко ценится.

Ответы [ 3 ]

4 голосов
/ 28 апреля 2012

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

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

4 голосов
/ 08 декабря 2010

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

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

1 голос
/ 15 ноября 2011

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

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

Установите соответствующие свойства рендерера paperRect и printableRect.

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

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

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

...