How to send a PDF file using UIActivityViewController

前端 未结 8 968
野趣味
野趣味 2020-12-13 13:57

I\'m trying to send a PDF using a UIActivityViewController. So far everything works fine using a fairly basic approach but the one issue I have is that when I s

8条回答
  •  囚心锁ツ
    2020-12-13 14:52

    May be try this..

        #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
    
        // Validate PDF using NSData
        - (BOOL)isValidePDF:(NSData *)pdfData {
            BOOL isPDF = false;
            if (pdfData.length >= 1024 ) {
    
                int startMetaCount = 4, endMetaCount = 5;
                // check pdf data is the NSData with embedded %PDF & %%EOF
                NSData *startPDFData = [NSData dataWithBytes:"%PDF" length:startMetaCount];
                NSData *endPDFData = [NSData dataWithBytes:"%%EOF" length:endMetaCount];
                // startPDFData, endPDFData data are the NSData with embedded in pdfData
                NSRange startRange = [pdfData rangeOfData:startPDFData options:0 range:NSMakeRange(0, 1024)];
                NSRange endRange = [pdfData rangeOfData:endPDFData options:0 range:NSMakeRange(0, pdfData.length)];
    
                if (startRange.location != NSNotFound && startRange.length == startMetaCount && endRange.location != NSNotFound && endRange.length == endMetaCount ) {
                    // This assumes the checkstartPDFData doesn't have a specific range in file pdf data
                    isPDF = true;
    
                } else  {
                    isPDF = false;
                }
            }
            return isPDF;
        }
    
        // Download PDF file in asynchronous way and validate pdf file formate.
        - (void)downloadPDFfile:(NSString *) fileName withFileURL:(NSString *) url {
            NSString *filePath = @"";
             dispatch_async(dispatch_get_main_queue(), ^ {
                NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
                filePath = [documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"/Attachments/%@",[self generateName:fileName withFiletype:@"pdf"]]];
                NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
                [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                    if (error) {
                            NSLog(@"Download Error:%@",error.description);
                    } else if (data && error == nil) {
                        bool checkPdfFormat = [self isValidePDF:data];
                        if (checkPdfFormat) {
                            //saving is done on main thread
                            dispatch_async(dispatch_get_main_queue(), ^{
                                [data writeToFile:filePath atomically:YES];
                                NSURL *url = [NSURL fileURLWithPath:filePath];
                                [self triggerShare:fileName withFilepath:filePath];
                            });
                        }
                    }
                }];
            });
        }
    
        // Trigger default share and print functionality using UIActivityViewController
        -(void) triggerShare:(NSString*)fileName withFilepath:(NSString*)filePath {
                * Set this available field on the activity controller */
                NSMutableArray *items = [NSMutableArray array];
    
                if (filePath) {
                    [items addObject:[NSURL fileURLWithPath:filePath]];
                }
    
                UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
                [activityViewController setValue:fileName forKey:@"subject"]; // Set the mail subject.
    
    
                if (IS_IPAD) {
                    activityViewController.modalPresentationStyle = UIModalPresentationPopover;
                    UIPopoverPresentationController *popPC = activityViewController.popoverPresentationController;
                    popPC.sourceView = self.view;
                    CGRect sourceRext = CGRectZero;
                    sourceRext.origin = CGPointMake(self.view.frame.size.width-30, 0 ); // I have share button in navigation bar. ;)
                    popPC.sourceRect = sourceRext;
                    popPC.permittedArrowDirections = UIPopoverArrowDirectionUp;
                }
    
    
                [activityViewController setCompletionWithItemsHandler:
                 ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {
                 }];
                [self presentViewController:activityViewController animated:YES completion:nil];
        }
    
        -(NSString*) generateName:(NSString*)title withFiletype:(NSString*)type {
    
            NSString *subject = [title stringByReplacingOccurrencesOfString:@" " withString:@"_"];
            subject = [NSString stringWithFormat:@"%@.%@",subject,type];
            return subject;
        }
    

提交回复
热议问题