我对此的理解是,也许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吗?
最佳答案
据我所知,您的基本理解是正确的:
当您要创建自己的PDF文件时,您可以通过以下两种方法来创建它:https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGPDFContext/Reference/reference.html
如果要使用这些功能,请查看此页面的https://developer.apple.com/library/mac/documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html#//apple_ref/doc/uid/TP30001066-CH214-TPXREF101,该页面详细说明了如何使用数据提供者创建和不使用数据提供者(仅PDF)来创建PDF文件。
为了弄清楚发生了什么,我将首先尝试将一个简单的PDF文件写入磁盘,然后再将其写入数据提供者,然后立即使用该数据提供者再次读取它。但是,如果没有尝试您的代码,请让我指出您没有使用“CGPDFContextClose”,在文档中将其描述为关闭PDF文档并刷新所有信息以输出。实际上,您可能会遇到一种情况,即缓存了内容但尚未将其写入数据提供者,这仅仅是因为您没有强迫这样做。