如果您不想预先计算的一切大小要事先确定您将拥有多少页面,一种选择是以两遍进行渲染,就像您在问题中提到的一样。将第一阶段渲染到temp.pdf并为页码计数器留出空间。
如果通过源工作内容是存储器或性能负担,第二遍可以去final.pdf,使用temp.pdf作为输入。循环浏览temp.pdf的所有页面,使用CGPDFDocumentGetNumberOfPages
获取您的页面数量。从临时绘制每页。pdf via 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);
...
我目前面临着类似的问题。如果你找到了解决办法,或任何有任何建议的人,请发帖! – Chris