将 UIImage/CGImage 渲染到 CGPDFContext 会导致...空白!
我正在尝试将图像对象中的图像渲染到 Core Graphics PDF 上下文中——恰好在 iPhone 上,但这个问题肯定同样适用于桌面 Quartz。此 UIImage 是一个简单的白底彩色图像,分辨率约为 600x800。如果我(比如说)将其转换为 PNG 文件,该文件看起来与预期完全一致——所以数据没问题。
以下是我生成 PDF 的方法:
NSMutableData * outputData = [[NSMutableData alloc] init];
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)outputData);
CFMutableDictionaryRef attrDictionary = NULL;
attrDictionary = CFDictionaryCreateMutable(NULL, 0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attrDictionary, kCGPDFContextTitle, @"My Awesome Document");
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, NULL, attrDictionary);
CFRelease(dataConsumer);
CFRelease(attrDictionary);
CGImageRef pageImage = [myUIImage CGImage];
CGPDFContextBeginPage(pdfContext, NULL);
CGContextDrawImage(pdfContext, CGRectMake(0, 0, [myUIImage size].width, [myUIImage size].height), pageImage);
CGPDFContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
CGContextRelease(pdfContext);
生成的 PDF(最终出现在 outputData
中)看起来像是一个有效的 PDF 文件(可以正确打开,文档标题存在于元数据中),但它包含以下内容:正好一页空白。
我做错了什么?
谢谢。
更新:哈!这是我的错。我用于生成 PNG 文件的测试代码通过不同的路径来获取数据。 PDF 路径确实收到了一个空图像。
I'm trying to take an image that I have in a image object and render into a Core Graphics PDF context-- happens to be on an iPhone but this question surely applies equally to desktop Quartz. This UIImage is a simple color-on-white image at about 600x800 resolution. If I (say) turn it into a PNG file, that file looks exactly as expected-- so the data is OK.
Here's what I'm doing to generate the PDF:
NSMutableData * outputData = [[NSMutableData alloc] init];
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)outputData);
CFMutableDictionaryRef attrDictionary = NULL;
attrDictionary = CFDictionaryCreateMutable(NULL, 0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attrDictionary, kCGPDFContextTitle, @"My Awesome Document");
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, NULL, attrDictionary);
CFRelease(dataConsumer);
CFRelease(attrDictionary);
CGImageRef pageImage = [myUIImage CGImage];
CGPDFContextBeginPage(pdfContext, NULL);
CGContextDrawImage(pdfContext, CGRectMake(0, 0, [myUIImage size].width, [myUIImage size].height), pageImage);
CGPDFContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
CGContextRelease(pdfContext);
The resulting PDF, which ends up in outputData
, seems like a valid PDF file (opens correctly, document title is present in metadata), but it consists of precisely one blank page.
What am I doing wrong?
Thanks.
UPDATE: Ha! This was my fault. My test code for just generating the PNG file went through a different path to get the data. The PDF path indeed was receiving an empty image.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我测试了你的代码,它似乎可以工作。
您确定您的 UIImage 在将其绘制到上下文中时是有效的而不是 nil 吗?
我的测试方法从主包加载 .png 并将最终的 pdf 写入应用程序文档文件夹中的文件:
I tested your code and it seems to work.
Are you sure your UIImage is valid and not nil when drawing it into the context?
My test method loads a .png from the main bundle and writes the final pdf to a file in the applications document folder:
这个问题似乎已经在 iphone dev sdk 论坛上得到解决:
PDF 创建教程
所有功劳to danielb21:这里是他们的 CreatePDFFile 方法的重印:
This issue seems to have been addressed on the iphone dev sdk forums:
PDF creation tutorial
All credit goes to danielb21: here is a reprint of their CreatePDFFile method: