Centrer un texte sur une page

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Centrer un texte sur une page

Message par omega »

Bonsoir

Je voudrais imprimer un document avec un titre en haut de page centré horizontalement.
Le calcul des positions est converti en cm. Cette conversion me permet d'imprimer un document sur n'importe quel type d'imprimante.

Exemple :

Code : Tout sélectionner

DrawText(ColCm(1),LigneCm(2), "PureBasic")
Ce code imprime le texte (Purebasic) à 1cm (de gauche à droite de la page) et à 2cm du haut vers le bas de page.
Le titre que je veux imprimer est paramétrable, c'est à dire que l'utilisateur peut changer la police de caractère, la taille et même la couleur. Donc, la taille que pourrait contenir un caractère sur ma page n'est pas constante (exemple : arial de taille 8 occupe environ 2mm de taille sur la page, alors que arial 18 peut très bien dépasser 1cm..

Quelqu'un a une idée?

Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Centrer un texte sur une page

Message par TazNormand »

Durant mes vieilles années en de seconde en dactylo (si si) jusqu'au Bac H informatique (1993 tout de même), il y avait une règle pour centrer du texte, mais on était sur des polices de tailles fixes. A toi d'adapter, mais je pense que la règle est faisable pour ton besoin :
décalage à gauche = ((Taille de la page - Taille du texte) / 2)
En gros, pour un texte de 27 caractères sur une page de 80 caractères de large, tu fais un décalage de 27 caractères :
(80 - 27) /2 = 53/2 = 26.5 qu'on arrondissait à 27.

Donc à toi de calculer la taille de la page, et la taille de ton texte à centrer, ce qui te donnera ta marge de gauche.
Image
Image
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Centrer un texte sur une page

Message par MLD »

@omega
Regarde sur le forum a "imprime facile". J'ai fait un truc il y a quelques temps.
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Centrer un texte sur une page

Message par omega »

@Taz Normand

