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 {
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);
}
if ($line =~ m/\\usepackage[^\{]*{(.*?)}/) {
$used_packages{$1} = 1;
- } elsif (($line =~ m/\\documentclass/) && $self->{pdf_a}) {
- my $version = $self->{pdf_a}->{version} // '3a';
-
- if ($self->{pdf_a}->{xmp}) {
+ } elsif ($line =~ m/\\begin\{document\}/) {
+ 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;
- } else {
- 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",
+ "\\usepackage[a-${version},mathxmp]{pdfx}[2018/12/22]\n",
+ "\\usepackage[genericmode]{tagpdf}\n",
+ "\\tagpdfsetup{activate-all}\n",
+ "\\hypersetup{pdfstartview=}\n",
);
}
- push @new_lines, (
- $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\}/) {
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} // [] };