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);
}
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};
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;