Merge 2 pdf files in iOS

前端 未结 2 1486
灰色年华
灰色年华 2021-01-13 10:20

I am trying to merge two PDF files in iOS. I am merging page-by-page. It takes a lot of time in case of very big files. Is there any way, we can just merge the two files,

相关标签:
2条回答
  • 2021-01-13 10:42

    Use this method for any number of pdfs this may help u

    + (NSString *)joinPDF:(NSArray *)listOfPath{
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *layOutPath=[NSString stringWithFormat:@"%@/mergepdf/pdf",[paths objectAtIndex:0]];
        if(![[NSFileManager defaultManager] fileExistsAtPath:layOutPath]){
            [[NSFileManager defaultManager] createDirectoryAtPath:layOutPath withIntermediateDirectories:YES attributes:nil error:nil];        
        } 
        // File paths
        NSString *fileName = @"ALL.pdf";
        NSString *pdfPathOutput = [layOutPath stringByAppendingPathComponent:fileName];
        CFURLRef pdfURLOutput = (__bridge CFURLRef)[NSURL fileURLWithPath:pdfPathOutput];
        NSInteger numberOfPages = 0;
        // Create the output context
        CGContextRef writeContext = CGPDFContextCreateWithURL(pdfURLOutput, NULL, NULL);
    
        for (NSString *source in listOfPath) {
    //        CFURLRef pdfURL = (__bridge CFURLRef)[NSURL fileURLWithPath:source];
    
           CFURLRef pdfURL =  CFURLCreateFromFileSystemRepresentation(NULL, [source UTF8String],[source length], NO);
    
            //file ref
            CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithURL(pdfURL);
            numberOfPages = CGPDFDocumentGetNumberOfPages(pdfRef);
    
            // Loop variables
            CGPDFPageRef page;
            CGRect mediaBox;
    
            // Read the first PDF and generate the output pages
            DLog(@"GENERATING PAGES FROM PDF 1 (%@)...", source);
            for (int i=1; i<=numberOfPages; i++) {
                page = CGPDFDocumentGetPage(pdfRef, i);
                mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
                CGContextBeginPage(writeContext, &mediaBox);
                CGContextDrawPDFPage(writeContext, page);
                CGContextEndPage(writeContext);
            }
    
            CGPDFDocumentRelease(pdfRef);
            CFRelease(pdfURL);
        }
      // CFRelease(pdfURLOutput);
    //    
    //    // Finalize the output file
       CGPDFContextClose(writeContext);
        CGContextRelease(writeContext);
    
        return pdfPathOutput;
    }
    
    0 讨论(0)
  • 2021-01-13 10:46

    Try this code..It adds up 1st pdf file then at the of that it,it adds 2nd pdf file to make single pdf.

    NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    
    // File paths
    NSString *pdfPath1 = [[NSBundle mainBundle] pathForResource:@"pdf1" ofType:@"pdf"];
    NSString *pdfPath2 = [cacheDir stringByAppendingPathComponent:@"temp.pdf"];
    NSString *pdfPathOutput = [cacheDir stringByAppendingPathComponent:@"out.pdf"];
    
    // File URLs - bridge casting for ARC
    CFURLRef pdfURL1 = (__bridge_retained CFURLRef)[[NSURL alloc] initFileURLWithPath:(NSString *)pdfPath1];//(CFURLRef) NSURL
    CFURLRef pdfURL2 = (__bridge_retained CFURLRef)[[NSURL alloc] initFileURLWithPath:(NSString *)pdfPath2];//(CFURLRef)
    CFURLRef pdfURLOutput =(__bridge_retained CFURLRef) [[NSURL alloc] initFileURLWithPath:(NSString *)pdfPathOutput];//(CFURLRef)
    
    // File references
    CGPDFDocumentRef pdfRef1 = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL1);
    CGPDFDocumentRef pdfRef2 = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL2);
    
    // Number of pages
    NSInteger numberOfPages1 = CGPDFDocumentGetNumberOfPages(pdfRef1);
    NSInteger numberOfPages2 = CGPDFDocumentGetNumberOfPages(pdfRef2);
    
    // Create the output context
    CGContextRef writeContext = CGPDFContextCreateWithURL(pdfURLOutput, NULL, NULL);
    
    // Loop variables
    CGPDFPageRef page;
    CGRect mediaBox;
    
    // Read the first PDF and generate the output pages
    NSLog(@"GENERATING PAGES FROM PDF 1 (%i)...", numberOfPages1);
    for (int i=1; i<=numberOfPages1; i++) {
        page = CGPDFDocumentGetPage(pdfRef1, i);
        mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
        CGContextBeginPage(writeContext, &mediaBox);
        CGContextDrawPDFPage(writeContext, page);
        CGContextEndPage(writeContext);
    }
    
    // Read the second PDF and generate the output pages
    NSLog(@"GENERATING PAGES FROM PDF 2 (%i)...", numberOfPages2);
    for (int i=1; i<=numberOfPages2; i++) {
        page = CGPDFDocumentGetPage(pdfRef2, i);
        mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
        CGContextBeginPage(writeContext, &mediaBox);
        CGContextDrawPDFPage(writeContext, page);
        CGContextEndPage(writeContext);      
    }
    NSLog(@"DONE!");
    
    // Finalize the output file
    CGPDFContextClose(writeContext);
    
    // Release from memory
    CFRelease(pdfURL1);
    CFRelease(pdfURL2);
    CFRelease(pdfURLOutput);
    CGPDFDocumentRelease(pdfRef1);
    CGPDFDocumentRelease(pdfRef2);
    CGContextRelease(writeContext);
    
    0 讨论(0)
提交回复
热议问题