Selection d'imprimante

regattaregatta Membre
03:28 modifié dans API AppKit #1
Bonjour,

j'ai besoin de 2 imprimantes pour un logiciel :
une imprimante pour le format A4 et une pour des étiquettes (DYMO).

Mes étiquettes sont par bloc de 2 étiquettes juxtaposées.

Pour imprimer les étiquettes (par 2 donc), j'ai créée une classe dérivée de NSView et j'utilise la méthode drawRect pour écrire dans la vue.

Mon problème est au niveau de la sélection de l'imprimante !
Je crèe un NSPrintInfo avec les caractéristiques de l'imprimante (modèle, marque), son format de papier, l'orientation, etc..

Lorsque je demande l'impression des étiquettes, l'imprimante proposé est l'imprimante par défaut (A4) malgrés l'utilisation du code classique :

<br />&nbsp; &nbsp; &nbsp; // Demande d&#39;impression<br />	NSPrintOperation *op = [NSPrintOperation printOperationWithView:self printInfo:printInfo];<br />	[op setShowPanels:YES];<br />


où printInfo correspond à  mon imprimante pour les étiquettes.

Une idée pour sélectionner l'imprimante sans passer par le setShowPanels et changer le choix  B)

Nota : le code [NSPrintInfo setSharedPrintInfo:printInfo] avant la demande d'impression ne change rien !

