2

PDF ドキュメントの 2 ページ以上に長いテキスト文字列を描画するための推奨される方法は何ですか?

1 ページには長すぎるテキスト文字列を描画すると、テキストはドキュメントの最後で切り取られます。私の最初のアイデアは、現在のページに描画できる文字列の量を計算し、文字列を (1) 現在のページに描画できる部分と (2) 切り取られた部分の 2 つの部分文字列に分割することでした。次のステップは、文字列全体が描画されるまでこのプロセスを繰り返すことです。

現在のページに描画できる文字列の量をどのように計算するかという問題が残ります。私は何かを見落としていますか、それともエラーが発生しやすいかなり面倒なプロセスですか?

4

3 に答える 3

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;
        }
    }
}
于 2012-09-19T05:43:25.640 に答える
2

UIMarkupTextPrintFormatter を介して iOS 印刷サブシステムを使用して PDF の生成を試みることができます。ここでテクニックを説明します:

iOS で XML/HTML テンプレートから PDF ファイルを生成する方法はありますか

私は何が起こるかを見ようとはしませんでした。ページネーションですが、理論的には正しいことを行います。

于 2012-09-17T22:05:23.880 に答える
2

PDFに描画されたテキストの実際の高さを計算しようとしましたが、「実際の」行の高さを実際に取得できないため、非常に面倒です。CoreGraphics をあきらめて、@TomSwift テクニックを使用してすべてを描画しました。CoreGraphics よりもさらに簡単に、フォント、テキストの色などを CSS スタイルで設定できます。

于 2012-09-18T20:03:52.817 に答える