php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005-2

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.06.2005, 02:55  
Gast
 
Beiträge: n/a
Standard Schriftbreite berechnen

Hallo

ich erstelle gerade Tabellen mit FPDF und stosse auf folgendes Problem: Wenn ein Text in einer Zelle zu gross ist, wird die Zelle automatisch vergrößert. Das dumme dabei: Alle anderen Zellen bleiben so wie sie sind. Die Zelle deckt also einfach die darunter liegende ab. Um alle Positionen vorgeben zu können muss man also die Breite der Schrift berechnen. Es reicht nicht, die Anzahl der Zeichen zu zählen.

lllllllllllllll = 15 Zeichen
QQQQQQQQQQQQQQQ = 15 Zeichen

der Optik wegen arbeite ich dort nicht mit einer fixed width font wie Courier New. Wäre zwar einfach, sieht aber grottenschlecht aus. Ich arbeite mit Arial.

Hat hier jemand schon mal dieses Problem gelöst? Entweder gibts sowas fertig von PHP oder man muss sich ein Array basteln das für jedes eventuelle Zeichen einen Faktor für die Breite enthält, und dann sucessive den String durch gehen. Was ich mir aber sehr mühsam und ineffizient vorstelle...
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.06.2005, 06:20  
Gast
 
Beiträge: n/a
Standard

Weis nicht ob man was mit GetStringWidth() machen kann.
Habe ich selber noch nicht probiert.

Zitat:
der Optik wegen arbeite ich dort nicht mit einer fixed width font wie Courier New. Wäre zwar einfach, sieht aber grottenschlecht aus. Ich arbeite mit Arial.
Habe schon Websites gesehn, die nur mit Courier gemacht worden sind und garnicht mal so schlecht waren.
Arial ist eine sch... Schriftart, weil der Buchstabenabstand zu eng ist und die Lesbarkeit nicht wirklich verbessert.
 
Alt 10.06.2005, 13:00  
Gast
 
Beiträge: n/a
Standard

http://de3.php.net/manual/en/function.imagettfbbox.php

das blöde ist nur, das man dafür die GD lib braucht. und wer hat die schon... (lizenzstress)

ich mache das jetzt so: ich schreibe mir eine funktion der ich folgendes übergebe:
- den string
- font type (erstmal nur arial)
- font size

und als output bekomme ich die länge des strings in pixel. wobei ich mir mit den einheiten noch nicht sicher bin. die "12" bei FPDF bezieht sich bestimmt auf ein metrisches mass... höhe in mm oder sowas. also wird der fontsize-faktor experimentell ermittelt.

ich gehe davon aus, das der grosse Buchstabe W der breiteste von allen ist, und i der schmalste. Dann erstelle ich ein Array mit allen Buchstaben und den gängigsten Sonderzeichen, jeweils mit dem Faktor um den der Buchstabe kleiner ist als der größte. Bei diesem Faktor handelt es sich immer um eine Zahl zwischen 0 und 1. Letztendlich werden dann mit der Funktion alle Zeichen - also die Faktoren - mit der experimentellen Font Size multipliziert und anschließend zusammengezählt. Alle weiteren unbekannten Zeichen werden einfach als maximale Breite gewertet, um sicher zu gehen. Das wäre ein guter Workaround um zumindest in FPDF's ordentliche Tabellen erstellen zu können.

Wenn jemand noch eine andere Idee hat, immer her damit
 
Alt 10.06.2005, 13:14  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

gdlib ist imho eigentlich standard !
und öhm lizenzstress ?? womit ? gdlib ist mitlerweile auch wieder ganz normal mit gif.

mfg
robo47
robo47 ist offline  
Alt 10.06.2005, 13:20  
Gast
 
Beiträge: n/a
Standard

@NewBert

Du brauchst (oder willst) doch die Breite für die Ausgabe vom PDF nutzen ?
Dazu erst den Umweg mit GBlib ?

Denke daran, dass du beim Einsatz von imagettfbbox() auch das Font-File mit auf den Server packen musst.

