2009-09-16 2 views
1

Я переношу код Cocoa-Java в Cocoa + JNI, так как Cocoa-Java устарел. Код печатает изображение, хранящееся в файле. Новый код какао в основном:Печать NSImage

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile]; 
if ([image isValid]) { 
    NSImageView *view = [[NSImageView alloc] init]; 
    [view setImage:image]; 
    [view setImageScaling:NSScaleProportionally]; 

    NSPoint p; 
    NSSize s; 

    p.x = static_cast<float>(boundsX); 
    p.y = static_cast<float>(boundsY); 
    [view setBoundsOrigin:p]; 

    s.width = static_cast<float>(boundsWidth); 
    s.height = static_cast<float>(boundsHeight); 
    [view setBoundsSize:s]; 

    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo]; 
    [info setHorizontalPagination:NSClipPagination]; 
    [info setVerticalPagination:NSClipPagination]; 
    [info setHorizontallyCentered:NO]; 
    [info setVerticallyCentered:NO]; 

    p.x = static_cast<float>(boundsX); 
    p.y = static_cast<float>([info paperSize].height - boundsHeight - boundsY); 
    [view translateOriginToPoint:p]; 

    NSPrintOperation *printOp = 
     [NSPrintOperation printOperationWithView:view printInfo:info]; 
    [printOp setShowsPrintPanel:NO]; 
    [printOp runOperation]; 
} 

Выполнение этого кода в конце концов падает с:

Thread 0 Crashed: 
0 com.apple.AppKit 0x9484ac75 -[NSConcretePrintOperation(NSInternal) _tryToSetCurrentPageNumber:] + 345 
1 com.apple.AppKit 0x948d88cf -[NSView(NSPrintingInternal) _printForCurrentOperation] + 524 
2 com.apple.AppKit 0x948d85c5 -[NSConcretePrintOperation _renderView] + 358 
3 com.apple.AppKit 0x9491f0c0 -[NSConcretePrintOperation runOperation] + 362 

Почему? Как я могу просто распечатать изображение, которое хранится в файле?

+0

Не забудьте освободить то, что вы положили. http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –

+0

В какой версии платформы ОС вы используете? Ведет ли он себя одинаково везде, где вы его пытаетесь? –

+0

@Quinn: Платформа = леопард. Ведет ли он себя одинаково повсюду? Неизвестно: у меня есть только мой компьютер, чтобы попробовать. –

ответ

-1

Это опечатка во второй раз, когда вы назначаете p.y? Это не выглядит, как вы определяете info до 2 строки позже ...

Кроме того, не было бы проще использовать NSMakePoint() и NSMakeSize() пропусканием Интс, вместо того, чтобы строить их вручную и с помощью static_cast<float>? Это похоже на очень C++-подход ...

Например, что-то вроде этого может работать?

NSImage *image = [[NSImage alloc] initWithContentsOfFile:spoolFile]; 
if ([image isValid]) { 
    NSPrintInfo *info = [NSPrintInfo sharedPrintInfo]; 
    [info setHorizontalPagination:NSClipPagination]; 
    [info setVerticalPagination:NSClipPagination]; 
    [info setHorizontallyCentered:NO]; 
    [info setVerticallyCentered:NO]; 

    NSImageView *view = [[NSImageView alloc] init]; 
    [view setImage:image]; 
    [view setImageScaling:NSScaleProportionally]; 
    [view setBoundsOrigin:NSMakePoint(boundsX, boundsY)]; 
    [view setBoundsSize:NSMakeSize(boundsWidth, boundsHeight)]; 
    [view translateOriginToPoint:NSMakePoint(boundsX, [info paperSize].height - 
                 boundsHeight - boundsY)]; 

    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:view printInfo:info]; 
    [printOp setShowsPrintPanel:NO]; 
    [printOp runOperation]; 
} 
+0

Да, плохая копия/вставка - исправлена. –

+0

Что касается NSMakePoint, NSMakeSize() - да, но это не моя проблема. –

2
NSImageView *view = [[NSImageView alloc] init]; 

Это недопустимо. Чтобы инициализировать представление, вам необходимо использовать initWithFrame:. Вероятно, вы захотите передать кадр, состоящий из NSZeroPoint и размера изображения.

Что касается использования setBoundsOrigin: и setBoundsSize:: Я не уверен, что они будут работать, если вы хотите обрезать изображение. Вы можете попробовать их (после устранения вышеуказанной проблемы), но я бы чувствовал себя безопаснее, чтобы создать новое изображение из нужного раздела старого. Вы сделали бы это, создав пустое изображение желаемого размера, сосредоточив внимание на нем, нарисуя правильную часть старого изображения в начале координат на новом изображении и откройте фокус на новом изображении, а затем создайте новое изображение вместо от старого до изображения.

+0

Я не собираюсь обрезать изображение. Я хочу напечатать все изображение. –

+0

Я изменил его на initWithFrame. Теперь он не сбой, но он запускает приложение для принтера без окна и без документа - даже если я нажму «Предварительный просмотр». Есть идеи? –

+0

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