X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FTemplate%2FLaTeX.pm;h=293db2e18c5bbb58cb495563026aa3c18134867d;hb=7520cd583a92860e2a33ee0b3155fd1695cc21bf;hp=d4b336b884f67c820ed7cad4910a4e6a98d381c3;hpb=80eceeda50a7c64673a6f3b41df4dbaa388db2da;p=kivitendo-erp.git diff --git a/SL/Template/LaTeX.pm b/SL/Template/LaTeX.pm index d4b336b88..293db2e18 100644 --- a/SL/Template/LaTeX.pm +++ b/SL/Template/LaTeX.pm @@ -83,6 +83,8 @@ sub _format_html { $content =~ s{ (?:\ |\s)+ }{ }gx; $content =~ s{ (?:\ |\s)+$ }{}gx; $content =~ s{ (?:
)+$ }{}gx; + $content =~ s{ |
    \s*
}{}igx; + $content =~ s{ (?:

\s*

\s* )+ \Z }{}imgx; my @parts = grep { $_ } map { if (substr($_, 0, 1) eq '<') { @@ -394,12 +396,16 @@ sub _embed_file_directive { my ($self, $file) = @_; # { source => $xmlfile, - # name => 'ZUGFeRD-invoice.xml', - # description => $::locale->text('ZUGFeRD invoice'), } + # name => 'factur-x.xml', + # description => $::locale->text('Factur-X/ZUGFeRD invoice'), } my $file_name = blessed($file->{source}) && $file->{source}->can('filename') ? $file->{source}->filename : "" . $file->{source}->filename; my $embed_name = $file->{name} // $file_name; $embed_name =~ s{.*/}{}; + + my $embed_name_ascii = $::locale->quote_special_chars('filenames', $embed_name); + $embed_name_ascii =~ s{[^a-z0-9!@#$%^&*(){}[\],.+'"=_-]+}{}gi; + my @options; my $add_opt = sub { @@ -408,10 +414,11 @@ sub _embed_file_directive { push @options, sprintf('%s={%s}', $name, $value); # TODO: escaping }; - $add_opt->('ucfilespec', $embed_name); - $add_opt->('desc', $file->{description}); - $add_opt->('afrelationship', $file->{relationship}); - $add_opt->('mimetype', $file->{mime_type}); + $add_opt->('filespec', $embed_name_ascii); + $add_opt->('ucfilespec', $embed_name); + $add_opt->('desc', $file->{description}); + $add_opt->('afrelationship', $file->{relationship}); + $add_opt->('mimetype', $file->{mime_type}); return sprintf('\embedfile[%s]{%s}', join(',', @options), $file_name); } @@ -420,7 +427,7 @@ sub _force_mandatory_packages { my ($self, @lines) = @_; my @new_lines; - my (%used_packages, $at_beginning_of_document); + my %used_packages; my @required_packages = qw(textcomp ulem); push @required_packages, 'embedfile' if $self->{pdf_a}; @@ -428,38 +435,30 @@ sub _force_mandatory_packages { if ($line =~ m/\\usepackage[^\{]*{(.*?)}/) { $used_packages{$1} = 1; - } elsif (($line =~ m/\\documentclass/) && $self->{pdf_a}) { - my $version = $self->{pdf_a}->{version} // '3a'; - my $meta = $self->{pdf_a}->{meta_data} // {}; - - push @new_lines, ( - "\\RequirePackage{filecontents}\n", - "\\begin{filecontents*}{\\jobname.xmpdata}\n", - ($meta->{title} ? sprintf("\\Title{%s}\n", $meta->{title}) : ""), - ($meta->{author} ? sprintf("\\Author{%s}\n", $meta->{author}) : ""), - ($meta->{language} ? sprintf("\\Language{%s}\n", $meta->{language}) : ""), - "\\end{filecontents*}\n", - $line, - "\\usepackage[a-${version},mathxmp]{pdfx}[2018/12/22]\n", - "\\usepackage[genericmode]{tagpdf}\n", - "\\tagpdfsetup{activate-all}\n", - "\\hypersetup{pdfstartview=}\n", - ); - - next; - } elsif ($line =~ m/\\begin\{document\}/) { - $at_beginning_of_document = 1; + if ($self->{pdf_a} && $self->{pdf_a}->{xmp}) { + my $version = $self->{pdf_a}->{version} // '3a'; + my $xmp_file_name = $self->{userspath} . "/pdfa.xmp"; + my $out = IO::File->new($xmp_file_name, ">:encoding(utf-8)") || croak "Error creating ${xmp_file_name}: $!"; + $out->print(Encode::encode('utf-8', $self->{pdf_a}->{xmp})); + $out->close; + + push @new_lines, ( + "\\usepackage[a-${version},mathxmp]{pdfx}[2018/12/22]\n", + "\\usepackage[genericmode]{tagpdf}\n", + "\\tagpdfsetup{activate-all}\n", + "\\hypersetup{pdfstartview=}\n", + ); + } + push @new_lines, map { "\\usepackage{$_}\n" } grep { !$used_packages{$_} } @required_packages; + push @new_lines, $line; + push @new_lines, map { $self->_embed_file_directive($_) } @{ $self->{pdf_attachments} // [] }; + + next; } push @new_lines, $line; - - if ($at_beginning_of_document) { - $at_beginning_of_document = 0; - - push @new_lines, map { $self->_embed_file_directive($_) } @{ $self->{pdf_attachments} // [] }; - } } return @new_lines; @@ -530,7 +529,7 @@ sub _texinputs_path { my $exe_dir = SL::System::Process::exe_dir(); $templates_path = $exe_dir . '/' . $templates_path unless $templates_path =~ m{^/}; - return join(':', grep({ $_ } ('.', $exe_dir . '/texmf', $templates_path, $ENV{TEXINPUTS})), ''); + return join(':', grep({ $_ } ('.', $exe_dir . '/texmf', $exe_dir . '/users', $templates_path, $ENV{TEXINPUTS})), ''); } sub convert_to_postscript { @@ -652,11 +651,12 @@ sub uses_temp_file { sub parse_and_create_pdf { my ($class, $template_file_name, %params) = @_; + my $userspath = delete($params{userspath}) || $::lx_office_conf{paths}->{userspath}; my $keep_temp = $::lx_office_conf{debug} && $::lx_office_conf{debug}->{keep_temp_files}; my ($tex_fh, $tex_file_name) = File::Temp::tempfile( 'kivitendo-printXXXXXX', SUFFIX => '.tex', - DIR => $::lx_office_conf{paths}->{userspath}, + DIR => $userspath, UNLINK => $keep_temp ? 0 : 1,, ); @@ -665,7 +665,7 @@ sub parse_and_create_pdf { my $local_form = Form->new(''); $local_form->{cwd} = $old_wd; $local_form->{IN} = $template_file_name; - $local_form->{tmpdir} = $::lx_office_conf{paths}->{userspath}; + $local_form->{tmpdir} = $userspath; $local_form->{tmpfile} = $tex_file_name; $local_form->{templates} = SL::DB::Default->get->templates; @@ -676,7 +676,7 @@ sub parse_and_create_pdf { my $error; eval { - my $template = SL::Template::LaTeX->new(file_name => $template_file_name, form => $local_form); + my $template = SL::Template::LaTeX->new(file_name => $template_file_name, form => $local_form, userspath => $userspath); my $result = $template->parse($tex_fh) && $template->convert_to_pdf; die $template->{error} unless $result;