2009-07-24 7 views
1

J'essaye de générer un PDF en utilisant XSL (XML-FO) pour transformer un XML généré à partir d'une base de données. En raison de règles complexes en termes de pagination pour ce document, des calculs sont effectués pour déterminer les sauts de page lorsque je génère le code XML qui sera consommé par le XSL. J'ai remarqué que j'ai obtenu des résultats incohérents avec ces calculs. Par exemple, la zone d'impression requise en termes de hauteur est de 9 pouces que je convertis ensuite en points en la multipliant par 72 (soit 72 points par pouce) = 648 points.Calcul de la largeur et de la hauteur d'une chaîne formatée en C#

Donc, pour chaque ligne, j'utilise MeasureString pour obtenir la hauteur de la ligne que je soustrais ensuite à 648 pour voir s'il reste de l'espace disponible pour imprimer la ligne. Mais chaque fois qu'un saut de page est déterminé, il y a un grand espace qui reste en bas. C'est comme si la conversion 648pt est fausse. Maintenant, je suis également préoccupé par le fait que la hauteur retournée par la méthode MeasureString peut aussi être fausse.

Je suis désolé pour le long message, mais j'apprécie toute contribution/suggestion quant à ce que je pourrais faire mal.

Merci beaucoup!

Répondre

2

Je pense que le plus gros problème est que vous utilisez des méthodes GDI pour mesurer une chaîne qui sera affichée dans un fichier PDF. Ce n'est pas assez précis. (Même si vous obtenez les polices identiques, elles utilisent des techniques de rendu différentes de ce dont je me souviens.)

Donc, vous devriez essayer d'autres formes de calcul. Une première étape simple consisterait à estimer les caractères par ligne et ensuite la hauteur de chaque ligne telle qu'elle apparaîtrait dans le fichier PDF. Ensuite, utilisez simplement ces chiffres. Une fois que cela est proche, vous pouvez améliorer la technique d'estimation en prêtant attention à des caractères spécifiques. (Vous ne voulez probablement pas arriver au niveau du crénage de calcul.)

Une autre technique pourrait être de faire quelque chose que j'ai travaillé dans un projet antérieur. En utilisant iTextSharp, nous avons dû ajouter du texte creux en diagonale sur une page (comme une sorte de filigrane). Comme le texte était inconnu, nous avons deviné la taille de la police d'origine. Ensuite, le code est entré dans une boucle où il mesurerait la taille du texte rendu, et l'ajusterait vers le haut ou vers le bas jusqu'à ce que la taille soit la bonne pour remplir la page sans écrêter le texte. (Tout cela a été fait avec iTextSharp.)

+0

Désolé, il a fallu tellement de temps pour revenir à vous les gars. Je devais faire la technique d'estimation. Je crois que je suis proche. Merci! – Jaime

0

Je suppose que vous utilisez la méthode MeasureString sur la classe System.Drawing.Graphics. Vous devez définir la propriété PageUnit sur GraphicsUnit.Point pour obtenir des mesures en points. XSL-FO ne s'affichera probablement pas de la même manière que GDI +. En particulier les algorithmes d'enveloppement du texte seront différents. Cependant, en supposant que le PageUnit est correct et que vous avez une mise en page simple qui n'implique pas de texte qui a été enveloppé, vous avez peut-être oublié quelque chose d'évident en estimant la taille du PDF produit par XSL-FO. Peut-être, vous pouvez essayer de changer la taille de la page de 1 à 9 pouces à intervalles de 1 pouce. Vous pouvez ensuite utiliser une règle pour mesurer l'espace en excès et essayer de déterminer la relation entre la taille de la page et l'espace en excès. Vous devriez alors revoir votre code pour déterminer où vous avez une mauvaise hypothèse sur la taille du texte.

+0

Merci pour votre réponse Martin! J'apprécie la contribution. – Jaime

0

J'ai eu un problème très similaire il y a quelques années. Ce que j'ai trouvé sur mon propre projet, c'est que j'ai obtenu de bien meilleurs résultats en utilisant les anciennes fonctions Win32 gdi pour les métriques de texte (http://msdn.microsoft.com/en-us/library/dd144821(VS.85).aspx) via P/Invoke.Il renvoie des résultats différents de citation que le GDI + MeasureString. Ils étaient beaucoup plus compatibles avec ce que voyaient les PDF.

Questions connexes