Was willst du eigenlich machen ?
Habe die Vermutung, dass du einiges viel zu umständlich machst
 
Alt 10.06.2005, 14:07  
Erfahrener Benutzer
 
Registriert seit: 02.07.2004
Beiträge: 338
spoi
Standard

[OT]

Lizenzstress mit GD lib??
des is doch dieses auf dem server mit php mach Bild ding oder?

[/OT]
__________________
MfG
spoi
spoi ist offline  
Alt 10.06.2005, 17:23  
Gast
 
Beiträge: n/a
Standard

Zitat:
Was willst du eigenlich machen ?
Habe die Vermutung, dass du einiges viel zu umständlich machst
möglich ist alles

also ich habe eine Rechnung, wo die Artikel in einer Tabelle dargestellt werden. Wenn die Artikelbezeichnung für das Feld zu lang ist, gibts nen Zeilenumbruch und die MultiCell ist plötzlich um 1 größer. Das dumme dabei: alle übrigen Felder in dieser Zeile bleiben "klein". Also kann ich schon mal keinen Rahmen einfügen weil das extrem dumm aussehen würde. Lösung: ich muss vorher berechnen ob FPDF einen Zeilenumbruch erzeugt. Wenn ja: dann erhöht sich der Y-Abstand der nächsten Zeile um die Höhe der MultiCell's. Aber dafür muss man erstmal wissen wie breit der String ist. Meine Funktion ist fertig und scheint zu gehen... schwierig sind aber immer noch grenzfälle. Möglicherweise muss ich einfach schon BEVOR FPDF einen Zeilenumbruch macht, selbst einen machen. So hat man die Kontrolle. Aber diese Grenzfälle sind ja selten... im schlimmsten Fall ist jetzt eine Zeile von Spalte a direkt an Spalte b angeklatscht, oder eine es ist mal eine zusätzliche Leerzeile drin. Damit kann ich aber leben... sind ja nur Rechnungen, und das FA interessiert sich dafür einen feuchten Furz. Quittungen von Me**amarkt sehen ja auch nicht schön aus.

habe das übrigens ganz ohne GDLib gelöst. Trivial aber es funktioniert...:

PHP-Code:
<?php

