2011-09-23 69 views
2

我的应用程序使用Quartz和UIGraphics从应用程序数据创建一个pdf页面。 基本上我定义了一个CGRect docRect以适合该页面,然后每次绘制东西时就增加一个NSInteger yOffset。 如果yOffset变得大于docRect.size.height我做UIGraphicsBeginPDFPage()。 这工作得很好,但:在Quartz中创建PDF时计算页数的最佳方法?

我想画一个页数在底部,如“页面Y的Y”。

X显然是容易分辨,但是当我创建一个新网页的那一刻,我不知道该怎么大Ÿ可能。

我看到这2个可能的解决方案:

  1. 绘制的所有页面后,重申在所有页面并添加计数器。 问题:据我所知,调用UIGraphicsBeginPDFPage()后无法返回到前一页。有人能够否认这一点吗?

  2. 提前计算所有yOffset增量以获得总页数。 可能的,但恕我直言,不是一个真正的优雅的解决方案。

有没有人有关于这个问题的建议?

在此先感谢,男

+0

我目前面临着类似的问题。如果你找到了解决办法,或任何有任何建议的人,请发帖! – Chris

回答

4

如果您不想预先计算的一切大小要事先确定您将拥有多少页面,一种选择是以两遍进行渲染,就像您在问题中提到的一样。将第一阶段渲染到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); 
... 
+0

我理解这是应该如何理论,但除非我错过了一些东西,没有CoreGraphics API来打开现有的PDF文件。只有UIGraphicsBeginPDFContextToData和UIGraphicsBeginPDFContextToFile方法。为了做一个2-pass方法,我们需要一些UIGraphicsOpenPDFContextFromFile方法或类似的东西。 – Chris

+0

我更新了我的帖子以包含一些代码,该代码展示了如何使用CoreGraphics提供的超过UIKit的PDF。 – MattP