2013-05-07 18 views
2

當生成PDF時,我的應用程序不斷收到內存警告和隨後的崩潰。我被建議先將我的PDF文件寫入文件,但沒有提供擴展。如何在Web視圖中生成PDF時首先將PDF數據寫入文件

這是我第一次使用iOS生成PDF,儘管檢查了蘋果文檔http://developer.apple.com/library/ios/#documentation/2ddrawing/conceptual/drawingprintingios/GeneratingPDF/GeneratingPDF.html並搜索SO,Google,並使用UIGraphicsBeginPDFContextToFile我只是不斷收到警告/沒有生成PDF或異常拋出,因爲我只是猜測這個。我還沒有掌握這個概念。

可能有人提供關於如何我的PDF寫入文件第一

- (void)viewWillAppear:(BOOL)animated 
{ 
LogCmd(); 

[super viewWillAppear:animated]; 
if (self.pdfData != nil && self.viewHasUnloaded == YES) { 
self.viewHasUnloaded = NO; 
[self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil]; 
} 
} 



- (void)viewDidAppear:(BOOL)animated 
{ 

    LogCmd(); 
[super viewDidAppear:animated]; 
if (self.pdfData == nil) { 



// Generate PDF 
[ICUtils showProgressViewWithTitle:@"Generating PDF. This may take a minute..."]; 
[self performSelectorInBackground:@selector(generatePdf) withObject:nil]; 
    } 
} 

- (void)generatePdf 
    { 
    NSMutableArray *pagesArray = [NSMutableArray array]; 

if ([self.certificate.certificateType.title isEqualToString:@"EICR"]) { 
[pagesArray addObject:[[ICPDFEICRPage1 alloc] initWithCertificate:self.certificate]]; 
[pagesArray addObject:[[ICPDFEICRPage2 alloc] initWithCertificate:self.certificate]]; 
[self addObservationsToPagesArray:pagesArray]; 
[self addDistributionBoardsToPagesArray:pagesArray]; 
[pagesArray addObject:[[ICPDFEICRInspection alloc] initWithCertificate:self.certificate]]; 
[pagesArray addObject:[[ICPDFEICRInspectionPage1 alloc] initWithCertificate:self.certificate]]; 
[pagesArray addObject:[[ICPDFEICRInspectionPage2 alloc] initWithCertificate:self.certificate]]; 
[pagesArray addObject:[[ICPDFEICRInspectionPage3 alloc] initWithCertificate:self.certificate]]; 
[pagesArray addObject:[[ICPDFEICRPageFinal alloc] initWithCertificate:self.certificate]]; 
    } 

    // Set page count on all pages 
    int pageNumber = 0; 
    for (ICCertificateComponent *page in pagesArray) { 
    page.pageNumber.text = [NSString stringWithFormat:@"%d", ++pageNumber]; 
    page.pageCount.text = [NSString stringWithFormat:@"%d", pagesArray.count]; 
    } 

    NSData *pdfData = [self createPdfWithPages:pagesArray]; 
    [self performSelectorOnMainThread:@selector(pdfDone:) withObject:pdfData waitUntilDone:YES]; 

    } 
} 
- (void)pdfDone:(NSData *)data 
{ 
self.pdfData = data; 
[self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil]; 
[ICUtils removeProgressView]; 
     } 


- (NSData *)createPdfWithPages:(NSArray *)pages 

    { 
    // Creates a mutable data object for updating with binary data, like a byte array 

NSMutableData *pdfData = [NSMutableData data]; 

ICCertificateComponent *firstPage = [pages objectAtIndex:0]; 

UIGraphicsBeginPDFContextToData(pdfData, firstPage.contentView.bounds, nil); 

for (int i = 0; i < pages.count; i++) { 
    ICCertificateComponent *thisPage = [pages objectAtIndex:i]; 
UIGraphicsBeginPDFPageWithInfo(thisPage.contentView.bounds, nil); 

CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
[thisPage.contentView.layer renderInContext:pdfContext]; 
    } 

UIGraphicsEndPDFContext(); 

return pdfData; 

} 

我已經試過

