iOS - 从多个文件生成pdf

时间:2012-06-12 16:39:36

标签: ios xcode pdf

我正在尝试将一些文本文件转换为pdf。现在,世界上最简单的事情就是简单地将文件中的所有文本组合成一个字符串,然后使用iOS文档here将其呈现为单个pdf。麻烦的是,这些都是大文本文件;它们一起可以超过90页。因此,我需要添加一些超链接,以便我可以在顶部创建目录,用户可以快速移动到每个文本文件的开头,而不必滚动60页以到达他们想去的地方。

问题是,如果我将txt文件合并为一个字符串,我无法知道每个文件在分页时何时结束,因此我想在最终发布之前将这些文件分别添加到pdf中。问题是,最多只有最后一个txt文件会显示渲染,很可能是因为它覆盖了以前的文件。以下是我的代码,任何想法?

- (void)savePDFFile:(NSString *)file_Name
{

//   NSArray *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
 NSString *homeDir = NSHomeDirectory();
 NSString *saveDirectory = [NSString stringWithFormat: @"%@/%@", homeDir, @"Documents/"]; 


 NSArray *fileAr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:saveDirectory error:nil];
//    NSString *text = @"";
//    NSMutableArray *textArray = [[NSMutableArray alloc] init];
 NSInteger currentPage = 0;
NSString *completeString = @"";
for (NSString *string in fileAr) {
    if([string hasSuffix:@"txt"]){
        NSString *file = [NSString stringWithFormat: @"%@/%@", saveDirectory, string];
        NSString *text =[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];
        completeString = [NSString stringWithFormat:@"%@%@", completeString, text];
    }
}
 for (NSString *string in fileAr) {
    if([string hasSuffix:@"txt"]){
        NSString *file = [NSString stringWithFormat: @"%@/%@", saveDirectory, string];
        NSString *text =[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];

// Prepare the text using a Core Text Framesetter
 CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (CFStringRef)text, NULL);
 if (currentText) {

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)currentText);
//        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
    if (framesetter) {

        NSString* pdfFileName = file_Name;

        // Create the PDF context using the default page size of 612 x 792.
        UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);


        CFRange currentRange = CFRangeMake(0, 0);
        BOOL done = NO;

        do {
            // Mark the beginning of a new page.
            UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);

            // Draw a page number at the bottom of each page
            currentPage++;
            [self drawPageNumber:currentPage];

            // Render the current page and update the current range to
            // point to the beginning of the next page.
            currentRange = [self renderPage:currentPage withTextRange:currentRange andFramesetter:framesetter];
            // If we're at the end of the text, exit the loop.
            if (currentRange.location == CFAttributedStringGetLength((CFAttributedStringRef)currentText))
                done = YES;

        } while (!done);


        // Release the framewetter.
        CFRelease(framesetter);
                CFRelease(currentText);
    }
}   
        // Close the PDF context and write the contents out.
        UIGraphicsEndPDFContext();


    } else {
        NSLog(@"Could not create the framesetter needed to lay out the atrributed string.");
    }
    // Release the attributed string.

} 
}


// 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();

// Put the text matrix into a known state. This ensures
// that no old scaling factors are left in place.
CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);

// Create a path object to enclose the text. Use 72 point
// margins all around the text.
CGRect    frameRect = CGRectMake(72, 72, 468, 648);
CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);

// Get the frame that will do the rendering.
// The currentRange variable specifies only the starting point. The framesetter
// lays out as much text as will fit into the frame.
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);

// Core Text draws from the bottom-left corner up, so flip
// the current transform prior to drawing.
CGContextTranslateCTM(currentContext, 0, 792);
CGContextScaleCTM(currentContext, 1.0, -1.0);

// Draw the frame.
CTFrameDraw(frameRef, currentContext);

// Update the current range based on what was drawn.
currentRange = CTFrameGetVisibleStringRange(frameRef);
currentRange.location += currentRange.length;
currentRange.length = 0;
CFRelease(frameRef);

return currentRange;
}

1 个答案:

答案 0 :(得分:0)

我取得了进展并遇到了另一个问题,所以我又问了一个问题here

最后,通过我自己的测试和一些帮助,我解决了这个问题。