2012-09-23 79 views
7

我想在我的iOS 6應用程序中生成一個漂亮的PDF。如何在iOS上使用「真實」文本內容生成PDF?

我已經試過:

  • UIView的渲染方面
  • 使用CoreText
  • 使用的NSString drawInRect
  • 使用的UILabel的drawRect

下面是一個代碼示例:

-(CGContextRef) createPDFContext:(CGRect)inMediaBox path:(NSString *) path 
{ 
    CGContextRef myOutContext = NULL; 
    NSURL * url; 

    url = [NSURL fileURLWithPath:path]; 
    if (url != NULL) { 
     myOutContext = CGPDFContextCreateWithURL ((__bridge CFURLRef) url, 
                &inMediaBox, 
                NULL); 
    } 


    return myOutContext; 
} 

-(void)savePdf:(NSString *)outputPath 
{ 
    if (!pageViews.count) 
     return; 

    UIView * first = [pageViews objectAtIndex:0]; 

    CGContextRef pdfContext = [self createPDFContext:CGRectMake(0, 0, first.frame.size.width, first.frame.size.height) path:outputPath]; 

    for(UIView * v in pageViews) 
    { 
     CGContextBeginPage (pdfContext,nil); 
     CGAffineTransform transform = CGAffineTransformIdentity; 
     transform = CGAffineTransformMakeTranslation(0, (int)(v.frame.size.height)); 
     transform = CGAffineTransformScale(transform, 1, -1); 
     CGContextConcatCTM(pdfContext, transform); 

     CGContextSetFillColorWithColor(pdfContext, [UIColor whiteColor].CGColor); 
     CGContextFillRect(pdfContext, v.frame); 

     [v.layer renderInContext:pdfContext]; 

     CGContextEndPage (pdfContext); 
    } 

    CGContextRelease (pdfContext); 
} 

那些只呈現該UIViews包含一個UIImageView +一堆UILabels的(部分帶和一些無國界)。

我也試過計算器上發現了一個建議:繼承的UILabel和這樣做:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { 
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds()); 
    if (!layer.shouldRasterize && isPDF) 
     [self drawRect:self.bounds]; // draw unrasterized 
    else 
     [super drawLayer:layer inContext:ctx]; 
} 

但是,這並不會改變任何事情。

不管我做什麼,在預覽打開PDF時,文本部分是可選的模塊,但不是每個字符的字符,和縮放的PDF顯示它實際上是一個位圖圖像。

有什麼建議嗎?

+0

你可以發佈一個示例代碼片段和輸出PDF文件,所以我可以看看嗎? – iPDFdev

+0

你有沒有想過這個?體驗「塊選擇」問題。 – JeremyDay

+0

似乎並沒有與現在的情況發生: 'UIGraphicsBeginPDFContextToFile(outputPath,view.bounds,無); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [view.layer renderInContext:pdfContext]; UIGraphicsEndPDFContext();' – JeremyDay

回答

2
+1

我做了類似的事情,pdf看起來不錯,但文本不是真實的文本,而是渲染的圖像。我想生成一個可選文本的PDF –

+0

但我使用了相同的教程,它的工作在Zooming中也非常完美。 –

+0

他意味着可以選擇 - 像在Mac上的光標(複製,粘貼等) –

1

去年我這樣做的經驗是,蘋果公司沒有提供任何圖書館去做。我最終導入了一個開源C庫(libHaru)。然後我在視圖層次結構中的每個類中添加了一個輸出到它的函數。任何具有子視圖的視圖都會在其子視圖上調用渲染。我的UILabels,UITextFields,UIImageViews,UISwitches等將輸出他們的內容作爲文字或圖形相應我也呈現一些意見的背景顏色。

這是不是很嚇人,但libHaru給了我一些問題的字體,所以IIRC我最後只使用默認的字體和字體大小。

+0

我會看看。謝謝 –