/* For the supplied URL and media box, create a PDF context that creates a PDF file at that URL and uses supplied rect as its document media box. */ CGContextRef myCreatePDFContext(CFURLRef url, CGRect mediaBox) { CGContextRef pdfContext = NULL; CFMutableDictionaryRef dict = CFDictionaryCreateMutable( kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); // Add some creator information to the generated PDF file. if(dict){ CFDictionarySetValue(dict, kCGPDFContextCreator, CFSTR("PDF Stamper Application")); pdfContext = CGPDFContextCreateWithURL(url, &mediaBox, dict); CFRelease(dict); } return pdfContext; }
int generatePages(const char *documentPath) { int error = 0; CFStringRef path = CFStringCreateWithCString( NULL, documentPath, kCFStringEncodingUTF8 ); CFURLRef url = CFURLCreateWithFileSystemPath( NULL, path, kCFURLPOSIXPathStyle, 0 ); CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); if (document != NULL) { size_t lastPageIndex = CGPDFDocumentGetNumberOfPages(document) + 1; CFStringRef pdfPath = CFSTR("document.pdf"); CFURLRef pdfUrl = CFURLCreateWithFileSystemPath( NULL, pdfPath, kCFURLPOSIXPathStyle, 0 ); CGContextRef context = CGPDFContextCreateWithURL(pdfUrl, NULL, NULL); printf("Compressing PDF\n"); for(size_t pageIndex = 1; pageIndex < lastPageIndex; ++pageIndex) { CGPDFPageRef page = CGPDFDocumentGetPage(document, pageIndex); const CGRect cropBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox); printf("Adding page %lu\n", pageIndex); CGContextBeginPage(context, &cropBox); CGContextDrawPDFPage(context, page); CGContextEndPage(context); } CGContextRelease(context); if (pdfUrl != NULL) CFRelease(pdfUrl); if (pdfPath != NULL) CFRelease(pdfPath); CGPDFDocumentRelease(document); } else { fprintf(stderr, "Cannot open PDF document\n"); error = 1; } if(url != NULL) CFRelease(url); if(path != NULL) CFRelease(path); return error; }