如何从NSData源编写PDF文件

时间:2011-09-29 20:54:58

标签: ios pdf nsdata cgpath

我有一个从CGPathRef返回NSData的方法,如此...

+ (NSData *) createPDFDataWithCGPath: (CGPathRef) path mediaBox: (CGRect) mediaBox
{
  CFMutableDataRef data = NULL;
  if (path) {
    CFAllocatorRef allocator = NULL;
    data = CFDataCreateMutable(allocator, 0);
    CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(data);
    CGContextRef context = CGPDFContextCreate(consumer, &mediaBox, NULL);
    CFTypeRef keys[1] = { kCGPDFContextMediaBox };
    CFTypeRef values[1] = { CFDataCreate(allocator, (const UInt8 *)&mediaBox, sizeof(CGRect)) };
    CFDictionaryRef pageInfo = CFDictionaryCreate(allocator, keys, values, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

    CGPDFContextBeginPage(context, pageInfo);
    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -mediaBox.size.height);
    CGContextAddPath(context, path);
    CGContextSetRGBFillColor(context, 0, 0, 0, 1);
    CGContextFillPath(context);
    CGPDFContextEndPage(context);

    CFRelease(pageInfo);
    CFRelease(values[0]);
    CGPDFContextClose(context);
    CGContextRelease(context);
    CGDataConsumerRelease(consumer);
  }
  return (NSData *)data;
}

当我尝试使用它并从数据中写入PDF文件时,我得到的文件大小正确,但路径没有被绘制到PDF中......基本上它是一个空文档。

仅仅编写文件就足够了......

[maskData writeToFile: DOCUMENTS_PATH_WITH_STRING(@"maskData.pdf") atomically: YES];

或者他们更喜欢跳起来把它写成PDF?

2 个答案:

答案 0 :(得分:0)

你是对的。 如果NSData对象中有数据,则可以将其写入磁盘。但是你应该添加正确的扩展名(在你的情况下是.pdf)。 它适用于所有事物(视频,图片等......)

答案 1 :(得分:0)

这有点像红鲱鱼。路径正在绘制,但没有笔画或填充。上面我的问题中的代码是合理的,并按预期工作。