Как преобразовать NSData в PDF в iPhone sdk?

#iphone #objective-c #ios #pdf #nsdata

#iPhone #objective-c #iOS #PDF #nsdata

Вопрос:

Конвертирую веб-страницу в PDF-файл. Я сделал следующее,

 NSString *string=[NSString stringWithFormat:@"%@.pdf",[chapersArray objectAtIndex:pageIndex]];
[controller1 addAttachmentData:pdfData mimeType:@"application/pdf" fileName:string];
[self presentModalViewController:controller1 animated:YES];
[controller1 release];
  

Теперь, как я могу преобразовать свои NSData в pdf и сохранить в памяти моего приложения? Пожалуйста, помогите мне с примерами кодов или предложений. Спасибо всем.

Комментарии:

1. Откуда берутся pdfData?

2. Извини, друг, я тебя запутал. Я хочу преобразовать NSData в PDF и сохранить в памяти моего приложения.

3. Что, черт возьми, означает «хранить в памяти моего приложения»? Объект NSData уже находится в памяти. Кроме того, «конвертировать в PDF» ничего не значит без объяснения того, из какого формата вы конвертируете.

Ответ №1:

Я предполагаю, что у вас есть свой PDF-файл в каталоге documents здесь. Вы можете изменить его там, где он есть на самом деле. Попробуйте это —

 //to convert pdf to NSData
NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"test.pdf"]; 
NSData *myData = [NSData dataWithContentsOfFile:pdfPath]; 
  

По сути, с помощью CGPDFDocumentCreateWithProvider вы можете конвертировать NSData в pdf,

 //to convert NSData to pdf
NSData *data               = //some nsdata
CFDataRef myPDFData        = (CFDataRef)data;
CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData);
CGPDFDocumentRef pdf       = CGPDFDocumentCreateWithProvider(provider);
  

Не забудьте CFRelease удалить все неиспользуемые данные после завершения.

Комментарии:

1. Извини, друг, я тебя запутал. Я хочу преобразовать NSData в PDF и сохранить в памяти моего приложения.

2. @Srikar Appal Здравствуйте, как сохранить этот PDF в файл.

3. @EaswaramoorthyKanagaraj это должно сработать [myFile writeToFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], @"yourfilename.pdf"] atomically:YES];

4. @SrikarAppal Что здесь myFile, это myData в первом фрагменте кода? Или что-то еще во втором фрагменте? Пожалуйста, любезно разъясните это, а также метод, о котором вы говорите.

5. @SrikarAppal, я попытался сохранить файл с помощью «writeToFile:», но он не открывает файл. Любая помощь, как сохранить вышеупомянутый объект CGPDFDocumentRef в файл pdf

Ответ №2:

Я получил это простым способом следующим образом,

 -(IBAction)saveasPDF:(id)sender{
     NSString *string=[NSString stringWithFormat:@"%@.pdf",[chapersArray objectAtIndex:pageIndex]];
     [controller1 addAttachmentData:pdfData mimeType:@"application/pdf" fileName:string];
     [self presentModalViewController:controller1 animated:YES];
     [pdfData writeToFile:[self getDBPathPDf:string] atomically:YES];
        }

-(NSString *) getDBPathPDf:(NSString *)PdfName {
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
   NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:PdfName];
}
  

Ответ №3:

Вы можете попробовать использовать это решение:

- (void)saveDataToPDF:(NSData *)pdfDocumentData
{
 //Создать ссылку на документ pdf
 CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)pdfDocumentData);
 CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);

 //Создать контекст pdf
 CGPDFPageRef страница = CGPDFDocumentGetPage(документ, 1); // Страницы нумеруются, начиная с 1
 CGRect pageRect = CGPDFPageGetBoxRect(страница, kCGPDFMediaBox);
 CFMutableDataRef mutableData = CFDataCreateMutable(NULL, 0);

 // NSLog(@"w:%2.2f , h:%2.2f ",pageRect.size.width, pageRect.size.height);
 CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(изменяемые данные);
 CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, amp;pageRect, NULL);


 если (CGPDFDocumentGetNumberOfPages(document)> 0)
 {
 // Нарисуйте страницу в новом контексте
 //page = CGPDFDocumentGetPage(document, 1); // Страницы нумеруются, начиная с 1

 CGPDFContextBeginPage(pdfContext, NULL);
 CGContextDrawPDFPage(pdfContext, страница);
 CGPDFContextEndPage(pdfContext);
 }
 ещё
 {
 NSLog (@"Не удалось создать документ");
 }

 CGContextRelease(pdfContext); // Выпуск перед записью данных на диск.

 // Запись на диск
 [(__bridge NSData *) Изменяемые данные writeToFile:@"/Users/David/Desktop /test.pdf" атомарно: ДА];

 // Очистка
 CGDataProviderRelease(dataProvider); //Освободить поставщика данных
 CGDataConsumerRelease(dataConsumer);
 CGPDFDocumentRelease (документ);
 CFRelease (изменяемые данные);
}