Montag, 6. Juli 2009PDF-Erstellung mit perl
im Moment schreibe ich gerade eine webbasierte Auftragsverwaltung (natürlich in Perl). Unter anderem möchte ich Angebote und Rechnungen automatisiert als PDF erstellen lassen. Zur Umsetzung verwende ich das Modul PDF::Create. Benötigt so gut wie keine Einarbeitungszeit und ist für meine Zwecke vollkommen ausreichend. Damit die Angebote auch
halbwegs etwas gleichsehen, hab ich mir untenstehendes Template gechrieben. Vielleicht auch für den ein oder anderen ganz nützlich...
#!/usr/bin/perl
# use CGI;
use PDF::Create;
# fuer die Verwendung als CGI
#print CGI::header( -type => 'application/x-pdf', -attachment => 'an_xxx.pdf' );
my $pdf = new PDF::Create('filename' => 'Angebot.pdf',
'Version' => 1.2,
'PageMode' => 'UseNone',
'Author' => 'IT-SHIRT.AT',
'Title' => 'AN_XXX',
);
my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('a4')); # (A4 max is 595/842)
# Fonts vorbereiten
my $f1 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica');
my $f2 = $pdf->font('Subtype' => 'Type1',
'Encoding' => 'WinAnsiEncoding',
'BaseFont' => 'Helvetica-Bold');
# neue Seite anlegen
my $page = $root->new_page;
# Logo einfuegen
my $img2 = $pdf->image('header.jpg');
$page->image('image'=>$img2, 'yalign' => 1, 'xscale'=>0.55,'yscale'=>0.55, 'xpos'=>60,'ypos'=>802);
# Schriftfarbe fuer Rahmen und Adresse auf grau setzen
$page->setrgbcolorstroke( 0.72, 0.72, 0.72); # Farbraum RGB 0-1
# Rahmen anlegen
$page->line(60, 570, 60, 270);
$page->line(90, 570, 90, 270);
$page->line(360, 570, 360, 270);
$page->line(395, 570, 395, 270);
$page->line(470, 570, 470, 270);
$page->line(545, 570, 545, 270);
$page->line(60, 270, 545, 270);
$page->line(360, 245, 360, 205);
$page->line(545, 245, 545, 205);
$page->line(360, 205, 545, 205);
$page->set_width(17);
$page->line(60, 570, 545, 570);
$page->line(360, 245, 545, 245);
# Header text
$page->stringr($f1, 8, 545, 787, "IT-SHIRT.AT, INH. MAG. BERNHARD MASSONG");
$page->stringr($f1, 8, 545, 777, "A-1160 WIEN HABERLGASSE 47/2/1-2");
$page->stringr($f1, 8, 545, 767, "TELEFON: +43-650-46-36-266");
$page->stringr($f1, 8, 545, 757, "WWW.IT-SHIRT.AT, EMAIL: OFFICE@IT-SHIRT.AT");
# Schriftfarbe auf schwarz
$page->setrgbcolor( 0, 0, 0);
# Angebotstext
$page->stringc($f2, 10, 75, 567, "Pos.");
$page->stringc($f2, 10, 195, 567, "Artikelbezeichnung");
$page->stringc($f2, 10, 377, 567, "Menge");
$page->stringc($f2, 10, 432, 567, "Einzelpreis");
$page->stringc($f2, 10, 507, 567, "Gesamtpreis");
$page->stringl($f1, 10, 72, 550, "1");
$page->stringl($f1, 10, 93, 550, "Exact 190 mit Flexdruck");
$page->stringr($f1, 10, 390, 550, "3");
$page->stringr($f1, 10, 465, 550, "5 €");
$page->stringr($f1, 10, 540, 550, "15 €");
$page->stringl($f2, 10, 363, 241, "Gesamtsumme");
$page->stringl($f1, 10, 363, 224, "davon 20% Ust.");
$page->stringl($f1, 10, 363, 210, "Nettosumme");
$page->stringl($f1, 8, 375, 700, "Angebotsnummer:");
$page->stringl($f1, 8, 375, 687, "Datum:");
$page->stringl($f1, 8, 375, 674, "Kundennummer:");
$page->stringl($f1, 8, 375, 655, "Unsere UID:");
$page->stringl($f1, 8, 375, 641, "Ihre UID:");
$page->stringr($f1, 8, 545, 700, "AN 0815");
$page->stringr($f1, 8, 545, 687, "01.01.2009");
$page->stringr($f1, 8, 545, 674, "");
$page->stringr($f1, 8, 545, 655, "ATU 63841828");
$page->stringr($f1, 8, 545, 641, "");
# Kundendaten
$page->stringl($f1, 10, 60, 700, "Kundenname");
$page->stringl($f1, 10, 60, 685, "Strasse");
$page->stringl($f1, 10, 60, 670, "PLZ");
$page->stringl($f2, 14, 60, 620, "Angebot");
$page->stringl($f1, 7, 60, 195, "Die Ware bleibt bis zur vollständigen Bezahlung unser Eigentum.");
$page->stringl($f1, 10, 60, 165, "Zahlungskonditionen:");
$page->stringl($f1, 10, 60, 150, "Zahlungsart:");
$page->stringl($f1, 10, 60, 135, "Versandart:");
$page->stringl($f1, 10, 60, 120, "Liefertermin:");
$page->stringl($f1, 10, 160, 165, "nach Vereinbarung");
$page->stringl($f1, 10, 160, 150, "nach Vereinbarung");
$page->stringl($f1, 10, 160, 135, "nach Vereinbarung");
$page->stringl($f1, 10, 160, 120, "nach Vereinbarung");
$page->stringl($f1, 10, 60, 80, "Wir hoffen, dass Ihnen unser Angebot zusagt und freuen uns auf Ihren Auftrag!");
$page->stringc($f1, 8, 297, 25, "BANKVERBINDUNG: BANK AUSTRIA, KONTONR.: XXX.XXX.XXX, BLZ: 12000, IBAN: XXXXXXXXXXXX XXXX, BIC: XXXXXX");
# Pdf schliessen
$pdf->close;
Trackbacks
Trackback-URL für diesen Eintrag
Keine Trackbacks
Kommentare
Ansicht der Kommentare:
(Linear | Verschachtelt)
Hallo,
Tolle Anleitung. Ich habe das mal als 'CGI' probiert. Die PDF-Datei wird zwar im Verzeichnis des Servers korrekt generiert und gespeichert, aber es wird ein 0Byte- Dokument übertragen! Woran kann das liegen? MfG SNR
Hallo,
ich vermute mal, dass es am fehlenden Bild liegt (Zeile 33 und 34). Kommentiere diese beiden Zeilen mal aus. hth
Hallo,
Danke für die Antwort. Aber wenn das Bild fehlt, dann wird die PDF-Datei nicht korrekt erstellt. Ich habe deshalb die beiden Zeilen bereits auskommentiert und eine eigene Vorlage erstellt. Es werden in beiden Fällen die PDF-Dateien korrekt erstellt (lassen sich Öffnen und mit "%%EOF" abgeschlossen. Wenn "nur" das Bild fehlt, dann ist die Datei unvollständig und wird nur bis zu der Stelle, an der das Bild eingebunden wird, erstellt. Es muss also an irgendetwas anderem liegen. MfG SNR
was hast du denn gegenüber obigem Code abgeändert? Ist Zeile 7 ein- oder auskommentiert? Poste mal deinen Code. Kann das Problem leider nicht nachvollziehen.
Hallo,
Ich habe erstmal mit der obigen Vorlage angefangen und erhalte das bereits eine leere Datei. Das PDF- Dokument "ANgebot.pdf" wird aber im CGI- Verzeichnis auf dem Server abgespeichert: ######################################## cgi-bin # l | grep ngebot -rw-r--r-- 1 wwwrun www 3509 28. Apr 16:24 Angebot.pdf -rwxr-xr-x 1 wwwrun www 4133 21. Apr 12:50 angebot.pl* ######################################## Der dazugehörige Code sieht so aus: --------------------------------------- Dorsy1:/srv/www/htdocs/cgi-bin/ # cat angebot.pl #!/usr/bin/perl use CGI; use PDF::Create; # fuer die Verwendung als CGI print CGI::header( -type => 'application/x-pdf', -attachment => 'an_xxx.pdf' ); my $pdf = new PDF::Create('filename' => 'Angebot.pdf', 'Version' => 1.2, 'PageMode' => 'UseNone', 'Author' => 'IT-SHIRT.AT', 'Title' => 'AN_XXX', ); my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('a4')); # (A4 max is 595/842) # Fonts vorbereiten my $f1 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica'); my $f2 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold'); # neue Seite anlegen my $page = $root->new_page; # Logo einfuegen #my $img2 = $pdf->image('header.jpg'); #$page->image('image'=>$img2, 'yalign' => 1, 'xscale'=>0.55,'yscale'=>0.55, 'xpos'=>60,'ypos'=>802); # Schriftfarbe fuer Rahmen und Adresse auf grau setzen $page->setrgbcolorstroke( 0.72, 0.72, 0.72); # Farbraum RGB 0-1 # Rahmen anlegen $page->line(60, 570, 60, 270); $page->line(90, 570, 90, 270); $page->line(360, 570, 360, 270); $page->line(395, 570, 395, 270); $page->line(470, 570, 470, 270); $page->line(545, 570, 545, 270); $page->line(60, 270, 545, 270); $page->line(360, 245, 360, 205); $page->line(545, 245, 545, 205); $page->line(360, 205, 545, 205); $page->set_width(17); $page->line(60, 570, 545, 570); $page->line(360, 245, 545, 245); # Header text $page->stringr($f1, 8, 545, 787, "IT-SHIRT.AT, INH. MAG. BERNHARD MASSONG"); $page->stringr($f1, 8, 545, 777, "A-1160 WIEN HABERLGASSE 47/2/1-2"); $page->stringr($f1, 8, 545, 767, "TELEFON: +43-650-46-36-266"); $page->stringr($f1, 8, 545, 757, "WWW.IT-SHIRT.AT, EMAIL: OFFICE@IT-SHIRT.AT"); # Schriftfarbe auf schwarz $page->setrgbcolor( 0, 0, 0); # Angebotstext $page->stringc($f2, 10, 75, 567, "Pos."); $page->stringc($f2, 10, 195, 567, "Artikelbezeichnung"); $page->stringc($f2, 10, 377, 567, "Menge"); $page->stringc($f2, 10, 432, 567, "Einzelpreis"); $page->stringc($f2, 10, 507, 567, "Gesamtpreis"); $page->stringl($f1, 10, 72, 550, "1"); $page->stringl($f1, 10, 93, 550, "Exact 190 mit Flexdruck"); $page->stringr($f1, 10, 390, 550, "3"); $page->stringr($f1, 10, 465, 550, "5 \u20ac"); $page->stringr($f1, 10, 540, 550, "15 \u20ac"); $page->stringl($f2, 10, 363, 241, "Gesamtsumme"); $page->stringl($f1, 10, 363, 224, "davon 20% Ust."); $page->stringl($f1, 10, 363, 210, "Nettosumme"); $page->stringl($f1, 8, 375, 700, "Angebotsnummer:"); $page->stringl($f1, 8, 375, 687, "Datum:"); $page->stringl($f1, 8, 375, 674, "Kundennummer:"); $page->stringl($f1, 8, 375, 655, "Unsere UID:"); $page->stringl($f1, 8, 375, 641, "Ihre UID:"); $page->stringr($f1, 8, 545, 700, "AN 0815"); $page->stringr($f1, 8, 545, 687, "01.01.2009"); $page->stringr($f1, 8, 545, 674, ""); $page->stringr($f1, 8, 545, 655, "ATU 63841828"); $page->stringr($f1, 8, 545, 641, ""); # Kundendaten $page->stringl($f1, 10, 60, 700, "Kundenname"); $page->stringl($f1, 10, 60, 685, "Strasse"); $page->stringl($f1, 10, 60, 670, "PLZ"); $page->stringl($f2, 14, 60, 620, "Angebot"); $page->stringl($f1, 7, 60, 195, "Die Ware bleibt bis zur vollst�ndigen Bezahlung unser Eigentum."); $page->stringl($f1, 10, 60, 165, "Zahlungskonditionen:"); $page->stringl($f1, 10, 60, 150, "Zahlungsart:"); $page->stringl($f1, 10, 60, 135, "Versandart:"); $page->stringl($f1, 10, 60, 120, "Liefertermin:"); $page->stringl($f1, 10, 160, 165, "nach Vereinbarung"); $page->stringl($f1, 10, 160, 150, "nach Vereinbarung"); $page->stringl($f1, 10, 160, 135, "nach Vereinbarung"); $page->stringl($f1, 10, 160, 120, "nach Vereinbarung"); $page->stringl($f1, 10, 60, 80, "Wir hoffen, dass Ihnen unser Angebot zusagt und freuen uns auf Ihren Auftrag!"); $page->stringc($f1, 8, 297, 25, "BANKVERBINDUNG: BANK AUSTRIA, KONTONR.: 768.145.963, BLZ: 12000, IBAN: AT39120000076814 5963, BIC: BKAUATWW"); # Pdf schliessen $pdf->close; --------------------------------------- Meine Vermutung ist, dass der Server event. eine spezielle Config- Option benötigt, damit er DAten versendet? Aber welche? das Senden der Header usw. habe ich bereits überprüft und diese sind auch aktiviert. MfG SNR
jetzt ist alles klar:
für die direkte Ausgabe musst du als Filename '-' für stdout verwenden, also so: my $pdf = new PDF::Create('filename' => '-', 'Version' => 1.2, 'PageMode' => 'UseNone', 'Author' => 'IT-SHIRT.AT', 'Title' => 'AN_XXX', ); siehe auch http://search.cpan.org/~markusb/PDF-Create-1.05/lib/PDF/Create.pm Alternativ könntest du auch print CGI::header( -type => 'application/x-pdf', -attachment => 'an_xxx.pdf' ); weglassen, und das File lokal in ein Verzeichnis abspeichern und dann einen Link darauf setzen...
Danke, das war es! Kleine Ursache, große Wirkung!
MfG SNR |
SucheThat rocksKategorienBlog abonnierenVerwaltung des Blogs |