带石英的PDF页面

时间:2010-06-25 11:31:27

标签: objective-c iphone quartz-graphics

这是我从pdf文档中获取页面并使用每个页面创建pdf文档的代码:

- (void)getPages {
NSString *pathToPdfDoc = [[NSBundle mainBundle] pathForResource:@"security" ofType:@"pdf"];
NSURL *pdfUrl = [NSURL fileURLWithPath:pathToPdfDoc];

CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef)pdfUrl);

size_t numberOfPages = CGPDFDocumentGetNumberOfPages(document);

for (size_t i = 0; i < numberOfPages; i++) {
    CGPDFPageRef page = CGPDFDocumentGetPage(document, 0);

    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);

    NSString *filename = [NSString stringWithFormat:@"./security%d.pdf", i];

    CFStringRef path = CFStringCreateWithCString (NULL, [filename UTF8String], kCFStringEncodingUTF8);
    CFURLRef url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, 0);
    CFRelease (path);

    CFMutableDictionaryRef myDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));

    CGContextRef pdfContext = CGPDFContextCreateWithURL(url, &pageRect, myDictionary);
    CFRelease(myDictionary);
    CFRelease(url);

    CGContextBeginPage(pdfContext, &pageRect);
    MyDrawPDFPageInRect(pdfContext, page, kCGPDFMediaBox, pageRect, 0, true);
    CGContextEndPage (pdfContext);
    CGContextRelease (pdfContext);
}

CGPDFDocumentRelease(document);
}

void MyDrawPDFPageInRect(CGContextRef context, CGPDFPageRef page, CGPDFBox box, CGRect rect, int rotation, bool preserveAspectRatio) {
CGAffineTransform m;

m = CGPDFPageGetDrawingTransform(page, box, rect, rotation, preserveAspectRatio);
CGContextSaveGState(context);
CGContextConcatCTM(context, m);
CGContextClipToRect(context, CGPDFPageGetBoxRect (page, box));
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
}

问题是页面出现在文件系统中,但它们是空的。 知道为什么会这样吗?

1 个答案:

答案 0 :(得分:7)

PDF页面的编号为1.所以这一行:

    CGPDFPageRef page = CGPDFDocumentGetPage(document, 0);

给你一个空页面,它反过来给你一个空的页面rect,从那时起你就什么都没画了。而且,每次都没有相同的东西,因为你总是获取第0页而不是在页面中移动。

你想要的是让循环变量从1开始,然后用它来获取页面:

for ( size_t i = 1; i <= numberOfPages; i++ ) {
    CGPDFPageRef page = CGPDFDocumentGetPage(document, i);

我认为其他一切都应该按原样运作。