[latex3-commits] [git/LaTeX3-latex3-pdfresources] verify: rework outputintent interface, unfinished! needs testing (31de3c5)
Ulrike Fischer
fischer at troubleshooting-tex.de
Thu Feb 18 19:16:20 CET 2021
Repository : https://github.com/latex3/pdfresources
On branch : verify
Link : https://github.com/latex3/pdfresources/commit/31de3c566f8a3f12febca9cd8cb7241726d70ad1
>---------------------------------------------------------------
commit 31de3c566f8a3f12febca9cd8cb7241726d70ad1
Author: Ulrike Fischer <fischer at troubleshooting-tex.de>
Date: Thu Feb 18 19:16:20 2021 +0100
rework outputintent interface, unfinished! needs testing
>---------------------------------------------------------------
31de3c566f8a3f12febca9cd8cb7241726d70ad1
l3pdfmeta.dtx | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 184 insertions(+), 12 deletions(-)
diff --git a/l3pdfmeta.dtx b/l3pdfmeta.dtx
index 2b31213..69707e2 100644
--- a/l3pdfmeta.dtx
+++ b/l3pdfmeta.dtx
@@ -225,6 +225,79 @@
% |/A| dictionary of an action. The check should supply the user
% subtype without slash e.g. as |GoTo| (pass) or |Movie| (failure).
% \end{description}
+%
+% \subsection{Colorprofiles and OutputIntent}
+%
+% The pdf/A standards require that a color profile is embedded and
+% referenced in the catalog in the |/OutputIntent| array.
+%
+% The problem is that the pdf/A standards also require, that if the PDF has more then
+% one entry in the |/OutputIntent| array (which is allowed), their /DestOutputProfile
+% should all reference the same color profile\footnote{see rule 6.2.2-2 at
+% \url{https://docs.verapdf.org/validation/pdfa-part1/}}.
+%
+% Enforcing this fully is impossible as it is difficult to inspect
+% and remove entries from the |/OutputIntent| added manually by users or packages with
+% |\pdfmanagement_add:nnn {Catalog}{OutputIntents}{|\meta{object reference}|}|.
+%
+% So we provide a dedicated interface to avoid the need of manual
+% user settings and allow the code to handle the requirements of the standard.
+%
+% The interface has to handle the following points:
+% \begin{itemize}
+% \item We have to assume that some documents wants to add more than one OutputIntent with
+% varying subtypes.
+% \item While currently only |/GTS_PDFA1| and |/GTS_PDFX| seem to
+% be relevant, we have to assume that the list of subtypes is open.
+% \item But we can imho assume that every subtype is there at most once.
+% \item The referenced color profile can be used also other means, e.g. an /ICCBased
+% color space. We must avoid that it is embedded twice in this case.
+% \item While we can predeclare some standard icc-profiles, an interface to
+% setup more is needed.
+% \end{itemize}
+%
+% The interface looks like this
+%
+% \begin{verbatim}
+% \DeclareDocumentMetadata
+% {
+% %other options
+% colorprofiles=
+% {
+% A = sRGB.icc, %or a or longer GTS_PDFA1 = sRGB.icc
+% X = FOGRA39L_coated.icc, % or x or longer GTS_PDFX
+% ISO_PDFE1 = whatever.icc
+% }
+%
+% }
+% \end{verbatim}
+%
+% |sRGB.icc| and |FOGRA39L_coated.icc| (from the \pkg{colorprofiles} package
+% are predefined and will work directly. |whatever.icc| will need special setup in
+% the document preamble (how exactly will be decided later).
+%
+% If a standard is detected or set which requires
+% that all |/DestOutputProfile| reference the same
+% color profile, the setting is changed to the equivalent of
+%
+% \begin{verbatim}
+% \DeclareDocumentMetadata
+% {
+% %other options
+% colorprofiles=
+% {
+% A = sRGB.icc, %or longer GTS_PDFA1 = sRGB.icc
+% X = sRGB.icc,
+% ISO_PDFE1 = sRGB.icc
+% }
+%
+% }
+% \end{verbatim}
+%
+% The pdf/A standards will use |A=sRGB.icc| by default, so this doesn't
+% need to be declared explicitly.
+%
+%
% \end{documentation}
%
% \begin{implementation}
@@ -448,11 +521,12 @@
%===============
% to be continued https://docs.verapdf.org/validation/pdfa-part1/
% - Outputintent/colorprofiles requirements
- % an outputintent should be loaded. There are more requirements
- % but these are not tested
- ,outputintent =
- ,outputintent_subtype = {GTS_PDFA1}
- ,outputintent_profile = {sRGB.icc}
+ % an outputintent should be loaded.
+ ,outputintent =
+ % its subtype:
+ ,outputintent_subtype = {GTS_PDFA1}
+ % only one (A) profile
+ ,outputintent_unique =
% - no Alternates key in image dictionaries
% - no OPI, Ref, Subtype2 with PS key in xobjects
% - Interpolate = false in images
@@ -494,6 +568,78 @@
% and an outputintent need for PDF/A for now. There will be need to extend it later,
% so we try for enough generality.
%
+% Adding a profile and an intent is technically easy:
+% \begin{enumerate}
+% \item Embed the profile as stream with
+% \begin{verbatim}
+% \pdf_object_unnamed_write:nn{fstream} {{/N~4}{XXX.icc}}
+% \end{verbatim}
+% \item Write a |/OutputIntent| dictionary for this
+% \begin{verbatim}
+% \pdf_object_unnamed_write:nx {dict}
+% {
+% /Type /OutputIntent
+% /S /GTS_PDFA1 % or GTS_PDFX or ISO_PDFE1 or ...
+% /DestOutputProfile \pdf_object_ref_last: % ref the color profile
+% /OutputConditionIdentifier ...
+% ... %more info
+% }
+% \end{verbatim}
+% \item Reference the dictionary in the catalog:
+% \begin{verbatim}
+% \pdfmanagement_add:nnx {Catalog}{OutputIntents}{\pdf_object_ref_last:}
+% \end{verbatim}
+%
+% But we need to do a bit more work, to get the interface right.
+% The object for the profile should be named, to allow l3color to reuse it
+% if needed. And we need container to store the profiles, to handle the
+% standard requirements.
+%
+% \begin{variable}{\g_@@_outputintents_prop}
+% This variable will hold the profiles for the subtypes. We assume
+% that every subtype has only only color profile.
+% \begin{macrocode}
+\prop_new:N \g_@@_outputintents_prop
+% \end{macrocode}
+% \end{variable}
+% Some keys to fill the property.
+% \begin{macrocode}
+\keys_define:nn { document / metadata }
+ {
+ colorprofiles .code:n =
+ {
+ \keys_set:nn { document / metadata / colorprofiles }{#1}
+ }
+ }
+\keys_define:nn { document / metadata / colorprofiles }
+ {
+ ,A .code:n =
+ {
+ \prop_gput:Nnn \g_@@_outputintents_prop
+ { GTS_PDFA1 } {#1}
+ }
+ ,a .code:n =
+ {
+ \prop_gput:Nnn \g_@@_outputintents_prop
+ { GTS_PDFA1 } {#1}
+ }
+ X .code:n =
+ {
+ \prop_gput:Nnn \g_@@_outputintents_prop
+ { GTS_PDFX } {#1}
+ }
+ x .code:n =
+ {
+ \prop_gput:Nnn \g_@@_outputintents_prop
+ { GTS_PDFX } {#1}
+ }
+ unknown .code:n =
+ {
+ \prop_gput:Nxn \g_@@_outputintents_prop
+ { \l_keys_key_str } {#1}
+ }
+ }
+% \end{macrocode}
% \begin{macrocode}
\pdfdict_new:n {l_pdfmeta/outputintent}
\pdfdict_put:nnn {l_pdfmeta/outputintent}
@@ -555,15 +701,41 @@
\AddToHook{begindocument/end}
{
- \prop_if_in:NnT\g_@@_standard_prop {outputintent}
+ \pdfmeta_standard_verify:nF {outputintent}
+ {
+ \exp_args:NNx
+ \prop_if_in:NnF \g_@@_outputintents_prop
+ {
+ \pdfmeta_standard_item:n {outputintent_subtype}
+ }
+ {
+ \prop_gput:Nxn { \pdfmeta_standard_item:n {outputintent_subtype} }{sRGB.icc}
+ }
+ }
+ \pdfmeta_standard_verify:nTF {outputintent_unique}
+ {
+ \prop_map_inline:Nn \g_@@_outputintents_prop
+ {
+ \exp_args:Nx
+ \@@_embed_colorprofile:n
+ {\prop_item:Nn \g_@@_outputintents_prop {#2}}
+ \exp_args:Nxx
+ \@@_write_outputintent:nn
+ {#2}
+ {#1}
+ }
+ }
{
\exp_args:Nx
- \@@_embed_colorprofile:n
- {\prop_item:Nn \g_@@_standard_prop {outputintent_profile}}
- \exp_args:Nxx
- \@@_write_outputintent:nn
- {\prop_item:Nn \g_@@_standard_prop {outputintent_profile}}
- {\prop_item:Nn \g_@@_standard_prop {outputintent_subtype}}
+ \@@_embed_colorprofile:n
+ {\prop_item:Nn \g_@@_outputintents_prop {GTS_PDFA1}}
+ \prop_map_inline:Nn \g_@@_outputintents_prop
+ {
+ \exp_args:Nxx
+ \@@_write_outputintent:nn
+ {#2}
+ {GTS_PDFA1}
+ }
}
}
% \end{macrocode}
More information about the latex3-commits
mailing list.