3

特定のレイアウトでpdfを作成しました。問題は、テキスト ビューのコンテンツが非常に長い場合、PDF は新しいページを自動的に生成せず、実行時に作成されるページ数を事前に定義できないことです。誰でも私を助けてもらえますか?

4

3 に答える 3

2

このコードを使用して試すことができます。これは、Interface Builderでテキストビューとボタンを保持し、ボタンアクションメソッドを使用してPDFを生成し、これらのフレームワークをインポートするのに役立ちます。

#import <QuartzCore/QuartzCore.h>
#import <CoreText/CoreText.h>



    -(NSString*)getPDFFileName
    {
        NSString* fileName = @"sample.PDF";
        NSArray *arrayPaths =
        NSSearchPathForDirectoriesInDomains(
                                            NSDocumentDirectory,
                                            NSUserDomainMask,
                                            YES);
        NSString *path = [arrayPaths objectAtIndex:0];
        NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];
        return pdfFileName;

    }
    -(IBAction)PdfGeneration:(id)sender{
        // Prepare the text using a Core Text Framesetter.
        CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (__bridge CFStringRef)txtObj.text, NULL);
        if (currentText) {
                CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
                if (framesetter) {

                NSString *pdfFileName = [self getPDFFileName];

                // Create the PDF context using the default page size of 612 x 792.

                UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);
                CFRange currentRange = CFRangeMake(0, 0);
                NSInteger currentPage = 0;
                BOOL done = NO;
                do {

                    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);
                    currentPage++;
                    [self drawPageNumber:currentPage];
                    currentRange = [self renderPage:currentPage withTextRange:currentRange andFramesetter:framesetter];
                    if (currentRange.location == CFAttributedStringGetLength((CFAttributedStringRef)currentText))

                        done = YES;

                } while (!done);
                UIGraphicsEndPDFContext();
               CFRelease(framesetter);
            } else {

                NSLog(@"Could not create the framesetter needed to lay out the atrributed string.");

            }

            // Release the attributed string.

            CFRelease(currentText);

        } else {

            NSLog(@"Could not create the attributed string for the framesetter");

        }
    }
    // Use Core Text to draw the text in a frame on the page.

    - (CFRange)renderPage:(NSInteger)pageNum withTextRange:(CFRange)currentRange

           andFramesetter:(CTFramesetterRef)framesetter

    {

        // Get the graphics context.

        CGContextRef    currentContext = UIGraphicsGetCurrentContext();
        CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
        CGRect    frameRect = CGRectMake(72, 72, 468, 648);
        CGMutablePathRef framePath = CGPathCreateMutable();
        CGPathAddRect(framePath, NULL, frameRect);
        CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
        CGPathRelease(framePath);
        CGContextTranslateCTM(currentContext, 0, 792);
        CGContextScaleCTM(currentContext, 1.0, -1.0);
        CTFrameDraw(frameRef, currentContext);
        currentRange = CTFrameGetVisibleStringRange(frameRef);
        currentRange.location += currentRange.length;
        currentRange.length = 0;
        CFRelease(frameRef);
        return currentRange;

    }
    - (void)drawPageNumber:(NSInteger)pageNum

    {

        NSString *pageString = [NSString stringWithFormat:@"Page %d", pageNum];
        UIFont *theFont = [UIFont systemFontOfSize:12];
        CGSize maxSize = CGSizeMake(612, 72);
        CGSize pageStringSize = [pageString sizeWithFont:theFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeClip];
        CGRect stringRect = CGRectMake(((612.0 - pageStringSize.width) / 2.0),720.0 + ((72.0 - pageStringSize.height) / 2.0),pageStringSize.width,pageStringSize.height);
           [pageString drawInRect:stringRect withFont:theFont];

    }
于 2013-02-25T13:34:43.310 に答える
0
//StartNewPage
                UIGraphicsBeginPDFPageWithInfo(pageFrame, nil);

ページフレーム設定を超えている場合は、入力されたテキストビューでテキストの高さを見つけます。このメソッドを呼び出します PageFrame は、pdfの新しいページフレームです

于 2013-02-25T11:50:54.110 に答える