Leser: 18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
my %tabelle; print "Ergebnis:\n" . &maketab2pdf (\%tabelle) . "\n"; sub maketab2pdf { use PDF::Create; my $output = ''; close (STDOUT); open (STDOUT, '>', \$output); my $pdf = new PDF::Create ( 'filename' => '-', 'Version' => 1.2, 'Author' => 'unbekannnt', 'Title' => 'Beispiel', 'CreationDate' => [ localtime ], ); my $root = $pdf -> new_page ('MediaBox' => $pdf -> get_page_size ('A4')); #[PDF Erzeugung....gekürzt] return $output; }
2009-12-26T17:31:12 GwenDragonPDF-Create gibt nur an Dateihandles aus, so steht es in der Doku.
Ausgabe an Puffervariable ist nicht vorgesehen.
2009-12-26T18:07:34 havi
QuoteSince v5.8.0, perl has built using PerlIO by default. Unless you've changed this (i.e. Configure -Uuseperlio), you can open file handles to "in memory" files held in Perl scalars via:
1. open($fh, '>', \$variable) || ..
Though if you try to re-open STDOUT or STDERR as an "in memory" file, you have to close it first:
1. close STDOUT;
2. open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl -w use strict; use diagnostics; use warnings; my $output; open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; #open STDOUT, '>', "foo.out" or die "Can't redirect STDOUT: $!"; open STDOUT, '>',\$output or die "Can't redirect STDOUT: $!"; print "stdout 1\n"; open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!"; print "stdout 2\n"; print "\$output = \'$output\'\n";
1
2
3
Uncaught exception from user code:
Can't redirect STDOUT: Bad file descriptor at stdout.pl line 9.
at stdout.pl line 9
1
2
3
4
5
6
7
8
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
(with 7 registered patches, see perl -V for more detail)
Copyright 1987-2005, Larry Wall
Binary build 813 [148120] provided by ActiveState http://www.ActiveState.com
ActiveState is a division of Sophos.
Built Jun 6 2005 13:36:37
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#!/usr/bin/perl -w use strict; use diagnostics; use warnings; my $output; open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!"; close STDOUT; open STDOUT, '>',\$output or die "Can't redirect STDOUT: $!"; print "stdout 1\n"; open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!"; print "stdout 2\n"; print "\$output = \'$output\'\n";
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
#
# Erzeugt aus einer als Hash übergebenen Tabelle ein DIN A4 PDF
#
# Aufbau der zu übergebenden Tabelle:
# [xxx] in eckigen Klammern sind Variablen, ohne eckige Klammern sind Konstanten
#
# $tabelle{[zeile]}{[spalte]} = [inhalt]
#
# Zusätzlich können folgende Parameter nach Wunsch optional angegeben werden:
# ===========================================================================
# $tabelle{log} = [pfad/datei] # Dateipfad und -name für ein Logfile (wenn nicht angegeben, wird kein Logfile erzeugt)
# $tabelle{author} = [name] # Angabe des 'Authors' in den Header-Infos
# $tabelle{title} = [text] # Angabe des 'Title' in den Header-Infos
# $tabelle{randlinks} = [pixel] # Für einen geeigneten Lochungsrand ist 40 empfehlenswert
# $tabelle{randrechts} = [pixel] # Für einen ansehnliches Bild ist 15 empfehlenswert
# $tabelle{cellpadding} = [pixel] # Innenabstand des Zelleninhalts zum Zellenrand
# $tabelle{kopflinks} = [inhalt] # Überschrift links oben
# $tabelle{kopfrechts} = [inhalt] # Überschrift rechts oben
# $tabelle{stretchhor} = [0|1] # Horizontale Streckung auf max. Seitenbreite, wenn Inhalt schmal 0=nein, 1=ja
# $tabelle{align[spalte]} = [center|right] # Gibt an, ob die Spalte zentriert oder rechtsbündig sein soll, Voreinstellung ist linksbündig
#
# Aufruf: my ($seiten,$pdf) = &maketab2pdf (\%tabelle);
# =======
#
# Rückgabe:
# =========
# Array mit zwei Werten: [0] = Anzahl Seiten wenn Wert auf Regex /^\d+$/ matcht; Fehlermeldung wenn nicht
# [1] = Das PDF als String, wenn kein Fehler aufgetreten ist, siehe Beispiel unten
#
# Beispiel:
# =========
# my %tabelle;
# $tabelle{1}{1} = '1.'; $tabelle{1}{2} = 'Montag'; $tabelle{1}{3} = '12:45'; $tabelle{1}{4} = '15:45';
# $tabelle{align1} = 'right';
# $tabelle{align3} = 'center';
# $tabelle{align4} = 'center';
# my ($seiten,$pdf) = &maketab2pdf (\%tabelle);
# if ($seiten =~ /^\d+$/) { print "PDF mit $seiten Seiten:\n$pdf\n"; }
# else { print "FEHLER: $seiten\n"; }
#
1 2 3 4 5 6 7 8 9 10 11 12 13
# Record-Hilfsfunktion sub recParams{ my $rec = shift; # {artnr, arttitle, anz, preis, xpreis} my $ypos = shift; # Hashref für den Return, Parameter für die Spalten my $params = { 1 => [9, 40, $ypos, "$rec->{arttitle}/$rec->{artnr}"], 2 => [9, 310, $ypos, $rec->{anz}, 'r'], 3 => [9, 400, $ypos, $rec->{preis}, 'r'], 4 => [9, 490, $ypos, $rec->{xpreis}, 'r'], }; return $params; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Tabelle mit der Bestellung, Table header my $linepos = 550; my $cols = recParams( { artnr => 'Artikelnummer', arttitle => 'Artikelbezeichnung', anz => 'Anzahl', preis => 'Einzelpreis '.pack("C", 128), # EURO xpreis => 'Summenpreis '.pack("C", 128), }, $linepos ); # nun alles in einer Schleife über die 4 Spalten foreach my $col(1,2,3,4){ $page->string($f1, @{$cols->{$col}}); } # damit ist ersteinmal der Tabellenheader erzeugt
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Tabelle der Rechnung erstellen foreach my $ord(@$order){ my $xpreis = $ord->{anz} * $ord->{preis}; $ord->{xpreis} = $xpreis; my $cols = recParams($ord, $linepos); # nun alles in einer Schleife über die 4 Spalten foreach my $col(1,2,3,4){ $page->string($f1, @{$cols->{$col}}); } $linepos -= 12; $sumpreis += $xpreis; }