Лучший способ рассчитать количество страниц при создании PDF в Quartz? - PullRequest
2 голосов
/ 23 сентября 2011

Мое приложение создает страницу PDF из данных приложения, используя Quartz и UIGraphics.По сути, я определяю CGRect docRect для размещения на этой странице, затем увеличиваю NSInteger yOffset каждый раз, когда что-то рисую.Если yOffset становится больше, чем docRect.size.height, я делаю UIGraphicsBeginPDFPage().Это отлично работает, НО:

Я хотел бы нарисовать счетчик страниц внизу, как " Страница X из Y ".

X очевидно, легко сказать, но в момент, когда я создаю новую страницу, я не знаю, насколько большим может быть Y .

Я вижу 2 возможных решения для этого:

  1. После прорисовки всех страниц повторите все страницы и добавьте счетчик.Проблема: Насколько я могу судить, после вызова UIGraphicsBeginPDFPage() невозможно вернуться на предыдущие страницы.Кто-нибудь может это подтвердить?

  2. Рассчитать все приращения yOffset заранее, чтобы получить общее количество страниц.Возможно, но ИМХО не совсем элегантное решение.

Кто-нибудь советует по этой проблеме?

Заранее спасибо, м

Ответы [ 3 ]

4 голосов
/ 07 мая 2012

Если вы не хотите предварительно рассчитывать размеры всего, чтобы заранее определить, сколько страниц у вас будет, один из вариантов - это рендеринг в два прохода, очень похожий на тот, который вы упомянули в своем вопросе.Визуализируйте первый проход в temp.pdf и оставьте место для счетчика номера страницы.

Если работа с исходным контентом является нагрузкой на память или производительность, второй проход может перейти к final.pdf , используя temp.pdf в качестве входных данных.Просмотрите все страницы temp.pdf , используя CGPDFDocumentGetNumberOfPages для подсчета количества страниц.Нарисуйте каждую страницу из temp.pdf через CGContextDrawPDFPage, а затем начертите счетчик страниц.

По завершении удалите temp.pdf в качестве очистки,и все готово.

Обновление : что-то похожее на этот непроверенный код, обобщенный из предыдущей работы:

...
CGPDFDocumentRef tempDocRef = CGPDFDocumentCreateWithURL((CFURLRef)tempPdfUrl);
size_t pageCount = CGPDFDocumentGetNumberOfPages(docRef);
CGContextRef finalPdfContext = CGPDFContextCreateWithURL((CFURLRef)finalPdfUrl, &defaultPageRect, nil);

for (int pageNum = 1; pageNum <= pageCount; pageNum++) {
  CGPDFPageRef tempPageRef = CGPDFDocumentGetPage(tempDocRef, pageNum+1);
  CGPDFContextBeginPage(finalPdfContext, nil);
  CGContextDrawPDFPage(finalPdfContext, tempPageRef);

  // do your page number rendering here, using pageNum and pageCount
  ...

  CGPDFContextEndPage(finalPdfContext);
  CGPDFPageRelease(tempPageRef);
}

CGPDFDocumentRelease(tempDocRef);
CGContextRelease(finalPdfContext);
...
0 голосов
/ 04 мая 2012

Syncfusion Essential PDF предоставляет решение этой проблемы. Это обеспечивает решение проблемы в двух ситуациях

  1. При создании документа PDF.
  2. После создания документа PDF

Вы можете попробовать онлайн-образец по ссылке http://mvc.syncfusion.com/sfreportingmvcsamplebrowser/MVC/10.1.0.44/Pdf_MVC/Samples/4.0/Settings/HeadersFooters

-Suresh

0 голосов
/ 19 апреля 2012

Лучше поздно, чем никогда - Если вы все еще ищете ответ, думаю, вам может быть интересно проверить эту ссылку - http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GeneratingPDF/GeneratingPDF.html#//apple_ref/doc/uid/TP40010156-CH10-SW1 - Apple предоставляет (void) drawPageNumber: (NSInteger) pageNum для выполнения этой задачи.

...