将文本从uitextview绘制为pdf

时间:2012-01-20 11:28:38

标签: objective-c ios ipad pdf uitextview

我有4个可编辑的uitextviews,用户可以设置其字体颜色等。现在我想绘制这些textview的pdf,但使用[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]方法会导致其质量下降,所以我无法使用此方法,而是迭代子视图并以pdf格式绘制文本。现在我的问题是,对于某些文本视图,文本在pdf中正确打印,但对于其他文本视图,文本不是在正确的位置绘制的。这是我从textview中绘制pdf的代码。          NSArray * arrayOfsubviews = [self.view subviews];

for (int i=0; i<[arrayOfsubviews count]; i++) {

    if ([[arrayOfsubviews objectAtIndex:i]isKindOfClass:[UITextView class]]) {

        UITextView *texts=[arrayOfsubviews objectAtIndex:i];


        CTFontRef ctFont = CTFontCreateWithName((__bridge CFStringRef)texts.font.fontName, texts.font.pointSize,NULL);
        CGColorRef color = texts.textColor.CGColor;

        NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                        (__bridge id)ctFont, (id)kCTFontAttributeName,
                                        color, (id)kCTForegroundColorAttributeName,nil];


        NSAttributedString *stringToDraw = [[NSAttributedString alloc] initWithString:texts.text
                                                                           attributes:attributesDict];
        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) stringToDraw);



        CGRect rect=CGRectMake(texts.frame.origin.x,916-texts.frame.origin.y-texts.frame.size.height, texts.frame.size.width, texts.frame.size.height);


        CGMutablePathRef pathRef = CGPathCreateMutable();
        CGPathAddRect(pathRef, NULL,rect);
        CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0),pathRef, NULL);


        CGContextRef context = UIGraphicsGetCurrentContext();


        CGContextSaveGState(context);

        CGContextTranslateCTM(context, 0,916); 
        CGContextScaleCTM(context, 1.0, -1.0);


        CTFrameDraw(frameRef, context);


        CGContextRestoreGState(context);
        CGPathRelease(pathRef);


    }
   }
UIGraphicsEndPDFContext();

3 个答案:

答案 0 :(得分:4)

我用它来绘制我的文字,效果相当好......也许它可以指出你正确的方向。

#define kBorderInset 20.0
#define kMarginInset 10.0

- (void) drawText{
CGContextRef    currentContext = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(currentContext, 0.0, 0.0, 0.0, 1.0);

NSString *textToDraw = @"Your Text Here";
UIFont *font = [UIFont systemFontOfSize:14.0];

CGSize stringSize = [textToDraw sizeWithFont:font
                           constrainedToSize:CGSizeMake(pageSize.width - 2*kBorderInset-2*kMarginInset, pageSize.height - 2*kBorderInset - 2*kMarginInset) 
                               lineBreakMode:UILineBreakModeWordWrap];

CGRect renderingRect = CGRectMake(kBorderInset + kMarginInset, kBorderInset + kMarginInset + 350.0, pageSize.width - 2*kBorderInset - 2*kMarginInset, stringSize.height);

[textToDraw drawInRect:renderingRect 
              withFont:font
         lineBreakMode:UILineBreakModeWordWrap
             alignment:UITextAlignmentLeft];
}

答案 1 :(得分:1)

您想使用drawInContext:而不是renderInContext:。 renderInContext将栅格化文本,drawInContext将其编码为可编辑,与分辨率无关的文本。

答案 2 :(得分:0)

由于框架的原因,一些质量或模糊视图的缺失。用于在屏幕中定位帧的值是CGFloat,因此你可以在点(0.5,5.7)中有一个帧,显然这没有任何意义,point.x必须是0或1.十进制值混淆操作系统,因此建议确保帧始终没有十进制数值。

您可以在此处获取更多信息:http://www.cobiinteractive.com/blog/2011/06/objective-c-blurry-uiview/或此处:http://www.markj.net/iphone-uiview-blurred-blurry-view/