// #################### Breite eines Strings berechnen ##################
function strwidth($string,$font,$faktor,$abstand){
    
    unset(
$breite);
    
    
$string_laenge strlen($string);
    
// ARIAL
    
for($i=0$i $string_laenge$i++){
        
$string_x $string{$i};

        if(
$string_x == " "){
            
$breite = ($faktor 0.3) + $breite;
        } elseif(
$string_x == "0"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "1"){
            
$breite = ($faktor 0.3) + $breite;
        } elseif(
$string_x == "2"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "3"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "4"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "5"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "6"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "7"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "8"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "9"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "a"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "b"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "c"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "d"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "e"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "f"){
            
$breite = ($faktor 0.3) + $breite;
        } elseif(
$string_x == "g"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "h"){
             
$breite = ($faktor 0.45) + $breite
        } elseif(
$string_x == "i"){
            
$breite = ($faktor 0.11) + $breite;
        } elseif(
$string_x == "j"){
            
$breite = ($faktor 0.22) + $breite;
        } elseif(
$string_x == "k"){
            
$breite = ($faktor 0.42) + $breite;
        } elseif(
$string_x == "l"){
            
$breite = ($faktor 0.11) + $breite;
        } elseif(
$string_x == "m"){
            
$breite = ($faktor 0.77) + $breite;
        } elseif(
$string_x == "n"){
            
$breite = ($faktor 0.41) + $breite;
        } elseif(
$string_x == "o"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "p"){
            
$breite = ($faktor 0.49) + $breite;
        } elseif(
$string_x == "q"){
            
$breite = ($faktor 0.49) + $breite;
        } elseif(
$string_x == "r"){
            
$breite = ($faktor 0.3) + $breite;
        } elseif(
$string_x == "s"){
            
$breite = ($faktor 0.4) + $breite;
        } elseif(
$string_x == "t"){
            
$breite = ($faktor 0.28) + $breite;
        } elseif(
$string_x == "u"){
            
$breite = ($faktor 0.41) + $breite;
        } elseif(
$string_x == "v"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "w"){
            
$breite = ($faktor 0.79) + $breite;
        } elseif(
$string_x == "x"){
            
$breite = ($faktor 0.49) + $breite;
        } elseif(
$string_x == "y"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "z"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "ä"){
            
$breite = ($faktor 0.48) + $breite;
        } elseif(
$string_x == "ö"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "ü"){
            
$breite = ($faktor 0.47) + $breite;
            
            
        } elseif(
$string_x == "A"){
            
$breite = ($faktor 0.71) + $breite;
        } elseif(
$string_x == "B"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "C"){
            
$breite = ($faktor 0.7) + $breite;
        } elseif(
$string_x == "D"){
            
$breite = ($faktor 0.62) + $breite;
        } elseif(
$string_x == "E"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "F"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "G"){
            
$breite = ($faktor 0.7) + $breite;
        } elseif(
$string_x == "H"){
             
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "I"){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == "J"){
            
$breite = ($faktor 0.4) + $breite;
        } elseif(
$string_x == "K"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "L"){
            
$breite = ($faktor 0.48) + $breite;
        } elseif(
$string_x == "M"){
            
$breite = ($faktor 0.76) + $breite;
        } elseif(
$string_x == "N"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "O"){
            
$breite = ($faktor 0.71) + $breite;
        } elseif(
$string_x == "P"){
            
$breite = ($faktor 0.55) + $breite;
        } elseif(
$string_x == "Q"){
            
$breite = ($faktor 0.8) + $breite;
        } elseif(
$string_x == "R"){
            
$breite = ($faktor 0.7) + $breite;
        } elseif(
$string_x == "S"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "T"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "U"){
            
$breite = ($faktor 0.6) + $breite;
        } elseif(
$string_x == "V"){
            
$breite = ($faktor 0.63) + $breite;
        } elseif(
$string_x == "W"){
            
$breite = ($faktor 1) + $breite;
        } elseif(
$string_x == "X"){
            
$breite = ($faktor 7) + $breite;
        } elseif(
$string_x == "Y"){
            
$breite = ($faktor 0.65) + $breite;
        } elseif(
$string_x == "Z"){
            
$breite = ($faktor 0.62) + $breite;
        } elseif(
$string_x == "Ä"){
            
$breite = ($faktor 0.7) + $breite;
        } elseif(
$string_x == "Ö"){
            
$breite = ($faktor 0.71) + $breite;
        } elseif(
$string_x == "Ü"){
            
$breite = ($faktor 0.6) + $breite;
            
            
            
        } elseif(
$string_x == "ß"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == ":"){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == "'" or $string_x == "`" or $string_x == "´"){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == ","){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == "-"){
            
$breite = ($faktor 0.3) + $breite;
        } elseif(
$string_x == "+"){
            
$breite = ($faktor 0.5) + $breite;
        } elseif(
$string_x == "."){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == ";"){
            
$breite = ($faktor 0.1) + $breite;
        } elseif(
$string_x == "*"){
            
$breite = ($faktor 0.37) + $breite;
        } elseif(
$string_x == "_"){
            
$breite = ($faktor 0.6) + $breite;
        } else {
            
$breite = ($faktor 1) + $breite;
        }

    }
    return 
$breite + (($string_laenge 1) * $abstand);
}

// #################### Ende Breite eines Strings berechnen ##################



?>
 
Alt 10.06.2005, 17:26  
Gast
 
Beiträge: n/a
Standard Re: Schriftbreite berechnen

Zitat:
Zitat von NewBert
Hallo

ich erstelle gerade Tabellen mit FPDF und stosse auf folgendes Problem: Wenn ein Text in einer Zelle zu gross ist, wird die Zelle automatisch vergrößert. Das dumme dabei: Alle anderen Zellen bleiben so wie sie sind. Die Zelle deckt also einfach die darunter liegende ab. Um alle Positionen vorgeben zu können muss man also die Breite der Schrift berechnen. Es reicht nicht, die Anzahl der Zeichen zu zählen.

