NSImageRep путаница - PullRequest
       31

NSImageRep путаница

2 голосов
/ 28 августа 2009

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 17 декабря 2009

Альтернативный механизм для рисования 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);
1 голос
/ 16 декабря 2009

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

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

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