foreach my $local_printer_id ($printer_id, $copy_printer_id) {
next unless $local_printer_id;
- my $printer = SL::DB::Printer->new(id => $local_printer_id)->load;
- my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($printer->printer_command);
- if (!open $out, '|-', $command) {
- push @{ $data->{print_errors} }, { message => $::locale->text('Could not execute printer command: #1', $!) };
- $job_obj->update_attributes(data_as_hash => $data);
- return;
- }
- binmode $out;
- print $out $self->{merged_pdf};
- close $out;
+ SL::DB::Printer
+ ->new(id => $local_printer_id)
+ ->load
+ ->print_document(content => $self->{merged_pdf});
}
}
}
my $printer = SL::DB::Printer->new(id => $params{printer_id})->load;
- my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($printer->printer_command);
-
- open my $out, '|-', $command or die $!;
- binmode $out;
- print $out $merged_pdf;
- close $out;
+ $printer->print_document(content => $merged_pdf);
flash_later('info', t8('The documents have been sent to the printer \'#1\'.', $printer->printer_description));
return $self->redirect_to(action => 'list_invoices', printer_id => $params{printer_id});
} elsif ($media eq 'printer') {
# printer
my $printer_id = $::form->{print_options}->{printer_id};
- my $printer;
- $printer = SL::DB::Printer->new(id => $printer_id)->load if $printer_id;
- if (!$printer) {
- return $self->js->flash('error', t8('Printer not found.'))->render;
- }
-
- my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($printer->printer_command);
-
- for my $i (1 .. $copies) {
- open my $out, '|-', $command or die $!;
- binmode $out;
- print $out $pdf;
- close $out;
- }
+ SL::DB::Printer->new(id => $printer_id)->load->print_document(
+ copies => $copies,
+ content => $pdf,
+ );
$self->js->flash('info', t8('The PDF has been printed'));
}
use strict;
+use Carp;
+
use SL::DB::MetaSetup::Printer;
use SL::DB::Manager::Printer;
use SL::DB::Helper::Util;
return @errors;
}
+sub print_document {
+ my ($self, %params) = @_;
+
+ croak "Need either a 'content' or a 'file_name' parameter" if !defined($params{content}) && !$params{file_name};
+
+ my $copies = $params{copies} || 1;
+ my $command = SL::Template::create(type => 'ShellCommand', form => Form->new(''))->parse($self->printer_command);
+ my $content = $params{content} // scalar(File::Slurp::read_file($params{file_name}));
+
+ for (1..$copies) {
+ open my $out, '|-', $command or die $!;
+ binmode $out;
+ print $out $content;
+ close $out;
+ }
+}
+
1;
+__END__
+
+=pod
+
+=encoding utf8
+
+=head1 NAME
+
+SL::DB::Printer - Rose model for database table printers
+
+=head1 SYNOPSIS
+
+ my $printer = SL::DB::Printer->new(id => 4711)->load;
+ $printer->print_document(
+ copies => 2,
+ file_name => '/path/to/file.pdf',
+ );
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item C<print_document %params>
+
+Prints a document by spawning the external command stored in
+C<$self-E<gt>printer_command> and sending content to it.
+
+The caller must provide either the content to send to the printer
+(parameter C<content>) or a name to a file whose content is sent
+verbatim (parameter C<file_name>).
+
+An optional parameter C<copies> can be given to specify the number of
+copies to print. This is done by invoking the print command multiple
+times. The number of copies defaults to 1.
+
+=back
+
+=head1 BUGS
+
+Nothing here yet.
+
+=head1 AUTHOR
+
+Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
+
+=cut