Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / DB / Printer.pm
index 046027b..9f76c00 100644 (file)
@@ -2,6 +2,8 @@ package SL::DB::Printer;
 
 use strict;
 
+use Carp;
+
 use SL::DB::MetaSetup::Printer;
 use SL::DB::Manager::Printer;
 use SL::DB::Helper::Util;
@@ -23,4 +25,67 @@ sub validate {
   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