我对此的理解是,也许CGPDFContext用于编辑PDF文档数据,而CGPDFDocument用于存储数据,因为文档没有列出任何更改CGPDFDocument内容的方法。
我也不太清楚CGDataConsumer/Provider做了什么。通过阅读文档,我得到了这样的印象:消费者/提供者抽象出CG对象和它所写的CFData之间的关系;所以我不需要自己去做。因此,我认为下面的代码将创建一个两页空白的PDFdocument:
//Don't know exactly how large a PDF is so I gave it 1 MB for now
self->pdfData = CFDataCreateMutable(kCFAllocatorDefault, 1024);
self->consumerRef = CGDataConsumerCreateWithCFData(self->pdfData);
self.pdfRef = CGPDFContextCreate(self->consumerRef, NULL, NULL);
CGPDFContextBeginPage(self.pdfRef, NULL); //Creates a blank page?
CGPDFContextEndPage(self.pdfRef);
CGPDFContextBeginPage(self.pdfRef, NULL); //Creates a second blank page?
CGPDFContextEndPage(self.pdfRef);
//Copies the data from pdfRef's consumer into docRef's provider?
self.docRef = CGPDFDocumentCreateWithProvider(
CGDataProviderCreateWithCFData(
CFDataCreateCopy(kCFAllocatorDefault, self->pdfData)
));但是它没有工作,NSLogging -- docRef的前两页--返回NULL。我在这方面很新,尤其是C层。有人能向我解释一下CGPDFContext,CGPDFDocument,CGDataConsumer & CGDataProvider之间的关系,以及我如何用它们来创建一个空白PDF吗?
发布于 2014-04-23 14:56:44
据我所见,你的基本理解是正确的:
当您想要创建自己的PDF文件时,您有两种方法来完成它,如下所述:https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGPDFContext/Reference/reference.html
如果您想要使用这些函数,请看一下这个页面ref/doc/uid/TP30001066-CH214-TPXREF101,它详细解释了如何使用数据提供程序创建PDF文件,而不是(简单地)创建PDF文件。
为了弄清楚正在发生什么,我首先尝试将一个简单的PDF文件写入磁盘,然后将一个文件写入数据提供程序,然后立即使用该数据提供程序再次读取它。但是,在不尝试代码的情况下,请允许我指出,您没有使用"CGPDFContextClose“,这在文档中被描述为关闭PDF文档并将所有信息刷新到输出。实际上,您可能会遇到这样一种情况,即有些东西是缓存的,还没有写入数据提供程序,仅仅是因为您没有强制这样做。
https://stackoverflow.com/questions/22882339
复制相似问题