Thread Vertikale Spaltenbeschriftung für table (HTML) (72 answers)
Opened by bianca at 2010-08-01 20:39

bianca
 2010-08-02 19:55
#140254 #140254
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Soooo, da hab ich mal was gebastelt und es funktioniert auch perfekt.

Habe nur noch eine Winzigkeit: Mir ist so als sei die Schriftfarbe im Image nicht so ganz richtig schwarz. Ist das eine optische Täuschung oder gehe ich im Script mit den Farben falsch um?
Wer mit testen möchte: Bitte über Webbrowser aufrufen.

Danke

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/perl -w
use strict;
use diagnostics;
use warnings;
use CGI;
use Fcntl qw (:DEFAULT :flock);

my $cgi = CGI -> new;
my %data = (
    'New York'      => 10,
    'Madrid'        => 25,
    'Venezuela'     => 35,
    'Berlin'        => 5,
);

my %env = (
    pfad_fonts              => -e '../../fonts' ? '../../fonts' : '.',
    prefix_temp_file        => 'tmp_',
    pfad_public_html        => '..',
    chmod_dateien_public    => $^O =~ /mswin/i ? 0666 : 0444,
);
$env{farbe}{font_norm}  = '#000000';

my %FORM = (
    ses => 'test123',
);

print $cgi -> header;
print $cgi -> start_html (
    -title      => 'Test Hochkantschrift',
    -BGCOLOR    => 'white',
);
foreach my $FONT ("$env{pfad_fonts}/dejavusans.ttf",undef) {
    my ($kopf,$zeile) = ('') x 2;
    foreach my $string (keys %data) {
        my $ret = hochkantschrift (
            $string,
            $FONT,
            10,
            $env{farbe}{font_norm},
            "$env{prefix_temp_file}$FORM{ses}_",
            $env{pfad_public_html},
            $env{chmod_dateien_public},
        );
        $kopf .= '<td style="vertical-align: bottom; text-align: center; color: ' . $env{farbe}{font_norm} . ';">';
        if (substr ($ret,0,1) eq "\x00") {
            $kopf .= '<img src="/' . substr ($ret,1) . '">';
        }
        else {
            $kopf .= $ret;
        }
        $kopf .= '</td>';
        $zeile .= "<td style=\"text-align: right; color: $env{farbe}{font_norm};\">$data{$string}</td>";
    }
    print <<HTML_TEIL;
<table>
    <tr><td>&nbsp;</td>$kopf</tr>
    <tr><td style="color: $env{farbe}{font_norm};">Temperatur</td>$zeile</tr>
</table>
<hr>
HTML_TEIL
}
print $cgi -> end_html;

sub hochkantschrift {
    #
    # Aufruf: my $ret = hochkantschrift ([text],[schriftartdatei],[schriftgröße],[schriftfarbe],[zielpfad],[prefixdatei],[chmod]);
    # [text]            = darzustellender Text
    # [schriftartdatei] = absoluter Pfad und Name zur Schriftartendatei
    # [schriftgröße]  = Größe der Schrift in Pixel
    # [schriftfarbe]    = Schriftfarbe in Hexadezimaler Schreibweise, z.B. #FFFFFF für weiß
    # [zielpfad]        = Pfad für die Grafikdateien
    # [prefixdatei]     = Prefix für Dateiname
    # [chmod]           = Berechtigungen für die neuen Dateien
    #
    # Gibt zurück:
    # entweder  "\x00IMAGENAME" = erstes Zeichen ein HEX 00 gefolgt von einem Dateinamen
    # oder      "HTMLCODE"      = HTML-Code (Image-Variante ist gescheitert)
    #
    my ($STRING,$FONT,$FONTSIZE,$FONTCOLOR,$PREFIXFILE,$DESTPATH,$CHMOD) = @_; 
    my $return = join ('<br>',split (//,$STRING));                                                              # Default, falls bei der andere Variante etwas schief geht
    return $return if !defined $FONT;
    eval "use Digest::MD5 qw (md5_hex); 1;" or return $return;
    my $dateiname = $PREFIXFILE . md5_hex (@_[0..3]) . '.png';                                                  # Daten im Dateinamen verschlüsseln für Caching der Grafiken
    if (-f "$DESTPATH/$dateiname") {                                                                            # aus Cache verfügbar?
        return "\x00$dateiname";
    }
    return if !-f $FONT;
    eval "use GD;use GD::Text;use GD::Text::Align;use GD::Graph::colour;use GD::Image;1;" or return $return;    # benötigte Module
    my $gd_text = GD::Text -> new () or return $return;
    $gd_text -> set_font ($FONT,$FONTSIZE) or return $return;
    $gd_text -> set_text ($STRING) or return $return;
    my ($w,$h) = $gd_text -> get ('width','height');
    my $im = GD::Image -> new ($h * 1.3,$w) or return $return;
    my @font_col = GD::Graph::colour::hex2rgb($FONTCOLOR) or return $return;                                    # Farbe konvertieren
    my @trans_col = @font_col;
    $trans_col[0] = ($trans_col[0] == 255 ? 0 : 255);                                                           # irgendeine andere Farbe für die Transparenz
    my $trans = $im -> colorAllocate (@trans_col);
    my $color = $im -> colorAllocate (@font_col);
    $im -> transparent ($trans);                                                                                # Transparenz einstellen
    my $align = GD::Text::Align -> new ($im);
    $align -> set_font ($FONT,$FONTSIZE);
    $align -> set_text ($STRING);
    $align -> draw ($h,$w,3.141592653589 / 2);
    sysopen (my $file,"$DESTPATH/$dateiname",O_WRONLY|O_EXCL|O_CREAT,$CHMOD) or return $return;
    binmode ($file) or return $return;
    print $file $im -> png or return $return;
    close $file or return $return;
    return "\x00$dateiname";
}


Edit: Code aktualisiert

Edit2: Die Schriftartdatei: http://www.file-upload.net/download-2719015/dejavu...

modedit Editiert von pq: Teilbaum
Last edited: 2012-02-29 21:10:47 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Vertikale Spaltenbeschriftung für table (HTML)