lllllllllllllll = 15 Zeichen
QQQQQQQQQQQQQQQ = 15 Zeichen

der Optik wegen arbeite ich dort nicht mit einer fixed width font wie Courier New. Wäre zwar einfach, sieht aber grottenschlecht aus. Ich arbeite mit Arial.

Hat hier jemand schon mal dieses Problem gelöst? Entweder gibts sowas fertig von PHP oder man muss sich ein Array basteln das für jedes eventuelle Zeichen einen Faktor für die Breite enthält, und dann sucessive den String durch gehen. Was ich mir aber sehr mühsam und ineffizient vorstelle...
Einfach:
PHP-Code:
<?php
$y    
$pdf->GetY();?>
Gibts natürlich auch für X .. einfach mal die _sehr gute_ Doku zu FPDF anschauen
 
Alt 10.06.2005, 17:42  
Gast
 
Beiträge: n/a
Standard Re: Schriftbreite berechnen

Zitat:
Zitat von bruZard
einfach mal die _sehr gute_ Doku zu FPDF anschauen
Das sollst Du ja machen, damit Du dem OP ein wenig aus dem Handbuch vorlesen kannst. <ggg>
 
Alt 11.06.2005, 02:27  
Gast
 
Beiträge: n/a
Standard

dumm ist nur, das das mit diesem GetY so gar nicht funktioniert. Probiere nun schon seit 48 Stunden rum und kriege keinen sauberen dynamischen Table abgebildet. ätzend...
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Tage, Stunden und Minuten berechnen christian1112 PHP Tipps 2008 10 02.03.2009 12:38
Statistik zu welchem Zeitpunkt berechnen? cycap Datenbanken 10 13.10.2007 12:19
Arbeitstage berechnen (Mo-Fr) bp158 PHP Tipps 2008 9 06.10.2007 13:20
entfernung mittels plz berechnen kid01 PHP-Fortgeschrittene 10 13.10.2006 17:53
[Erledigt] Sporttabelle aus Ergebnissen berechnen Datenbanken 6 13.03.2006 20:37
Ausgabetabelle berechnen GN PHP Tipps 2005-2 1 03.09.2005 02:57
hi, uhrzeiten subtrahieren und differenz berechnen Beitragsarchiv 0 04.07.2005 15:36
menschenalter berechnen janni PHP Tipps 2005 6 25.05.2005 00:13
[Erledigt] Restzeit berechnen PHP Tipps 2005 10 22.04.2005 13:02
Mathe-problem: Sinus mit beliebiger Genauigkeit berechnen? PHP Tipps 2005 4 19.01.2005 18:10
kapazität berechnen PHP Tipps 2005 7 10.01.2005 20:25
Help, Zahlen aus DB berechnen PHP Tipps 2004-2 6 29.12.2004 17:55
KFZ Haftpflicht Versicherungsprämie berechnen Beitragsarchiv 3 13.12.2004 09:12
Phi berechnen - Euler Funktion Beitragsarchiv 6 02.12.2004 07:38
mit PHP traffic berechnen oder schätzen PHP Tipps 2004 2 21.06.2004 12:59

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
schriftbreite berechnen, arial zeichenbreite, zeichenbreite arial, schriftbreite arial, arial schriftbreite, php schriftbreite berechnen, php schriftbreite, schriftbreite, http://www.php.de/php-tipps-2005-2/24535-schriftbreite-berechnen.html, php schriftgröße berechnen, arial breite, php zeichenbreite berechnen, breite von zeichen berechnen, zeichenbreite berechnen, schrift berechnen, schriftgröße berechnen, fpdf buchstabenabstand, font breite berechnen, breiteste ziffer, textgröße berechnen

Alle Zeitangaben in WEZ +2. Es ist jetzt 04:21 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.