2009-09-16 5 views
1

Je migre le code Cocoa-Java vers Cocoa + JNI car Cocoa-Java est obsolète. Le code imprime une image stockée dans un fichier. Le nouveau code de cacao est essentiellement:Impression d'un 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]; 
} 

exécution de ce code se bloque finalement avec:

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 

Pourquoi? Comment puis-je simplement imprimer une image stockée dans un fichier?

+0

Ne pas oublier de libérer ce que vous avez allocked. http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html –

+0

Quelle version de la plate-forme OS êtes-vous? Est-ce qu'il se comporte de la même manière partout où vous l'essayez? –

+0

@Quinn: Plate-forme = Leopard. Est-ce qu'il se comporte de la même manière partout? Inconnu: Je n'ai que mon propre ordinateur pour l'essayer. –

Répondre

-1

Est-ce une faute de frappe la deuxième fois que vous attribuez p.y? Il ne ressemble pas à vous définissez info jusqu'à 2 lignes plus loin ...

Aussi, serait-il pas plus simple à utiliser et NSMakePoint()NSMakeSize() en passant ints, au lieu de les construire à la main et à l'aide static_cast<float>? Cela ressemble à une approche très C++ ...

Par exemple, quelque chose comme ça pourrait fonctionner?

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

Ouais, mauvais travail de copier/coller - corrigé. –

+0

En ce qui concerne NSMakePoint, NSMakeSize() - oui, mais ce n'est pas mon problème. –

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

C'est invalide. Vous devez utiliser initWithFrame: pour initialiser une vue. Vous voudrez probablement passer une image composée de NSZeroPoint et la taille de l'image. Quant à l'utilisation de setBoundsOrigin: et setBoundsSize:: Je ne suis pas sûr que ceux-ci vont fonctionner, en supposant que vous voulez recadrer l'image. Vous pouvez les essayer (après avoir résolu le problème ci-dessus), mais je me sentirais plus à l'aise de créer une nouvelle image à partir de la section désirée de l'ancien. Pour ce faire, créez une image vide de la taille souhaitée, en verrouillant le focus, dessinez la section correcte de l'ancienne image à l'origine dans la nouvelle image et déverrouillez la nouvelle image, puis donnez la nouvelle image au lieu de le vieux à la vue de l'image.

+0

Je ne veux pas recadrer l'image. Je veux imprimer l'image entière. –

+0

Je l'ai changé pour initWithFrame. Il ne plante pas maintenant, mais il lance l'application de l'imprimante sans fenêtre et sans document - même si je clique sur Aperçu. Des idées? –

+0

Il n'est pas nécessaire de définir les limites si vous voulez l'image entière. –