Drucken auf einen Netzwerkdrucker mit Perl

Drucken aus der Linux-Konsole auf A4-Seiten in Hoch- oder Querformat

Auf Linux-Systemen gibt es keinen Carriage Return (CR), sondern nur Zeilenumbrüche, Line-Feeds. Beim Drucken auf einen Netzwerkdrucker, der über IO::Socket recht einfach anzusprechen ist, müssen daher die CRs in den Druckauftrag mitgegeben werden.

Über ein weiteres CPAN-Modul PCL::Simple kann der Ausdruck perfekt formatiert werden, mit Angaben zur Zeilenanzahl pro Seite und Anzahl der Zeichen je Zeile wird die Schriftgröße automatisch angepasst. Außerdem ist Hoch- oder Querformat möglich, weitere Optionen siehe Modul. Script und Anwendung siehe untenstehend:

#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket;
use PCL::Simple qw( PCL_pre PCL_post );
use Getopt::Std;

# Defaults
my %opts = (
    o => 'portrait',  # landscape portrait
    w => 132,         # width, characters per line
    l => 66,          # lines per page
);

getopts('o:w:l:', \%opts);

# Handle für den Printer
my $sock = IO::Socket::INET->new('druckername:9100') or die "Kein socket";

# dem Drucker mitteilen, was zu machen ist
print $sock PCL_pre(
    -w   => $opts{w} || 132,
    -lpp => $opts{l} || 66,
    -ms  => 'a4',
    -o   => $opts{o} || 'portrait',
);

# zur Ausgabe auf den Printer müssen CRs eingebaut werden
binmode STDIN;
while( my $lin = <STDIN> ){
    $lin =~ s/\n/\r\n/g;  # add carriage return
    print $sock $lin;
}

print $sock PCL_post(); # Trailer

# Usage
# command | printer -o landscape -l 70 -w 140
# Symlink /usr/bin/printer auf das Script

Anbieter: nmq​rstx-18­@yahoo.de, die Seite verwendet funktionsbedingt einen Session-Cookie und ist Bestandteil meines nach modernen Aspekten in Perl entwickelten Frameworks.