2011-09-22 37 views
3

我試圖創建一個從UIView PDF文件可能包含圖像,標籤等 我已經檢查了參考(GeneratingPDF),我也意識到了renderInContext:方法的創建PDF,它可以是用於將UIView的內容繪製到PDF上下文中。的iOS:從UIView的

我用renderInContext:創建PDF。然而,圖像和文字失去了忠誠度。即圖像不能單獨選擇&在結果PDF中不能選擇/複製文本等。它與從UIView的快照創建的PDF一樣好/壞。

我的問題是,我必須繪製文本&圖像分別以達到我想要的(使用CGContextShowTextAtPoint & CGContextDrawImage)?

如果是,那麼我該如何去掃描UIView的文字&圖片?假設我從&以外收到UIView,但不知道其內容。

回答

1

您確實必須使用CGContextShowTextAtPoint之類的函數將文本/圖像分別繪製到CGContextRef(請看CGPDFContextCreateWithURL)。雖然理論上你可以掃描你的UIView圖像/標籤,但如果你只是從頭開始繪製佈局,那會更好。你必須有一些方法來知道UIView中應該包含哪些元素。雖然代碼會有很大的不同,但邏輯上你應該像使用編程方式繪製UIView而不是從nib中加載它一樣。

如果你真的想你的掃描UIView的,你可以做這樣的事情:

for(UIView *subview in parentView.subviews) { 
if([subview isKindOfClass:[UIImageView class]]) { 
    ... 
} else if([subview isKindOfClass:[UITextView class]]) { 
    ... 
} else if([subview isKindOfClass:[UILabel class]]) { 
    ... 
} 
} 
+0

感謝邁克爾!那麼,你確定在這種情況下不能使用'renderInContext:'嗎?我正在考慮「UIView」有多彩的背景或其他東西,這很難畫出來。 – Akshay

+0

是的,我確定。實際上,我在不久之前經歷了這個問題,並且我的邏輯開始完全在你的位置(renderInContext :),然後我嘗試搜索一些代碼以將UIView繪製到PDF中,最後真正做到這一點的唯一方法是使用CGContext方法並從頭開始繪製CGContextRef中的所有內容。 –

+0

再次感謝邁克爾!那麼,如果UIView具有漸變背景,您如何繪製?另外,我的實際使用案例是從'UIWebView'創建一個PDF,用於顯示一個文件(比如ppt或doc),爲此我發現文本和圖像不是子視圖(沒有UILabels或UITextViews)。你也試過這個嗎?對不起,最初沒有指定。 – Akshay

2

我有運氣適量的只是走我的視圖層次,並呼籲-drawRect:我自己。有一個位的設置,你已經在不知不覺中成爲前做的,像翻譯CTM和清除文本矩陣,但是當你這樣做的每個視圖,你可以這樣做:

UIGraphicsPushContext(ctx); 
[self drawRect:self.frame]; 
UIGraphicsPopContext(); 

的PDF它生成的是基於矢量的 - 不只是一個平面位圖,因此它可以很好地縮放,並且您可以在查看器/瀏覽器中選擇文本。這隻適用於簡單的香草定製繪圖和非常簡單的東西,如UILabels。我懷疑它可以處理更復雜的UIKit對象(我在考慮表視圖和滾動視圖)。此外,你需要額外的工作UIImageViews(我猜設置的CGImageRef圖層的內容屬性),如果你有其他基於層的屬性和轉換 - 甚至更多的工作。

希望蘋果公司給我們一個比保持並行繪圖代碼更好的解決方案!

+0

此UIView類別運作良好 - 我相信它使用您的策略:https://github.com/mruegenberg/uiview-hierarchical-drawing。有一點需要記住的是,如果您使用CALayers,則需要添加代碼以明確寫入上下文。看到這個答案:http://stackoverflow.com/questions/13783971/maintain-vector-graphics-when-rendering-calayer-into-pdf-output – jeffmax

0

嘗試,

{ 
    //read the pdf file 

    CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),  CFSTR("iPhoneAppProgrammingGuide.pdf"), NULL, NULL); 
     PDFfile = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 
     CFRelease(pdfURL) 

    CGPDFPageRef page = CGPDFDocumentGetPage(PDFfile,currentpage); 

    context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 
    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); 
    CGContextFillRect(context,self.bounds); 
    CGContextTranslateCTM(context, -1.0, [self bounds].size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFArtBox, [self bounds], 0, true)); 
    CGContextDrawPDFPage(context, page);  
    CGContextRestoreGState(context); 
    //CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox), 
               CGContextGetClipBoundingBox(context)); 

     // CGContextConcatCTM(context, transform); 
     UIGraphicsBeginImageContext(CGSizeMake(self.bounds.size.width, self.bounds.size.height)); 


}