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