如何使用 NSData 或使用数据字节目标 c 生成 pdf?

Posted

技术标签:

【中文标题】如何使用 NSData 或使用数据字节目标 c 生成 pdf?【英文标题】:How to generate pdf using NSData or using data bytes objective c? 【发布时间】:2013-05-29 06:14:58 【问题描述】:

您好,我想使用NSData 或使用 web 服务提供的数据字节来编写 pdf?

    -(NSData *)saveData:(NSData*)fileData fileName:(NSString *)fileName fileType:(NSString *)fileType

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    NSString *filePath = [NSString stringWithFormat:@"%@/%@.%@",documentsDir,fileName,fileType];

    NSData* downloadData = [NSData dataWithData:fileData];

    [fileManager createFileAtPath:filePath contents:downloadData attributes:nil];



我正在使用它,但它不工作它给我错误“它可能已损坏或使用预览无法识别的文件格式。”打开由上述代码创建的pdf。

【问题讨论】:

只使用NSDatawriteToFile:atomically: 比通过NSFileManager 好得多。 数据是否已经是 PDF 格式,或者您是否正在寻找将其他数据转换为 PDF 的方法?您可以尝试使用十六进制编辑器检查您的文件吗(Hex Fiend 很棒)。您很可能会弄清楚数据的格式。 你也可以使用file命令行工具来判断某个文件的真实类型。 @RaphaelSchweikert - 是的,它是 pdf 格式.. 你知道怎么...?它是否在预览之外的任何其他 PDF 查看器中打开? 【参考方案1】:

您可以使用以下代码将NSData 转换为PDF...我从This link 获得以下代码

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

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

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

-(IBAction)saveasPDF:(id)sender
     NSString *string=[NSString stringWithFormat:@"%@.pdf",[yourArray 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];


总结: 从pdf文件路径获取NSData

NSData *pdfData = [NSData dataWithContentsOfFile:pathToFile1];
NSLog(@"pdfData= %d", pdfData != nil);

将 NSData 写入 pdf 文件

[pdfData writeToFile:pathToFile2 atomically:YES];

【讨论】:

@ParasJoshi,我尝试使用“writeToFile:”保存文件,但它没有在 Preview.app 中打开文件。任何帮助如何将上述 CGPDFDocumentRef 对象保存到 pdf 文件 有人有这个 Swift 2 吗?【参考方案2】:

@ChallengerGuy(如果您仍在为 CGPDFDocument 寻找 Swift 2 方法)

//to convert data of type NSData 

    guard let cfData = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(data.bytes), data.length) else  return nil

    let cgDataProvider =  CGDataProviderCreateWithCFData(cfData)

    guard let cgPDFDocument  =  CGPDFDocumentCreateWithProvider(cgDataProvider) else  return nil 

希望以上对你有帮助

【讨论】:

以上是关于如何使用 NSData 或使用数据字节目标 c 生成 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中正确地将 -Hex- NSData 形式的 4 个字节读入其正确的数据类型(float 或 int)

linux网络测试命令

SWIFT:将字节从 NSData 粘贴到 Struct?

Xcode(Cocoa)如何将字节写入 NSData

如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

来自 CMSampleBufferRef 的 NSData 或字节