2009-08-27 1 views
2

У меня есть NSImage, который поступает из PDF, поэтому он имеет одно представление типа NSPDFImageRep. Я делаю изображение setDataRetained: YES; чтобы убедиться, что он остается NSPDFImageRep. Позже я хочу изменить страницу, поэтому я получаю rep и устанавливаю текущую страницу. Это отлично.NSImageRep confusion

Проблема в том, что когда я рисую изображение, выходит только первая страница.

Мое впечатление, что когда я рисую NSImage, он выбирает представление и рисует это представление. Теперь изображение имеет только один реп, так что это тот, который рисуется, и это PDFrep. Итак, почему, когда я рисую изображение, не рисует ли правильная страница?

ОДНАКО, когда я рисую представление, я получаю правильную страницу.

Что мне не хватает?

ответ

1

NSImage выполняет кэширование NSImageRep при первом отображении. В случае NSPDFImageRep сообщение «setCacheMode:» не влияет. Таким образом, страница, которая будет отображаться, всегда будет первой страницей. См. this guide для получения дополнительной информации.

У вас есть то два решения:

  1. рисования представление непосредственно.
  2. Вызовите сообщение «recache» на NSImage, чтобы принудительно растеризировать выбранную страницу.
1

Альтернативным механизмом для создания PDF является использование функций CGPDF *. Для этого используйте CGPDFDocumentCreateWithURL для создания объекта CGPDFDocumentRef. Затем используйте CGPDFDocumentGetPage, чтобы получить объект CGPDFPageRef. Затем вы можете использовать CGContextDrawPDFPage, чтобы нарисовать страницу в графическом контексте.

Возможно, вам придется применить преобразование, чтобы гарантировать, что документ окажется таким же, как вы хотите. Для этого используйте CGAffineTransform и CGContextConcatCTM.

Вот некоторые примеры кода вытащил из одного из моих проектов:

// use your own constants here 
NSString *path = @"/path/to/my.pdf"; 
NSUInteger pageNumber = 14; 
CGSize size = [self frame].size; 

// if we're drawing into an NSView, then we need to get the current graphics context 
CGContextRef context = (CGContextRef)([[NSGraphicsContext currentContext] graphicsPort]); 

CFURLRef url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)path, kCFURLPOSIXPathStyle, NO); 
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL(url); 
CGPDFPageRef page = CGPDFDocumentGetPage(document, pageNumber); 

// in my case, I wanted the PDF page to fill in the view 
// so we apply a scaling transform to fir the page into the view 
double ratio = size.width/CGPDFPageGetBoxRect(page, kCGPDFTrimBox).size.width; 
CGAffineTransform transform = CGAffineTransformMakeScale(ratio, ratio); 
CGContextConcatCTM(context, transform); 

// now we draw the PDF into the context 
CGContextDrawPDFPage(context, page); 

// don't forget memory management! 
CGPDFDocumentRelease(document);