如何在另一个上下文中绘制pdf上下文?

时间:2013-07-05 13:27:39

标签: ios objective-c cocoa core-graphics quartz-graphics

我创建了一个PDF上下文,上下文保存在文件中 作为现有的pdf上下文在不同的上下文中绘制?

pdfContext - > viewContext

我的代码:

void myCreatePDFFile(CGRect pageRect, const char *fileName){

CGContextRef pdfContext;
CFStringRef pathPDF;
CFURLRef urlPDF;
CFDataRef dataPDF;
CFMutableDictionaryRef myDictionary;
CFMutableDictionaryRef pageDictionary;

// Creates a CFString object from a filename passed to the function MyCreatePDFFile.
pathPDF = CFStringCreateWithCString(kCFAllocatorDefault,
                                    fileName,
                                    kCFStringEncodingUTF8);

// Creates a CFURL object from the CFString object.
urlPDF = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                       pathPDF,
                                       kCFURLPOSIXPathStyle,
                                       false);

CFRelease(pathPDF);

// Creates an empty CFDictionary object to hold metadata. The next two lines add a title and creator. You can add as many key-value pairs as you’d like using the function CFDictionarySetValue. For more information on creating dictionaries, see CFDictionary Reference .
myDictionary = CFDictionaryCreateMutable(kCFAllocatorDefault,
                                         0,
                                         &kCFTypeDictionaryKeyCallBacks,
                                         &kCFTypeDictionaryValueCallBacks);

CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));
CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("TESTer"));

/* Creates a PDF graphics context, passing three parameters:
 ● A CFURL object that specifies a location for the PDF data.
 ● A pointer to a rectangle that defines the default size and location of the PDF page. The origin of the rectangle is typically (0, 0). Quartz uses this rectangle as the default bounds of the page media box. If you pass NULL, Quartz uses a default page size of 8.5 by 11 inches (612 by 792 points).
 ● A CFDictionary object that contains PDF metadata. Pass NULL if you don’t have metadata to add. You can use the CFDictionary object to specify output intent options—intent subtype, condition, condition identifier, registry name, destination output profile, and a human-readable text string that contains additional information or comments about the intended target device or production condition. For more information about output intent options, see CGPDFContext Reference .
 */
pdfContext = CGPDFContextCreateWithURL(urlPDF, &pageRect, myDictionary);

CFRelease(myDictionary);
CFRelease(urlPDF);

// Creates a CFDictionary object to hold the page boxes for the PDF page. This example sets the media box.
pageDictionary = CFDictionaryCreateMutable(kCFAllocatorDefault,
                                           0,
                                           &kCFTypeDictionaryKeyCallBacks,
                                           &kCFTypeDictionaryValueCallBacks);

dataPDF = CFDataCreate(kCFAllocatorDefault,
                       (const UInt8 *)&pageRect,
                        sizeof(pageRect));

CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, dataPDF);

// Signals the start of a page. When you use a graphics context that supports multiple pages (such as PDF), you call the function CGPDFContextBeginPage together with CGPDFContextEndPage to delineate the page boundaries in the output. Each page must be bracketed by calls to CGPDFContextBeginPage and CGPDFContextEndPage. Quartz ignores all drawing operations performed outside a page boundary in a page-based context.
CGPDFContextBeginPage(pdfContext, NULL);

// draw square to pdf context
CGContextSetRGBFillColor(pdfContext, 1, 0, 0, 1);
CGContextFillRect(pdfContext, CGRectMake(25, 25, 50, 50));

// Calls an application-defined function to draw content to the PDF context. You supply your drawing routine here.

如何绘制PDF背景? pdfContext - > viewContext?

// Signals the end of a page in a page-based graphics context.
CGPDFContextEndPage(pdfContext);

// Releases the PDF context.
CGContextRelease(pdfContext);

// Releases the page dictionary.
CFRelease(pageDictionary);
CFRelease(dataPDF);
}

1 个答案:

答案 0 :(得分:1)

显示单页PDF的最简单方法是创建单页PDF的NSI图像,然后将其放入图像视图(无边框或其他方式)或将图像绘制到视图的某个部分或整体中#& 39; s bounds。

如果你有一个多页PDF并且想要显示它,并且有缩放控件和其他类似的功能,那么你会想要使用PDF Kit框架。它是OS X SDK的一部分;只需将其添加到Xcode中的目标,然后将PDFView添加到您的笔尖或在代码中创建一个,然后从URL创建PDF文档并将PDFDocument交给PDFView。

或者,您可以在Quick Look preview panel

中显示PDF