Je crois que tu ne m'as pas compris, toute la question est là justement:
Il est impossible de connaître la taille du texte à imprimer car il s'agit au fait
de connaître la taille en cm et non pas la longueur du texte (len(texte) qui donne le nombre de caractères du gadget et non pas sa taille en cm. Même la largeur du papier est une inconnue en terme de nombre de caractères. Voici les hypothèses pour finir:

largeur de la page à imprimer = 21 cm
nombre de caractères maxi par page: inconnu (N variable en fonction de la police utilisée)
nombre de caractères du texte à imprimer=connu et calculable (=len(texte))

Il est possible de créer une procédure qui fait ce travail, c'est à dire center le texte su une page quelque soit sa taille et quelque soit la police de caractères, mais je voulais savoir s'il y avait une solution plus raccourcie (commande pb).

@MLD (je vais voir)

Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Centrer un texte sur une page

Message par microdevweb »

Je n'ai jamais imprimé avec Pb, par contre je penses que les fonctions sont les mêmes que les les fonctions de dessin, tu peux donc récupérer la largueur du texte en pixels avec TextWith, il faut ensuite convertir en mm. D'après se que j'ai vu sur le net 1 pxl=0.2645833333333 mm.

Cordialement
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Centrer un texte sur une page

Message par Marc56 »

Bonjour,

Imprimer du texte à une échelle précise à un endroit précis est souvent pénible :?
Il faut commencer par connaitre l'imprimante en cours, c'est à dire sa résolution et son format de papier, puis faire un certain nombre de calcul.

L'alternative simple est de générer un document PDF (directement et non pas à l'aide d'une imprimante virtuelle)
ABBKlaus a effectué pour PureBasic, un excellent portage de l’excellent librairie PHP FPDF (qui sert à générer du PDF depuis un serveur Web utilisant PHP)

À télécharger ici:
http://www.purebasicpower.de/?PurePDF
Pas de panique, bien qu'indiquée pour PB 5.2, ça fonctionne très bien pour la 5.31

Il y a plusieurs intérêts à faire du PDF directement
- Tu définis la taille de la page dans le programme (par défaut A4)
- Tu positionnes texte et image en unité métrique plutôt qu'en pixels ou dpi
- Tu peux archiver directement tes rapports ou les envoyer par mail

En ce qui concerne le texte, tu as une fonction pdf_Cell() qui permet d'afficher des blocs de texte (comme un logiciel de PAO).
Le texte contenu dans un bloc (même une simple ligne) peut être centré, justifié etc. L'affichage de cadre est facultatif.

Exemple tiré du tutorial

Code : Tout sélectionner

; --- Nom du document PDF
Define file$="Tutorial01 Hello World.pdf"	

; --- Créé le document
pdf_Create()

; --- Ajoute une page 
; Sans autre paramètre la page est une A4
; La marge est de 1 cm (on peut la changer avec pdf_SetMargins)
pdf_AddPage()
pdf_SetFont("Arial","B",16)

; --- Créé une cellule de 19 mm sur 10 avec un cadre visible
; Rappel: par défaut les marges sont de 1 cm, et l'origine en haut à gauche
; La largeur utilisable est donc de 19 cm, la hauteur 27,7 cm
; en faisant un cadre de 19 cm le texte sera toujours centré quelque soit sa taille
pdf_Cell(190,10,"Centré avec cadre",1, 0, #PDF_ALIGN_CENTER)

; --- Descend de 2 cm (par rapport au haut de la zone imprimable)
pdf_SetY(20)

; --- Créé la même chose, mais sans cadre visible
pdf_Cell(190,10,"Centré sans cadre",0, 0, #PDF_ALIGN_CENTER)

; --- Sauvegarde le document
pdf_Save(file$)

; --- Ouvre le document dans le visualiseur PDF installé
RunProgram(file$)
Rapide et simple. :wink:

La licence de PurePDF te permet de l'utiliser même pour une application commerciale (indiquer l'auteur est recommandé et apprécié)

Attention: si tu installe le package tel quel, les exemples te ferons un message d'erreur:
« Nom déjà utilise par une commande (provenant de la bibliothèque 'PurePDF'). »
La raison: La lib est déjà chargé car elle se trouve dans le répertoire UserLibrairies et XincludeFile empêche de la recharger une deuxième fois (comportement normal)

il faut alors mettre en commentaire dans les exemples les deux lignes
; #PurePDF_Include=1
; XIncludeFile "PurePDF.pb"


en faisant l'installation par défaut, tu as l'aide contextuelle et le tout dans Aide / Aide externe

8)
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Centrer un texte sur une page

Message par omega »

@marc56

Bonsoir

Le problème de type d'imprimante ne se pose pas pour moi car j'utilise une procédure qui convertit les dpi en cm, donc les dimensions et les coordonnées de ma page sont calculables. Le problème n'est pas là.

@Microdevweb
Je ne sais pas si TextWith existe en pb (je vais confirmer), si c'est le cas alors je peux dire que le problème est réglé car c'est la seule fonction qui me permettra de positionner mon texte là où je veux puisque je connais sa largeur.

Merci pour cette information (reste à confirmer si elle existe en pb...)
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Centrer un texte sur une page

Message par Marc56 »

Dans l'aide, il suffit de chercher par mot-clé
---------------------
TextWidth()

Syntaxe

Longueur = TextWidth(Texte$)
Description

Renvoie la longueur (en pixels) d'une chaîne de caractère sur la surface de dessin en cours avec la police de caractères actuelle.
---------------------

Donc pour centrer:

DrawText( (PrinterPageWidth() - TextWidth(Txt_titre) ) / 2 , ...

(voir l'aide, chapitre Printer pour les autres commandes)

Un petit exemple maison.
Texte centré et imprimé à 1 cm du bord haut de la page physique (sans marges)
Note: je n'ai pas traité le facteur d'échelle du texte

Code : Tout sélectionner

; Print A4

Global Txt_titre.s = "Hello World!"

DefaultPrinter()
NewPrinterPage()

Global Ech.i = PrinterPageWidth()  / 210

Debug "Nombre de points de cette imprimante pour 1 mm : " + Str(Ech)

LoadFont(1, "Verdana", Ech * 10)

If PrintRequester()
	StartPrinting("Test")
	StartDrawing(PrinterOutput())
	
	DrawingFont(FontID(1))
	DrawingMode(#PB_2DDrawing_Transparent)

	DrawText( (PrinterPageWidth() - TextWidth(Txt_titre) ) / 2 , 
	          Ech * 10,
	          Txt_titre, 
	          RGB(0, 0, 0) )
	
	StopDrawing()
	StopPrinting()
EndIf
PS. Pour éviter d'imprimer un tas d'essais, il y a le très ancien mais excellent utilitaire Fineprint http://fineprint.com/fp/. (Logiciel simple et génial d'aperçu/modification avant impression)

:wink:
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Centrer un texte sur une page

Message par microdevweb »

Une bonne solution serait aussi de passé par une image temporaire. Il suffis juste après d'imprimer l'image.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Centrer un texte sur une page

Message par Marc56 »

microdevweb a écrit :Une bonne solution serait aussi de passer par une image temporaire. Il suffit juste après d'imprimer l'image.
Oui, et c'est une solution d'autant plus intéressante que cela permet de faire en plus facilement un aperçu avant impression 8)

PS. Si on veut du « tout fait » il y a aussi PrinterLib, du même auteur ainsi que son intéressant PrintBarcode. Le tout à http://www.purebasicpower.de/
(Note: Comme pour PurePDF, si les exemples ne fonctionnent pas, mettez en commentaire la ligne: XIncludeFile)

:wink:
Avatar de l’utilisateur
omega
Messages : 633
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: Centrer un texte sur une page

Message par omega »

C'est exactement ce que je cherche ! Merci à vous tous. J'ai téléchargé FinePrint qui a l'air intéressant, je vais essayer d'utiliser TextWith(x) d'abord.

Merci encore et bonne continuation

(Je vous ferais part des résultats après les tests)
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Centrer un texte sur une page

Message par Marc56 »

En faisant des tests d'impression à l'échelle, je me rend compte que les mesures de dessins imprimés depuis PB semblent fausses à 0.5% :oops:

Un petit bout de code pour tester
(Mon imprimante fait du 600 dpi)

Code : Tout sélectionner

; Imprimer à l'échelle

; Résolution imprimante = 600 dpi = 600 points pour 25.4 mm
; = 23,62204724409449 points par mm

Global Facteur.F = 600 / 25.4
Debug "Points par mm = " + StrF(Facteur)

If PrintRequester()
	
	StartPrinting("Page de test")
	
	StartDrawing(PrinterOutput())
	
		DrawingMode(#PB_2DDrawing_Outlined)
	
		Largeur = 100 * Facteur	; 10 cm
		Hauteur = 200 * Facteur	; 20 cm
		
		Box(0, 0, Largeur, Hauteur, $0000FF)
	
	StopDrawing()
	
	StopPrinting()
	
EndIf
Une fois imprimé, et mesuré avec une vraie règle (pas le truc jouet en plastoc)
mon rectangle fait 9.95 mm sur 19.00 mm ce qui fait une erreur de 0.5%
Ce n'est rien pour un dessin, mais pour un plan, c'est très important (même si en théorie on ne doit pas re-mesurer un plan)
(même résultat avec PrinterLib , donc ce n'est pas mon calcul)

J'ai pensé que le problème venait de mon imprimante, mais un plan imprimé avec LibreCAD (http://librecad.org) est quant à lui parfaitement juste. :|
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Centrer un texte sur une page

Message par microdevweb »

@Marc56,

Je ne suis pas sur que le problème vienne de la mais

Code : Tout sélectionner

Largeur = 100 * Facteur   ; 10 cm
Hauteur = 200 * Facteur   ; 20 cm
Il y a une erreur, Largeur et Hauteur n'étant pas déclaré précédemment sont déclaré comme intéger or Facteur est un float, ceci vas donc générer des erreurs en ignorant les décimales. Il faut renseigner Largeur et Hauteur en float ou Facteur, Largeur, Hauteur en double
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Centrer un texte sur une page

Message par Marc56 »

Bonjour microdevweb,

Effectivement, j'ai fait une erreur classique là, mais au pire, cela aurait fait 0.209 point d'erreur, soit 0,0084 mm..., puisque largeur est le résultat de l'opération. :?

En entier, j'ai : 2362
en corrigeant en float: 2362.204833984375

Autre code, sans possibilité d'erreur de type

Code : Tout sélectionner

If PrintRequester()
	
	StartPrinting("Rectangle 10 x 20")
	
	StartDrawing(PrinterOutput())
	
		DrawingMode(#PB_2DDrawing_Outlined)
		
		; Boite de 10 cm sur 20 cm
		Box(0, 0,  
		    100.00 * 600 / 25.4,
		    200.00 * 600 / 25.4,
		    $FF0000)
	
	StopDrawing()
	
	StopPrinting()
	
EndIf
et ça donne la même chose: un rectangle de 9.95 x 19 au lieu de 10 x 20 :cry:

Edit: Je viens de faire un test en VB6 et c'est aussi faux 8O

Code : Tout sélectionner

Printer.Line (0, 0)-(0, 200)
Printer.Line (0, 200)-(100, 200)
Printer.Line (100, 200)-(100, 0)
Printer.Line (100, 0)-(0, 0)
Je ne comprend pas comment fait LibreCad pour tomber juste alors que je ne lui ai jamais fait d'étalonnage ?

Edit 2: Je viens de refaire un carré de 10 x 20 avec LibreCad, et c'est maintenant faux (1 mm pour 20 cm) :roll:
(oui, j'ai bien réglé le rapport d'échelle avant d'imprimer)
Donc mon imprimante s'est déréglée :? (Comment est-ce possible pour une laser?) 8O
Je vais me plonger dans la doc.
Donc mes calculs étaient justes, c'est au moins ça.
Il ne reste plus qu'à faire le rapport de proportion pour les fontes.

:D
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Centrer un texte sur une page

Message par Micoute »

Bonjour, voici ma petite contribution:

Code : Tout sélectionner

Procedure LongueurTexte(Texte.s, FontID)   ;Détermine la longueur du texte en pixels
  Protected Sortie = GetDC_(0)
  Protected Taille.Size
  
  SelectObject_(Sortie, FontID)
  GetTextExtentPoint32_(Sortie, Texte, Len(Texte), Taille)
  ReleaseDC_(0, Sortie)
  
  ProcedureReturn Taille\cx 
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre