[IMPRESSION] Images d' AttributedString s'imprimant mal dans un Header
ClicCool
Membre
Bonjour,
Je ne parviens pas du tout à élucider ce mystère.
Je souhaite imprimer des Headers et Footers à partir de l'AttributedString récupérées de NSTextView nommés header et footer (permettant justement à l'utilisateur de définir ceux-ci).
Pour celà l'utilise:
-(void)drawPageBorderWithSize:(NSSize)borderSize de NSView
où, entre un lockFocus et un unLockFocus, j'envoie:
Et alors que pour un grand document tout marche à merveille, dès que le document à imprimer fait moins de 1 page + 7 lignes (précisément !!) les images de l'AttributedString ne s'impriment plus mais son texte oui !? ???
Il y a comme un place holder à la place de l'image mais pas l'image, le texte du Header lui s'imprime toujours avec sa mise en forme et à la bonne place.
Et idem si, indépendament du texte à imprimer, je force la View imprimée en corps de texte à une taille supérieure ou inférieure à 1 page + 7 lignes ???
Je ne vois pas le lien entre la taille de la View imprimée dans le corps de la page et l'impression des images du Header qui se fait dans la marge. Et pourtant il y en a un surement !
Je précise que le Footer, lui, s'imprime toujours bien sans problème quel que soit son contenu.
Peut-être qu'en image ce sera plus "parlant": exemples de résultats avec le même Header
Je ne parviens pas du tout à élucider ce mystère.
Je souhaite imprimer des Headers et Footers à partir de l'AttributedString récupérées de NSTextView nommés header et footer (permettant justement à l'utilisateur de définir ceux-ci).
Pour celà l'utilise:
-(void)drawPageBorderWithSize:(NSSize)borderSize de NSView
où, entre un lockFocus et un unLockFocus, j'envoie:
if (header) {<br /> NSAttributedString * headerText = (NSAttributedString*) [header textStorage];<br /> [headerText drawInRect: NSMakeRect([pInfo leftMargin], maxTop-[self hauteurHeader], borderSize.width - [pInfo leftMargin] - [pInfo rightMargin],[self hauteurHeader])];<br /> }
Et alors que pour un grand document tout marche à merveille, dès que le document à imprimer fait moins de 1 page + 7 lignes (précisément !!) les images de l'AttributedString ne s'impriment plus mais son texte oui !? ???
Il y a comme un place holder à la place de l'image mais pas l'image, le texte du Header lui s'imprime toujours avec sa mise en forme et à la bonne place.
Et idem si, indépendament du texte à imprimer, je force la View imprimée en corps de texte à une taille supérieure ou inférieure à 1 page + 7 lignes ???
Je ne vois pas le lien entre la taille de la View imprimée dans le corps de la page et l'impression des images du Header qui se fait dans la marge. Et pourtant il y en a un surement !
Je précise que le Footer, lui, s'imprime toujours bien sans problème quel que soit son contenu.
Peut-être qu'en image ce sera plus "parlant": exemples de résultats avec le même Header
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
le drawInRect de NSImageRep fonctionne bien dans les headers contrairement au drawInRect des AttributedStrings
donc, si au lieu d'imprimer une AttributedString dans mon Header, j'imprime direct une image ça marche nickel.
Faudrait maintenant que je découvre comment transformer à la volée mon AttributedString en Image. C'est faisable ?
Du côté de l'impression des Headers et footer sur 10.4 + j'ai fini par trouver le chaà®non manquant dans ma compréhension des chose ICI (Notes specific to MacOS X 10.4: Automatic page headers/footers in printouts (Added since WWDC) )
C'est fou comme, pour ce qui est des impressions, les informations sont disséminées.
(et sur la dev-list ceux qui ont posé des questions à ce sujet sont ignorés ou rembarrés façon "c'est très clair, on en a déjà parlé" etc...)
Bref j'ai enfin compris au mieux les mécanismes et comment tirer parti des nouvelles méthodes de NSView:
- (NSAttributedString *)pageHeader;
- (NSAttributedString *)pageFooter;
Super génial! ce n'est plus moi qui doit me charger directement de l'impression de mes AttributedStrings dans le Header !
J'ai qu'à transmettre mes attributedString à l'appel de ces fonctions. (et ne PAS implémenter de drawPageBorderWithSize ou alors d'y appeler super...)
Mais voilà ! ... même quand je laisse faire l'APPKit le résultat est strictement le même !! (sauf qu'en plus c'est mal cadré et tronqué sur toutes les pages ! mais ça doit pouvoir se paramétrer ...)
ET avec une bizarrerie de plus qui me laisse pantois: Il m'imprime ce que je renvoie avec pageHeader dans le pied de page et ce que je renvoie avec pageFooter dans l'entête !!! ???
(et même les entêtes et pieds par défaut sont inversés ! faut que je revois mon printInfo sans doutes ? ...)
Je me demande si je devrais pas poster ça à la dev-list ? (pas trop envie de me faire rembarrer non plus ... )
Je me demandais justement, dans ma voiture, si une telle chose était faisable.
(j'avais un doute surtout pour une vue offScreen car j'ai encore jamais manipulé le focus)
Merci ++ on cherche encore mieux quand on sait qu'on va trouver
Donc je garantis pas que ça marche non plus. C'est juste que si tu veux faire ça c'est comme ça que j'aurais fait.
Donc on peut "locker' le focus sur une image non seulement offScreen mais fraichement créé...
J'ai hâte d'essayer en tous cas.
Et de toutes façons t'inquiètes pas pour le résultat, je finirais bien par trouver (enfin j'espère )
Et je n'ai jamais autant progressé qu'en affrontant des diffucultés
Et enfin si j'y arrive pas comme ça, je penserais bien fort à Ferninde et essaierais de Binder le data d'une Image sur un NSMutableData lui même Bindé sur mon TextView ! c'est tellement fou que ça pourrait marcher !? ! :P
L'image résultante peut ainsi remplacer l'impression directe mais incomplète de l'AttribrutedString elle même.
Par contre l'image ainsi créée est de bien piètre qualité.
J'imagine que "l'impression" sur une view supposée affichable sur un moniteur n'a pas la même définition que pour une imprimante laser, mais là c'est encore pire que d'imprimer une simple capture d'écran...
J'ai essayé d'utiliser l'option NSStringDrawingDisableScreenFontSubstitution de drawWithRect: option: des AttributedString mais sans grande amélioration.
J'ai essayé aussi de crée une image 32 fois plus grande en y dessinant 32 fois plus gros, avec une amélioration plus sensible mais très insuffisante, et un ralentissement sensible de l'appli au lancement de l'impression.
J'ai même essayé une image 100 fois plus grande mais là ça ralenti plus ça bloque l'impression. Mon ordi prenant sans doutes alors le header pour un oeuf de Pâques s'est plein de ne pas pouvoir le "cacher" ! ("Can't cache image")
- soit tu dessines sur fond coloré: l'algo de lissage pour écran n'est pas adapté à l'impression: il n'utilise pas les pixels comme unité de base, mais les sous-pixels, le résultat n'est donc probant que sur un écran LCD avec des sous-pixels verticaux.
- soit tu dessines sur fond transparent et dans ce cas l'algo avec les sous-pixels n'est pas utilisé, c'est un autre dont le rendu est assez horrible pour les petites tailles de caractères (regarde le rendu texte dans Pages si tu veux te faire une idée).
Donc le mieux pour "convertir" une NSAttributedString en image serait d'augmenter la résolution de la représentation.
Pour être hônette je suis pas sûr de savoir sur quoi je dessine :-\\
C'est juste dans une NSView à peine initialisée avec intitWithSize...
Merci.
C'est un peu ce que j'essaies de faire d'abord en créant une image bien plus grande.
Et là , je suis en train d'essayer de dessiner cette image directement pendant l'impression c'est à dire à chaque page (pas glop pas glop) mais en espérant du coup hériter du contexte de l'impression en cours, histoire de voir.
Mais je crois qu'il va falloir que je me penche un peu sur la classe NSGraphicsContext ...
[EDIT]Â aucun résultat en créant l'image avec l'impression de chaque page
D'abord, tu créés un custom-view chargé de dessiner ton entête (ou pied de page).
Pour le moment tu n'as besoin que tu drawRect: dans lequel tu dessines tes images et tes NSAttributedString.
Ensuite, le but du jeu est de créer un NSPDFImageRep à partir de ce custom-view.
Enfin, il ne te resteras plus qu'à dessiner ce NSPDFImageRep dans ta view à imprimer.
L'avantage de PDF est d'être indépendant de la résolution (les textes dessinés restent vectoriels par exemple).
.
IMPECCABLE MERCI BRU <br />
Et J'en étais encore loin au bout du compte !
J'avais pas remarqué qu'il fallait aller voir les sous classes de NSImageRep -> je vais devoir ré-installer Apkido)
En plus c'est très facile et souple à mettre en oeuvre ça marche avec une vue un peu complexe et ça marche même en passant directement les paramètres d'une TexView. Et chaque fois avec un résultat impeccable. :brule:
C'est bon ?
J'ai perdu mon statut de débutant ?
.
C'est en bonne voie en tous cas
Mais si "=" au lieu de "==" est une erreur de débutant, à vrai dire, un débutant écrit if (maVariable == YES) et je suis sur que toi t'écris plutôt if (YES == maVariable) par sécurité. Mais ne me dit pas qu'il t'arrives jamais de te chopper une erreur à la "invalid lValue in assignement" de temps à autres ? non ? jamais ?
Plus sérieusement encore, je ne me permettrais jamais de te taquiner la dessus s'il ta maitrise du code n'était pas établie de telle sorte qu'aucune ambiguité soit possible.
Et encore plus sérieusement (si si, c'est possible) quel plaisir de retrouver ce site, son ambiance, ses membres et même les "débutants" qui usent et abusent des smiley (y'avait longtemps celle là non ?)
Bon, tu me pardonnes ? hein ? dis ?
P.S.: Stp tu peux pas remettre ton ancien avatar ?
Je sais pas pourquoi mais celui ci a comme l'air de me viser.
Je crois même y distinguer comme une volute de fumée sortir du bout de tes doights