Berechnen Sie die ideale Schriftgröße, damit der Text in die Zelle passt

Ich bin Programmierer und habe einen Druckcode, der ein Raster auf das Papier zeichnet.

Das Raster hat 4 Spalten und sie haben die gleiche horizontale Länge. Die Höhe der Zelle beträgt ein Zehntel der Papiergröße und ist fest.

Die Gesamtzahl der Zeilen ist unbekannt, aber ich weiß genau, dass es mindestens eine Zeile geben wird und dass die Zellen feste Abmessungen haben werden.

Die maximale Anzahl von Zeichen, die in eine Zelle passen, beträgt 50.

Der Benutzer kann das Papierformat auswählen, auf dem gedruckt werden soll, und dort stehe ich vor einem Problem:

Da die Zellenabmessungen von der Papiergröße abhängen, weiß ich nicht, wie ich die Schriftgröße berechnen soll, damit der Text in die Zelle passt.

Ich habe bei StackOverflow um Hilfe gebeten, bin aber gescheitert und habe versucht, eine mathematische Formel zu finden, aber diese Lösung hat nicht in jedem Fall funktioniert.

Entschuldigung, dass ich hier frage, aber ich bin im Moment verzweifelt. Wenn weitere Informationen erforderlich sind, fragen Sie bitte und ich werde meinen Beitrag aktualisieren.

Danke schön.

Die Technik, die Sie hier akzeptiert haben, ist korrekt: math.stackexchange.com/a/859906 . Ich verwende es ausgiebig mit HTML5 Canvas (im Browser) und ExtendScript (in PhotoShop). Ich habe festgestellt, dass es einwandfrei funktioniert, solange der ursprüngliche Text kleiner als die Breite des Textfelds ist. Ich verwende für meine Zwecke eine Schriftgröße von 4. Können Sie bestätigen, dass die Fehler, die Sie hatten, nicht behoben werden können, indem Sie die Breite des Textes so klein machen, dass er nie lang genug ist, um umbrochen zu werden, wenn Sie die Textbreite zum ersten Mal messen?
Wären Sie bereit, ein alternatives Tool (wie dieses cairographics.org/cairomm ) auszuprobieren, um Ihre Ziele zu erreichen? Wenn ja, hast du die gleichen Fehler?
@TomDworzanski: Ich darf keine Bibliotheken verwenden, aber ich habe es nicht mit Schriftgröße 4 versucht, also werde ich es später versuchen und meine Ergebnisse berichten. Danke für deinen Rat.
@TomDworzanski: Selbst bei Schriftgröße 4 konnte ich einen Fall finden, bei dem der letzte Buchstabe die Grenze kaum überschreitet.
Tut mir leid das zu hören. Ich hoffe jemand anderem fällt eine bessere Lösung ein. Wenn nicht, besteht Ihre einzige Möglichkeit darin, den Fehler mit etwas zusätzlichem Spielraum oder mit mehreren Größenänderungen zu umgehen, bis Sie die richtige Passform erhalten. Ich wünschte, ich könnte Ihnen mehr bieten.
@TomDworzanski: Ich habe Papierformate untersucht und bin auf die Idee für eine Lösung gekommen. Mein Problem ist, dass Nordamerikaner spezielle Größen haben ( Letter, Tabloid ... ) , die keinen mathematischen Zusammenhang mit A0 haben. Dasselbe gilt für Umschläge. Wenn ich eine mathematische Korrelation zwischen A0 und diesen beiden Standards finden könnte, denke ich, dass ich das Problem lösen könnte ...

Antworten (3)

Im Allgemeinen hat eine Programmiersprache einen Gerätekontext, der es Ihnen ermöglicht, einen Beispieltext zu zeichnen und dann seine Breite und Höhe zu messen. Zum Beispiel in Python mit dem wxPython GUI Toolkit:

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

Unabhängig davon, welche Tools Sie verwenden, sind die Anforderungen im Allgemeinen gleich. Sie müssen Ihre gewünschte Schriftgröße und den gewünschten Zellenabstand kennen:

cell_height = padding_top + text_height + padding_bottom

wobei Einheiten im Allgemeinen Pixel sind und text_height af(fontSize) ist.

