Calcule el tamaño de fuente ideal para que el texto quepa en la celda

Soy programador y tengo un código de impresión que dibuja una cuadrícula en el papel.

La cuadrícula tiene 4 columnas y tienen la misma longitud horizontal. La altura de la celda es una décima parte del tamaño del papel y es fija.

Se desconoce el número total de filas, pero sé con certeza que habrá al menos una fila y que las celdas tendrán dimensiones fijas.

El número máximo de caracteres que pueden caber en la celda es 50.

El usuario puede elegir el tamaño de papel en el que se realizará la impresión y allí me enfrento a un problema:

Dado que las dimensiones de la celda dependen del tamaño del papel, no sé cómo calcular el tamaño de la fuente para que el texto quepa en la celda.

Pedí ayuda en StackOverflow pero fallé, y traté de encontrar una fórmula matemática , pero esa solución no funcionó para todos los casos.

Pido disculpas por preguntar aquí, pero estoy desesperado en este momento. Si se requiere más información, pregunte y actualizaré mi publicación.

Gracias.

La técnica que aceptó aquí es correcta: math.stackexchange.com/a/859906 . Lo uso mucho usando HTML5 Canvas (en el navegador) y ExtendScript (en PhotoShop). Descubrí que siempre que el texto original sea más pequeño que el ancho del cuadro de texto, funciona perfectamente. Uso un tamaño de fuente de 4 para mis propósitos. ¿Puedes verificar que los errores que tuviste no se pueden resolver haciendo que el ancho del texto sea tan pequeño que nunca sea lo suficientemente largo para envolver cuando mides el ancho del texto por primera vez?
¿Estaría dispuesto a probar una herramienta alternativa (como esta cairographics.org/cairomm ) para lograr sus objetivos? Si es así, ¿tiene los mismos errores?
@TomDworzanski: no tengo permitido usar bibliotecas, pero no lo he probado con el tamaño de fuente 4, así que lo intentaré más tarde e informaré mis resultados. Gracias por tu consejo.
@TomDworzanski: incluso con el tamaño de fuente 4, pude encontrar un caso en el que la última letra apenas supera el límite.
Lamento escuchar eso. Espero que alguien más pueda encontrar una mejor solución. De lo contrario, su única opción puede ser solucionar el error con un margen adicional o con múltiples cambios de tamaño hasta que obtenga el ajuste correcto. Ojalá pudiera ofrecerte más.
@TomDworzanski: Estaba examinando los tamaños de papel y se me ocurrió una solución. Mi problema es que los norteamericanos tienen tamaños especiales (Carta, Tabloide...) que no tienen correlación matemática con A0. Lo mismo ocurre con los sobres. Si pudiera encontrar una correlación matemática entre A0 y esos dos estándares, creo que podría resolver el problema...

Respuestas (3)

En general, un lenguaje de programación tendrá un contexto de dispositivo que le permitirá dibujar un texto de ejemplo y luego medir su ancho y alto. Por ejemplo, en python, usando el kit de herramientas GUI de wxPython:

import wx
dc = wx.ScreenDC()
#yourFont =  wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, True)
#dc.SetFont(yourFont) 
w,h = dc.GetTextExtent('X') 

Independientemente de las herramientas que utilice, los requisitos suelen ser los mismos. Necesita saber el tamaño de fuente deseado y el relleno de celda deseado:

cell_height = padding_top + text_height + padding_bottom

donde las unidades son generalmente píxeles y text_height es af (fontSize).

Por lo general, no es recomendable cambiar el tamaño de las fuentes en función del ancho, a menos que esté dispuesto a ajustar el texto. Use un '...' o algo así para acortar el texto largo si no puede usar una nueva línea.

Tampoco escriba su propio código de ajuste de texto. Nuevamente, en Python:

import textwrap
a = "This sentence is less than 50 characters"
widthInChars = 20
lines = textwrap.wrap(a,widthInChars)

Ahora tiene una relación entre el tamaño de fuente, el espacio entre líneas, el relleno y el tamaño de celda.

Estoy usando puro WinAPI y C++. Tengo un contexto de dispositivo y una función que mide la longitud del texto, pero primero necesito seleccionar la fuente en el contexto del dispositivo. Esto significa que necesito "adivinar" el tamaño de la fuente, calcular la longitud del texto y solo luego verificar si se ajusta a la celda. Si no encaja, entonces necesito "hacer algo" para solucionarlo. Por lo general, no es recomendable cambiar el tamaño de las fuentes en función del ancho, a menos que esté dispuesto a ajustar el texto. Estoy dispuesto a hacer el envoltorio (pero no puedo usar ...para cortar el texto adicional). No hay nada como lines = textwrap.wrap(a,widthInChars)en WinAPI.
stackoverflow.com/questions/814954/wordwrap-win32 ¿Es útil? Mi comprensión de WinAPI es básica.
Desafortunadamente hay ciertas cosas DrawTextExtque arruinan mis planes, pero has entendido mi problema. Necesito algo similar que no modifique el rectángulo pasado si el texto es demasiado largo/alto.
Si es una opción; simplemente elija su fuente y cámbiela de tal manera que 50 caracteres se ajusten perfectamente a una celda. Tal vez el espacio en blanco adicional para las celdas de menos de 50 caracteres sea mejor que intentar hacer el ajuste para todos los casos.
No entiendo lo que quieres decir. Mi problema ocurre cuando la fuente es tan grande que el texto no cabe en la celda. Es por eso que necesito una forma de reducirlo de alguna manera, que es el propósito de mi pregunta. No tengo print-preview o similar, para comprobar el resultado.
@AlwaysLearningNewStuff "En general, no es recomendable cambiar el tamaño de las fuentes según el ancho a menos que esté dispuesto a ajustar el texto" es la respuesta correcta de diseño gráfico. Si tiene problemas con el aspecto técnico de las cosas, ese debería ser un trabajo para Stack Overflow, ¿no es así?
@wurflen: Lo intenté en StackOverflow y Mathematics pero no pudieron ayudarme. He publicado aquí por desesperación...

Si el usuario puede elegir el tamaño del papel impreso de una lista antes de ingresar cualquier texto en las celdas, ¿puede recorrer una serie de tamaños de papel y asignar a la tabla un tamaño de fuente según el papel? Esto requeriría muchas pruebas para ver qué fuentes se adaptan a qué tamaño de papel.

Todo eso es posible, pero es el enfoque que deseo evitar... :(

1 Obtendrá el tamaño de cualquier carácter de fuente, incluyendo todo (mayúsculas y ,-+'"&*#$ etc.), porque todas las fuentes tienen separaciones diferentes entre caracteres.

<div id='size23' >dd</div>...<div id='size43' >didididi</div>.... <div id='size54' >dwdwdwdw</div>

y use javascript para obtener el tamaño con diferentes combinaciones de caracteres

Width43 = getElementById('size43').offsetWidth; ....

2.-Cada fuente tiene una proporción de tamaño alto/ancho y métricas de fuente (proporción adicional personalizada), obtienes la proporción y la métrica de fuente para esa fuente. puede encontrar más aquí use una imagen del texto de fuente de zoom para obtenerlo.

3.-Utilice el número de proporción para obtener tamaños de celda como

proportion_number_font = 0.6

size_a = 0.10; size_b = 0.9 ...

total_a = 10, total_u = 5 , ......
Total_size = 34;


cell_width =  total_size 

cell_height =  0.6*34 ;

n = 2 // n is a proportional 

addjust_cell_proportion = cell_width * n * proportion_number_font;