我对此的理解是,也许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吗?

最佳答案

据我所知,您的基本理解是正确的:

  • CGPDFContext是一个绘图上下文,可将绘制在其上的所有内容“翻译”为PDF指令(通常用于存储在PDF文件中)。
  • CGPDFDocument用于打开现有的PDF文件并从中获取信息。

  • 当您要创建自己的PDF文件时,您可以通过以下两种方法来创建它:https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/CGPDFContext/Reference/reference.html
  • 使用传递数据使用者的“CGPDFContextCreate”。数据使用者获取数据并可以随意处理它(例如,您可以创建一个将PDF传递到剪贴板的数据使用者)。
  • 使用“CGPDFContextCreateWithURL”来传递URL。在这种情况下,您的数据将通过该URL写入PDF文件。

  • 如果要使用这些功能,请查看此页面的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文档并刷新所有信息以输出。实际上,您可能会遇到一种情况,即缓存了内容但尚未将其写入数据提供者,这仅仅是因为您没有强迫这样做。

    10-08 15:53