Calculer la hauteur du texte en fonction de la largeur et de la police disponibles?
Nous sommes la création de documents PDF à la volée à partir de la base de données à l'aide de PDFsharp.
J'ai besoin de savoir la meilleure façon de calculer la hauteur de la zone de texte de base
sur la police utilisée et la largeur disponible.
J'ai besoin de savoir la hauteur pour que je puisse processus de sauts de page si nécessaire.
source d'informationauteur c00ke
Vous devez vous connecter pour publier un commentaire.
Droit, mais lors de l'utilisation de PDFsharp vous appelez XGraphics.MeasureString.
La PdfSharp.De dessin.XGraphics objet a une MeasureString méthode qui renvoie ce que vous avez besoin.
Cela devrait vous aider. Veuillez considérer que je n'ai pas testé ce code comme je l'ai écrit à la volée, afin de les aider. Il peut contenir quelques erreurs de compilation, mais vous pouvez obtenir l'idée.
.NET, vous pouvez appeler Les graphiques.MeasureString pour déterminer la taille de l'établi texte va être.
J'ai eu un problème similaire j'ai donc mis en place cette méthode d'extension:
J'ai écrit une petite extension de la méthode à la XGraphic objet de faire exactement cela : Calclulate le texte exact de la hauteur (et largeur) en spécifiant la maxWidth.
Voir la suite de l'essentiel, pour le code : https://gist.github.com/erichillah/d198f4a1c9e8f7df0739b955b245512a
L'OP demandé comment calculer la hauteur de texte basé sur largeur disponible et la police. De Windows .NET propose un appel API pour ce qui prend la largeur de l'argument; la version de PDFsharp je suis en utilisant (0.9.653, .NET 1.1) ne fonctionne pas.
Ma solution - utiliser le .NET appel d'API avec un objet Graphique alloué pour un personnalisé objet Bitmap pour obtenir la réponse.
Ce qui a fonctionné pour moi a été d'utiliser une image qui a une résolution de 100 DPI de résolution (critique) et qui est arrivé à être de la taille d'une page de Portrait (probablement moins critique).
Alors j'ai simplement demandé .NET ce que la taille du pixel serait pour la peinture sur l'image bitmap.
Vous n'aurez probablement souhaitez ensuite de convertir les unités de 1/100e de pouce pour les Points (pour PDFsharp).
Au cas où quelqu'un veut encore trouver une réponse, j'ai mis en place une assez facile-à-comprendre la méthode pour trouver la hauteur du texte.
Expliquant le code:
Tout d'abord, l'impression du texte. J'ai inclus une Option de XTextFormatter appelé tf parce que j'utilise soit XGraphics ou XTextFormatters de façon interchangeable dans mon application.
Ensuite, de calculer combien de temps le texte a été par MeasureString().La largeur.
Ensuite, calculer le nombre de lignes de texte, il y avait. Cela se fait en divisant la longueur totale du texte trouvé plus tôt par la largeur du rectangle (boîte) lorsque l'impôt est imprimé. Je l'ai fait avec une boucle while ici.
Multiplier la hauteur du texte (à l'aide d'un graphique.MeasureString().Hauteur) par le nombre de lignes, il y en avait. C'est la hauteur finale de votre texte.
Retourner la valeur de la hauteur. Maintenant, l'appel de la PrintString() va imprimer le texte fournis à l'extérieur tandis que le retour de la hauteur du texte imprimé par la suite.
PDFsharp inclut une classe XTextFormatter qui peut être utilisé pour dessiner du texte avec des retours à la ligne (.
Cependant, il ne permet pas de déterminer la hauteur nécessaire pour le texte. Inspiré par un commentaire de @Wakka02 j'ai amélioré cette classe, de génération de classe XTextFormatterEx.
À mon avis, il répond aussi à la question d'origine, donc je poste une réponse.
Je sais que c'est une vieille question et la réponse ne peut pas aider l'OP, mais c'est une question souvent posée et la réponse peut aider les autres.
La nouvelle classe a 500 lignes de code et je pense que ce serait trop pour ce post.
Le code source peut être trouvé sur le PDFsharp forum:
http://forum.pdfsharp.net/viewtopic.php?p=9213#p9213
Il peut également être trouvé dans mon humble blog:
http://developer.th-soft.com/developer/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/
Lors de l'utilisation de la nouvelle classe, vous pouvez d'abord appel
PrepareDrawString
pour savoir comment une grande partie du texte s'adapte et dont la hauteur du raccord de texte. Ensuite, votre décodeur peut dessiner le texte préparé à l'avance ou de préparer un autre texte ou préparer le même texte avec un autre rectangle.Ma nouvelle classe au travail:
XTextFormatterEx tf = new XTextFormatterEx(gfx);
int lastCharIndex;
double neededHeight;
À la préparation du texte invoque MeasureString de nombreuses fois. Plus tard, le texte peut être rédigé sans invoquer MeasureString de nouveau.
À compter d'aujourd'hui (Juillet 17, 2015) de la classe XTextFormatterEx (comme l'original XTextFormatter) utilise des champs internes de la XFont classe. Cela nécessite un traitement spécial lors de la compilation de la classe. J'ai décidé de copier mes XTextFormatterEx classe dans le PDFsharp dossier après le téléchargement de la source complète de package pour PDFsharp 1.32.
Quelqu'un essaie de modifier la XTextFormatter ou XTextFormatterEx classe seront confrontés au même problème.
J'espère que ce problème sera résolu avec les versions futures de PDFsharp, permettant à des versions modifiées de ces classes pour être inclus dans la demande de projet.