Im Allgemeinen ist es nicht ratsam, Schriftarten basierend auf der Breite zu skalieren, es sei denn, Sie möchten den Text umbrechen. Verwenden Sie ein '...' oder ähnliches, um kurzen langen Text abzuschneiden, wenn Sie keine neue Zeile verwenden können.

Schreiben Sie auch keinen eigenen Textumbruchcode. Nochmal in Python:

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

Jetzt haben Sie eine Beziehung zwischen Schriftgröße, Zeilenabstand, Polsterung und Zellengröße.

Ich verwende reine WinAPI und C++. Ich habe einen Gerätekontext und eine Funktion, die die Länge des Textes misst, aber zuerst muss ich die Schriftart im Gerätekontext auswählen. Das heißt, ich muss die Schriftgröße "raten", die Textlänge berechnen und erst dann prüfen, ob sie in die Zelle passt. Wenn es nicht passt, muss ich "etwas tun", um das zu beheben. Im Allgemeinen ist es nicht ratsam, Schriftarten basierend auf der Breite zu skalieren, es sei denn, Sie möchten den Text umbrechen. Ich bin bereit, die Verpackung zu übernehmen (aber ich kann ...den zusätzlichen Text nicht ausschneiden). Es gibt nichts Vergleichbares lines = textwrap.wrap(a,widthInChars)in WinAPI.
stackoverflow.com/questions/814954/wordwrap-win32 Ist das hilfreich? Mein Verständnis von WinAPI ist grundlegend.
Leider gibt es einige Dinge DrawTextExt, die meine Pläne ruinieren, aber Sie haben mein Problem verstanden. Ich brauche etwas in dieser Richtung, das das übergebene Rechteck nicht ändert, wenn der Text zu lang/hoch ist.
Wenn es eine Option ist; Wählen Sie einfach Ihre Schriftart und passen Sie sie so an, dass 50 Zeichen perfekt in eine Zelle passen. Vielleicht ist der zusätzliche Leerraum für Zellen mit weniger als 50 Zeichen besser als der Versuch, das Umbrechen für alle Fälle durchzuführen.
Ich verstehe nicht, was du meinst. Mein Problem tritt auf, wenn die Schriftart so groß ist, dass der Text nicht in die Zelle passt. Deshalb brauche ich eine Möglichkeit, es irgendwie zu verkleinern, was der Zweck meiner Frage ist. Ich habe keine Druckvorschau oder ähnliches, um das Ergebnis zu überprüfen.
@AlwaysLearningNewStuff "Im Allgemeinen ist es nicht ratsam, die Größe von Schriftarten basierend auf der Breite zu ändern, es sei denn, Sie sind bereit, den Text umzubrechen", ist die richtige Antwort für das Grafikdesign. Wenn Sie Probleme mit der technischen Seite der Dinge haben, sollte das eine Aufgabe für Stack Overflow sein, oder nicht?
@wurflen: Ich habe es bei StackOverflow und Mathematik versucht , aber sie haben mir nicht geholfen. Ich habe aus Verzweiflung hier gepostet...

Wenn der Benutzer das gedruckte Papierformat aus einer Liste auswählen kann, bevor er Text in die Zellen eingibt, können Sie dann eine Reihe von Papierformaten durchlaufen und der Tabelle je nach Papier eine Schriftgröße zuweisen? Dies würde viele Tests erfordern, um festzustellen, welche Schriftarten zu welcher Papiergröße passen.

Das ist alles möglich, aber es ist der Ansatz, den ich vermeiden möchte ... :(

1 Sie erhalten die Größe für alle Zeichen der Schriftart, einschließlich aller (Großbuchstaben und ,-+'"&*#$ usw.), da alle Schriftarten unterschiedliche Trennungen zwischen den Zeichen haben.

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

und verwenden Sie Javascript, um die Größe mit verschiedenen Kombinationen von Zeichen zu erhalten

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

2.-Jede Schriftart hat eine Proportionsgröße, Höhe/Breite und Schriftartmetriken (benutzerdefinierte zusätzliche Proportionen). Sie erhalten Proportionen und Schriftartmetriken für diese Schriftart. Weitere Informationen finden Sie hier . Verwenden Sie ein Bild aus dem Zoom-Schrifttext, um es zu erhalten.

3.-Verwenden Sie die Proportionsnummer, um Größen für Zellen wie as zu erhalten

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;