Réponses

  • BruBru Membre
    03:28 modifié #2
    Tu n'as pas mis tout le code, alors je ne sais pas si t'as oublié une étape.

    Quoiqu'il en soit, voici ce qu'il faut faire pour imprimer sur une imprimante spécifique (et qui n'est pas celle par défaut) :

    1. tu dois créer un NSPrinter spécifique à  ton imprimante :
    NSPrinter *printer;<br />printer=[NSPrinter printerWithName:@&quot;Dymo&quot;];
    

    Le nom est celui que tu peux lire dans l'appli Configuration d'imprimante (/Applications/Utilitaires). Clique sur l'imprimante désirée, puis clique sur Afficher les infos. Le nom de l'imprimante est celui dans le champ Nom de l'imprimante (copie/colle le dans ton projet Xcode).

    2. Après création/récupération de ton NSPrinterInfo (que tu nommes printInfo apparemment), fais :
    [printInfo setPrinter:printer];
    

    pour attacher ton printInfo à  une imprimante physique (représentée par printer).

    3. Maintenant, tu peux imprimer via NSPrintOperation en spécifiant ton printInfo.

    .
  • regattaregatta Membre
    03:28 modifié #3
    Le code est un peu long et différent mais dans le même esprit :

    // Vérification de l&#39;imprimante<br />	printer = [NSPrinter printerWithType:imprimante];<br />	if (printer != nil)<br />	{<br />		<br />		// Création d&#39;un dictionaire pour créer l&#39;imprimante<br />		actualPrintInfo = [[NSPrintInfo sharedPrintInfo] retain];<br />		dictionaire = [[NSMutableDictionary alloc] initWithDictionary:[actualPrintInfo dictionary]];<br />		[dictionaire setValue:printer forKey:@&quot;NSPrinter&quot;];<br />		[dictionaire setValue:paper forKey:@&quot;NSPaperName&quot;];<br />		[dictionaire setValue:[printer name] forKey:@&quot;NSPrinterName&quot;];<br /><br />		// Vérification du format du papier<br />		paperSize = [printer pageSizeForPaper:paper];<br /><br />		// Contrôle de la taille du papier pour une étiquette<br />		......<br />		<br />		[dictionaire setValue:[NSNumber valueWithSize:paperSize] forKey:@&quot;NSPaperSize&quot;];	<br />		[dictionaire setValue:[NSNumber numberWithInt:NSLandscapeOrientation] forKey:@&quot;NSOrientation&quot;];<br />		<br />		// Calcul des marges<br />		.......<br />		[dictionaire setValue:[NSNumber numberWithFloat:marginL] forKey:@&quot;NSLeftMargin&quot;];<br />		[dictionaire setValue:[NSNumber numberWithFloat:marginR] forKey:@&quot;NSRightMargin&quot;];<br />		[dictionaire setValue:[NSNumber numberWithFloat:marginT] forKey:@&quot;NSTopMargin&quot;];<br />		[dictionaire setValue:[NSNumber numberWithFloat:marginB] forKey:@&quot;NSBottomMargin&quot;];<br />		<br />		[dictionaire setValue:[NSNumber numberWithInt:NSFitPagination] forKey:@&quot;NSHorizonalPagination&quot;];<br />		[dictionaire setValue:[NSNumber numberWithInt:NSFitPagination] forKey:@&quot;NSVerticalPagination&quot;];<br />		<br />		[dictionaire setValue:[NSNumber numberWithBool:YES] forKey:@&quot;NSPrintAllPages&quot;];<br />		<br />		printInfo = [[NSPrintInfo alloc] initWithDictionary:dictionaire];<br />		<br />		[dictionaire release];<br />
    


    Je ne vois pas de différence importante, mais cela doit pourtant être simple  :fouf): :
    • printerWithType au lieu de printerWithName
    • création de printInfo à  partir de sharedPrintInfo


    L'imprimante sélectionnée sur le panel est mon imprimante par défaut, la DYMO en deuxième position et non la DYMO par défaut.

    Je dois donc changer mon choix à  chaque impression d'étiquette (ce qui n'est pas insurmontable évidemment !)

    Une idée peut-être  :-\\
  • BruBru Membre
    novembre 2006 modifié #4
    dans 1162922369:

    Une idée peut-être  :-\\


    Oui, et même 2 !

    1. relire ton code. la clé NSPrinter n'existe pas, c'est plutôt NSPrintPrinter qu'il faut utiliser.

    2. relire la doc : il semble conseillé d'utiliser setPrinter: pour attacher l'imprimante à  ton printInfo plutôt que de le faire via setObject:ForKey: sur le dictionnaire de description (en effet, ce dernier est modifié en fonction des possibilités/contraintes de l'imprimante).


    PS : de plus, je doute fortement que les autres clés du dictionnaire soient correctes. Du moins, si je m'en réfère à  la doc.

    .
  • regattaregatta Membre
    03:28 modifié #5
    Je suis d'accord sur la différence entre les valeurs des clefs dans mon code et celle de la doc !

    J'avais commencé avec les valeurs décrites dans la doc mais comme cela ne fonctionnait pas, j'ai lu les valeurs dans le dictionaire après les lignes suivantes (voir pièce jointe)

    actualPrintInfo = [[NSPrintInfo sharedPrintInfo] retain];<br />		dictionaire = [[NSMutableDictionary alloc] initWithDictionary:[actualPrintInfo dictionary]];<br />
    


    les clefs me semblent différentes et je me suis basé sur celles retournées par GDB

    j'ai la berlu ou je n'est pas compris ce que me dit GDB  :fouf): (les deux peut-être !)

    C'est grave docteur  :-\\



    [Fichier joint supprimé par l'administrateur]
  • regattaregatta Membre
    03:28 modifié #6
    Je confirme que le point 2 est bien le problème (merci docteur) 
    [printInfo setPrinter:printer];
    
    fonctionne alors que
    [dictionaire setValue:printer forKey:@&quot;NSPrinter&quot;];
    
    ne fonctionne pas.

    Par contre, les clés lues à  partir du
    [NSPrintInfo sharedPrintInfo]
    
    ne sont pas en accord avec la doc apple ; cela resemble à  du copier/coller un peu bestial ou je ne comprend pas ce que retourne GDB.

    C'est pour moi la tournée ! :p :p

Connectez-vous ou Inscrivez-vous pour répondre.