2011-09-23 68 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