0

xcode 4.6 を使用して iPad アプリから PDF レポートを作成しようとしています。シミュレーターで実行すると、有効な pdf ファイルが作成されていることがわかります。これは、それを掘り出してプレビューできるためです。コメントアウトされたコードはこれを行います。問題は、iPad でアクセスできる場所に書き込めないことです。

代わりに UIGraphicsBeginPDFContextToData を使用して、代わりに画像を PhotoAlbum に書き出そうとしました。ここでの問題は、NSMutableData を画像に変換すると nil が返されることです。

これがコードです。あなたが私に与えることができるどんな助けにも感謝します.

- (IBAction)makePDF:(UIButton *)sender
{
    CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (CFStringRef)self.labelCopyright.text, NULL);

    if (currentText)
    {
        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
        if (framesetter)
        {
//            NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, //NSUserDomainMask, YES) objectAtIndex:0];
//            NSString *pdfPath = [rootPath stringByAppendingPathComponent:@"Nick.pdf"];
//            NSLog(@"pdf is at %@",pdfPath);
//            UIGraphicsBeginPDFContextToFile(pdfPath, CGRectZero, nil);
            NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100000];
            UIGraphicsBeginPDFContextToData(data, 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();
            UIImage* image = [UIImage imageWithData:data];
            assert(image);
            UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
            CFRelease(framesetter);
        }
        else NSLog(@"Could not create the framesetter needed to lay out the atrributed string.");
        CFRelease(currentText);
    }
    else NSLog(@"Could not create the attributed string for the framesetter");
}

- (CFRange)renderPage:(NSInteger)pageNum withTextRange:(CFRange)currentRange andFramesetter:(CTFramesetterRef)framesetter
{
    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;
}
4

2 に答える 2

0

PDFをNSMutableDataオブジェクトに書き込む代わりに、を使用してファイルに書き込みますUIGraphicsBeginPDFContextToFile

最初の引数はファイルパスです。最適な場所はDocumentsディレクトリです。アプリからファイルを取り出すには、さまざまな方法があります。

  1. iTunesファイル共有
  2. Eメール
  3. iCloud
  4. サードパーティのサーバー(Dropbox、Box、Googleドライブなど)に送信する
  5. を使用して別のiOSアプリで開きUIDocumentInteractionControllerます。
于 2013-02-17T05:42:08.303 に答える
0

可変データをドキュメントディレクトリに保存します

[data writeToFile:filePath atomically:YES]

次に例を示します。

+(void) saveData: (NSData*) data ToFileName: (NSString*) filename {

    // Retrieves the document directories from the iOS device
    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString* documentDirectory = [documentDirectories objectAtIndex:0];
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent: filename];

    // instructs the mutable data object to write its context to a file on disk
    [data writeToFile:documentDirectoryFilename atomically:YES];
    //NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}

生成されたPDFをデバイスに表示する場合、UIWebViewオブジェクトはからのPDFファイルのロードをサポートしますNSData。次に例を示します。

[self.webView loadData:pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];

NSDataメールにオブジェクトを添付することも可能です。次に例を示します。

//Check if we can send e-mails
if ([MFMailComposeViewController canSendMail]) {

    //Create the Email view controller
    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = self;

    //Set the subject and body
    [controller setSubject:@"Email Subject"];
    [controller setMessageBody:@"Email body" isHTML:NO];

    //Set the email address
    [controller setToRecipients:@"test@test.com"];

    //Add the current PDF as an attachment
    NSString *fileName = @"file.pdf";

    [controller addAttachmentData:self.retrievedPDF mimeType:@"application/pdf" fileName:fileName];

    // show the email controller modally
    [self.navigationController presentModalViewController: controller animated: YES];

}
于 2013-02-17T05:48:06.263 に答える