Impression d'une page avec une NSView dédiée

TiSiAiTiSiAi Membre
mars 2014 modifié dans API AppKit #1

Bonjour

Afin d'imprimer une page avec diverses informations, je me suis tourné sur la réalisation de celle-ci avec  une classe dérivée d'une NSView.


 

J'ai ajouté le nécessaire pour la gestion du nombre de pages et de la zone à  imprimer avec :


- (BOOL)knowsPageRange:(NSRangePointer)range
{
}
- (NSRect)rectForPage:(NSInteger)page
{
}
- (float)calculatePrintHeight
{
}

mon seul problème est de fixer la taille de la page ( NSRect de la NSView )


habituellement sous windows je déduisais la taille en points à  partir de la surface à  imprimer en mm et en fonction du dpi d'impression


 


Sur OSX, dois je faire un 



NSPrintInfo *pi = [[NSPrintOperation currentOperation] printInfo];
NSSize paperSize = [pi paperSize]; 

avant la création de mon NSView afin de l'initialiser avec ce dernier dans le initWithFrame de la NSView ?

 


ou suis-je à  coté de la plaque ?


 


Je ne suis pas pour initialiser ma vue avec une taille fixe vu que mon impression doit s'adapter à  la surface ...


Merci par avance pour vos remarques

Réponses

  • AliGatorAliGator Membre, Modérateur
    mars 2014 modifié #2
    Bonjour,
    • Merci d'aller te présenter dans la section "Présentation des membres". Cela nous permettra de mieux te connaà®tre, mais aussi connaà®tre ton niveau, ton expérience, etc et donc mieux adapter nos réponses à  tes questions
    • Merci d'utiliser la balise code sur les forums pour mettre en forme le code source, cela le rend bien plus lisible ; une meilleure mise en page donnera + envie aux autres de te lire et donc potentiellement de te répondre.
    Cdlt
  • TiSiAiTiSiAi Membre
    mars 2014 modifié #3


    Bonjour,


    • Merci d'aller te présenter dans la section "Présentation des membres". Cela nous permettra de mieux te connaà®tre, mais aussi connaà®tre ton niveau, ton expérience, etc et donc mieux adapter nos réponses à  tes questions
    • Merci d'utiliser la balise code sur les forums pour mettre en forme le code source, cela le rend bien plus lisible ; une meilleure mise en page donnera + envie aux autres de te lire et donc potentiellement de te répondre.

    Cdlt

     




    J'y vais de ce pas. 

    Balise code ajoutées dans le post d'origine


  • AliGatorAliGator Membre, Modérateur
    Super merci (et bienvenue au fait) !

    Je laisse la parole aux habitués du SDK OSX pour te répondre maintenant ;-)
  • CéroceCéroce Membre, Modérateur
    avril 2014 modifié #5

    mon seul problème est de fixer la taille de la page ( NSRect de la NSView )[/size]

    habituellement sous windows je déduisais la taille en points à  partir de la surface à  imprimer en mm et en fonction du dpi d'impression

     

    Sur OSX, dois je faire un 



    NSPrintInfo *pi = [[NSPrintOperation currentOperation] printInfo];
    NSSize paperSize = [pi paperSize]; 

    avant la création de mon NSView afin de l'initialiser avec ce dernier dans le initWithFrame de la NSView ?

     



     

    Alors, je viens de me replonger dans mon code d'impression que j'ai écris il y a moins de trois mois, mais je ne suis pas sûr de pouvoir te donner une réponse exacte... Le système d'impression me parait peu compréhensible.

     

    - J'utilise -[NSPrintInfo paperSize] pour obtenir la taille du papier, exprimée en points d'imprimerie (1/72 pouce).

    - Dans mon code, je crée une nouvelle instance de la vue, en lui passant une frame de (0, 0, paperSize.width, paperSize.height). ça permet de faire correspondre la vue à  la page.

    - Les marges s'obtiennent par -[NSPrintInfo imageablePageBounds] et pas -bottomMargin et cie. Ces marges sont trop grandes et ne changent pas malgré les réglages dans Format d'impression.


    - Dans -rectForPage:, je retourne imageablePageBounds.


     


    Tu noteras que tout est exprimé en points d'imprimerie. Ce qui signifie qu'il faut aussi dessiner en 72èmes de pouce. Comme en interne, je gère tout en mm, j'ai converti systématiquement toutes les mesures en mm, y compris la frame de la vue.


     


    J'espère que ces indications pourront t'aider. J'ai des contraintes un peu particulières, alors ce que j'écris ne sont que des indications et peut-être pas la solution que tu devras adopter.


  • Merci Céroce d'avoir pris de ton temps pour me répondre.

     


    Ton explication lève le doute su mon mode opératoire lors de la création de la taille de la vue.


    Il restera peut être à  gérer le choix de l'imprimante ou du format d'impression avant de créer cette dernière. je pense que l'on reçoit les infos de l'imprimante par défaut ( à  valider, je n'ai pas encore fait le test )
    Tout à  fait d'accord pour le 1/72 pouce, on a juste à  convertir pour s'y retrouver avec nos mm


     


    Pour ce qui est des marges, celle retournée par le [NSPrintInfo imageablePageBounds] est la marge mini physique de l'imprimante.

    Cette valeur dans mon cas ne sera utile que si je veux imprimer sur la surface maxi. J'utiliserai le paramétrage manuel des marges pour fixer la compo de mon rendu ( tant que les marges seront fixées au dessus des valeurs hardware cela ne posera pas de soucis )


     


    A suivre suivant l'avancée du dev


    Merci encore


  • CéroceCéroce Membre, Modérateur


    Pour ce qui est des marges, celle retournée par le [NSPrintInfo imageablePageBounds] est la marge mini physique de l'imprimante.




     


    Non. Même si je crois que c'est ce qui est écrit dans la doc d'Apple, je suis assez sûr de moi. Essaie, tu verras.

  • TiSiAiTiSiAi Membre
    avril 2014 modifié #8


    Non. Même si je crois que c'est ce qui est écrit dans la doc d'Apple, je suis assez sûr de moi. Essaie, tu verras.




    Je vais creuser, mais cette marge est fixe alors que les marges fixées font bien réagir mon impression



    NSPrintInfo* sharedPrintInfo = [NSPrintInfo sharedPrintInfo];
    [sharedPrintInfo setVerticallyCentered:FALSE];
    [sharedPrintInfo setHorizontallyCentered:FALSE];
    [sharedPrintInfo setBottomMargin:40.0];
    [sharedPrintInfo setLeftMargin:40.0];
    [sharedPrintInfo setTopMargin:40.0];
    [sharedPrintInfo setRightMargin:40.0];
    NSPrintOperation* globalPrintOperation = [NSPrintOperation printOperationWithView:self printInfo:sharedPrintInfo];

    Lorsque je trace un rectangle en (0,0) il est calé sur la marge.

    Si ma marge est modifiée mon rectangle tracé est toujours bien positionné dessus.


    Attention,Ce sont des premières constatations, je n'ai pas encore finalisé comme toi.

    Je sais qu'en C# j'ai du tenir compte de la marge physique pour des impressions positionnées en relatif du coin de la feuille 

    Une marge manuelle à  20mm ne reflétais pas un tracé réel à  20mm sauf sur un driver pdf forcé dans marge physique..


    Je te tiens au courant de mon avancée. Mon but étant :

    - d'imprimer un rapport avec un marge manuelle de 20 mm autour de la feuille par exemple

    - d'imprimer dans un autre travail d'impression à  une position fixe de la feuille quelque soir la marge ( imprimer sur un formulaire déjà  imprimé par un tiers )


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