-(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename 
{ 

NSArray *pages; 
// Creates a mutable data object for updating with binary data, like a byte array 
     NSMutableData *pdfData = [NSMutableData data]; 

    ICCertificateComponent *firstPage = [pages objectAtIndex:0]; 

    UIGraphicsBeginPDFContextToData(pdfData, firstPage.contentView.bounds, nil); 

    for (int i = 0; i < pages.count; i++) { 
     ICCertificateComponent *thisPage = [pages objectAtIndex:i]; 
     UIGraphicsBeginPDFPageWithInfo(thisPage.contentView.bounds, nil); 

     CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
     [thisPage.contentView.layer renderInContext:pdfContext]; 
     } 

    UIGraphicsBeginPDFPage(); 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
animated:NO]; 
[_webView.layer renderInContext:currentContext]; 



    UIGraphicsEndPDFContext(); 

    NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

    NSString* documentDirectory = [documentDirectories objectAtIndex:0]; 
    NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; 

    //return pdfData; 
    [pdfData writeToFile:documentDirectoryFilename atomically:YES]; 
} 

錯誤一些建議:拋出異常 'NSInvalidArgumentException', reason: '-[ICPDFPreviewController createPdfWithPages:]: unrecognized selector sent to instance除其他即時通訊當然

也試過:

- (NSString *)createPdfWithPages:(NSArray *)pages 
{ 

    @autoreleasepool { 



    ICCertificateComponent *firstPage = [pages objectAtIndex:0]; 

    NSString *docDirectory = 
    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *pdfPath = [docDirectory stringByAppendingPathComponent:@"pdfFile.pdf"]; 

    UIGraphicsBeginPDFContextToFile(pdfPath, firstPage.contentView.bounds, nil); 

    for (int i = 0; i < pages.count; i++) { 
     ICCertificateComponent *thisPage = [pages objectAtIndex:i]; 
     UIGraphicsBeginPDFPageWithInfo(thisPage.contentView.bounds, nil); 

     CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
     [thisPage.contentView.layer renderInContext:pdfContext]; 
       } 

    UIGraphicsEndPDFContext(); 

    return pdfPath; 

} 

錯誤:NSInvalidArgumentException', reason: '-[NSPathStore2 bytes]: unrecognized selector sent to instance 0x24aa4580'

回答

1

你試試下面的代碼。

+(void)drawLineFromPoint:(CGPoint)from toPoint:(CGPoint)to 
{ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetLineWidth(context, 2.0); 

    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 

    CGFloat components[] = {0.2, 0.2, 0.2, 0.3}; 

    CGColorRef color = CGColorCreate(colorspace, components); 

    CGContextSetStrokeColorWithColor(context, color); 

    CGContextMoveToPoint(context, from.x, from.y); 
    CGContextAddLineToPoint(context, to.x, to.y); 

    CGContextStrokePath(context); 
    CGColorSpaceRelease(colorspace); 
    CGColorRelease(color); 

} 

+(void)drawText 
{ 

    NSString* textToDraw = @"Hello World"; 
    CFStringRef stringRef = (__bridge CFStringRef)textToDraw; 
    // Prepare the text using a Core Text Framesetter 
    CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, stringRef, NULL); 
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText); 

    CGRect frameRect = CGRectMake(0, 0, 300, 50); 
    CGMutablePathRef framePath = CGPathCreateMutable(); 
    CGPathAddRect(framePath, NULL, frameRect); 

    // Get the frame that will do the rendering. 
    CFRange currentRange = CFRangeMake(0, 0); 
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL); 
    CGPathRelease(framePath); 

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

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

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

    CFRelease(frameRef); 
    CFRelease(stringRef); 
    CFRelease(framesetter); 
} 

+(void)drawPDF:(NSString*)fileName 
{ 

    // Create the PDF context using the default page size of 612 x 792. 
    UIGraphicsBeginPDFContextToFile(fileName, CGRectZero, nil); 
    // Mark the beginning of a new page. 
    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil); 

    CGPoint from = CGPointMake(0, 0); 
    CGPoint to = CGPointMake(200, 300); 
    [PDFRenderer drawLineFromPoint:from toPoint:to]; 

    [self drawText]; 

    // Close the PDF context and write the contents out. 
    UIGraphicsEndPDFContext(); 
} 
相關問題