iOS:在PDF文档中的多个页面上绘制文本

时间:2012-08-28 07:04:01

标签: ios pdf drawing

在pdf文档的两个或多个页面上绘制长字符串的推荐方法是什么?

当您为单个页面绘制的文本字符串太长时,文本将在文档末尾剪切。我最初的想法是计算可以在当前页面上绘制多少字符串,然后将字符串拆分为两个子字符串:(1)可以在当前页面上绘制的部分和(2)剪切的部分。下一步是重复此过程,直到绘制完整个字符串。

问题仍然是如何计算当前页面上可以绘制多少字符串。我是否忽略了某些事情,或者这是一个相当繁琐的过程,容易出错?

3 个答案:

答案 0 :(得分:3)

很久以前我做了这个功能它可能会帮助你,传递间距和字体,它将返回有限宽度和所需大小的分裂字符串。

- (NSMutableArray *)getSplittedString:(NSString *)largeStr:(UIFont *)font:(NSInteger)horizontalSpace:(float)width {
    NSArray *strWords = [largeStr componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    //finding space width

    NSInteger currIndex = 0;
    NSString *tmpStr = @"";
    NSString *compareStr = @"";
    NSInteger currWidth;

    NSMutableArray *strArray = [[NSMutableArray alloc] init];
    NSMutableArray *strFrames = [[NSMutableArray alloc] init];

    while(TRUE) {
        while(TRUE) {
            compareStr = tmpStr;
            compareStr = [compareStr stringByAppendingString:[strWords objectAtIndex:currIndex]];
            currWidth = [compareStr sizeWithFont:font].width;
            if(currWidth < width) {
                currIndex = currIndex + 1;
                if(currIndex == [strWords count]) {
                    [strArray addObject:compareStr];
                    [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:compareStr :width :font :horizontalSpace]]];
                    break;
                }
                tmpStr = [NSString stringWithFormat:@"%@ ",compareStr];

            } else if (currWidth == width) {
                [strArray addObject:compareStr];
                [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:compareStr :width :font :horizontalSpace]]];
                tmpStr = @"";
                if(currIndex == [strWords count]) {
                    break;
                }
            } else {
                if([compareStr rangeOfString:@" "].location == NSNotFound) {
                    while(TRUE) {
                        NSInteger loc = [self findAdjustedLocation:compareStr :width :font];
                        if(loc == 0) {
                            tmpStr = [compareStr substringFromIndex:loc];
                            if(currIndex == [strWords count]) {
                                [strArray addObject:tmpStr];
                                [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:tmpStr :width :font :horizontalSpace]]];
                                break;
                            }
                            tmpStr = [NSString stringWithFormat:@"%@ ",tmpStr];
                            break;
                        } else {
                            tmpStr = [compareStr substringWithRange:NSMakeRange(0, loc)];
                            [strArray addObject:tmpStr];
                            [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:tmpStr :width :font :horizontalSpace]]];
                            tmpStr = [NSString stringWithFormat:@"%@ ",[compareStr substringFromIndex:loc]];
                            compareStr = tmpStr;
                            if ([tmpStr sizeWithFont:font].width < width) {
                                [strArray addObject:tmpStr];
                                [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:tmpStr :width :font :horizontalSpace]]];
                                currIndex = currIndex + 1;
                                break;
                            }
                        }
                    }
                } else {
                    [strArray addObject:tmpStr];
                    [strFrames addObject:[NSValue valueWithCGRect:[self findCenterAdjustedLocation:tmpStr :width :font :horizontalSpace]]];
                    tmpStr = @"";
                }
                break;
            }
        }
        if(currIndex == [strWords count]) {
            return [[NSMutableArray alloc] initWithObjects:strArray, strFrames, nil];
            break;
        }
    }
}

答案 1 :(得分:2)

您可以尝试通过UIMarkupTextPrintFormatter使用iOS打印子系统生成PDF。我在这里解释一下这个技术:

Is there any way to generate PDF file from a XML/HTML template in iOs

我还没有试过看看会发生什么。分页,但理论上它会做正确的事。

答案 2 :(得分:2)

我试图计算一旦绘制到PDF上的文本的实际高度,但它真的很烦人,因为你无法真正获得“真正的”行高。我最终放弃了CoreGraphics并使用@TomSwift技术绘制了所有东西。比CoreGraphics更容易,您可以使用CSS样式设置字体,文本颜色......