summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/pdfmanagement-testphase
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/pdfmanagement-testphase')
-rw-r--r--Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase.lua143
-rw-r--r--Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx1940
2 files changed, 2083 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase.lua b/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase.lua
new file mode 100644
index 00000000000..f6ae9306076
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase.lua
@@ -0,0 +1,143 @@
+--
+-- This is file `l3backend-testphase.lua',
+-- generated with the docstrip utility.
+--
+-- The original source files were:
+--
+-- l3backend-testphase.dtx (with options: `lua')
+--
+-- Copyright (C) 2019-2021 The LaTeX Project
+--
+-- It may be distributed and/or modified under the conditions of
+-- the LaTeX Project Public License (LPPL), either version 1.3c of
+-- this license or (at your option) any later version. The latest
+-- version of this license is in the file:
+--
+-- https://www.latex-project.org/lppl.txt
+--
+-- This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
+-- and all files in that bundle must be distributed together.
+--
+-- File: l3backend-testphase.dtx
+
+
+
+ltx= ltx or {}
+ltx.__pdf = ltx.__pdf or {}
+ltx.__pdf.Page = ltx.__pdf.Page or {}
+ltx.__pdf.Page.dflt = ltx.__pdf.Page.dflt or {}
+ltx.__pdf.Page.Resources = ltx.__pdf.Resources or {}
+ltx.__pdf.Page.Resources.Properties = ltx.__pdf.Page.Resources.Properties or {}
+ltx.__pdf.Page.Resources.List={"ExtGState","ColorSpace","Pattern","Shading"}
+ltx.__pdf.object = ltx.__pdf.object or {}
+
+ltx.pdf= ltx.pdf or {} -- for "public" functions
+
+local __pdf = ltx.__pdf
+local pdf = pdf
+
+local function __pdf_backend_Page_gput (name,value)
+ __pdf.Page.dflt[name]=value
+end
+
+local function __pdf_backend_Page_gremove (name)
+ __pdf.Page.dflt[name]=nil
+end
+
+local function __pdf_backend_Page_gclear ()
+ __pdf.Page.dflt={}
+end
+
+local function __pdf_backend_ThisPage_gput (page,name,value)
+ __pdf.Page[page] = __pdf.Page[page] or {}
+ __pdf.Page[page][name]=value
+end
+
+local function __pdf_backend_ThisPage_gpush (page)
+ local token=""
+ local t = {}
+ local tkeys= {}
+ for name,value in pairs(__pdf.Page.dflt) do
+ t[name]=value
+ end
+ if __pdf.Page[page] then
+ for name,value in pairs(__pdf.Page[page]) do
+ t[name] = value
+ end
+ end
+ -- sort the table to get reliable test files.
+ for name,value in pairs(t) do
+ table.insert(tkeys,name)
+ end
+ table.sort(tkeys)
+ for _,name in ipairs(tkeys) do
+ token = token .. "/"..name.." "..t[name]
+ end
+ return token
+end
+
+function ltx.__pdf.backend_ThisPage_gput (page,name,value) -- tex.count["g_shipout_readonly_int"]
+ __pdf_backend_ThisPage_gput (page,name,value)
+end
+
+function ltx.__pdf.backend_ThisPage_gpush (page)
+ pdf.setpageattributes(__pdf_backend_ThisPage_gpush (page))
+end
+
+function ltx.__pdf.backend_Page_gput (name,value)
+ __pdf_backend_Page_gput (name,value)
+end
+
+function ltx.__pdf.backend_Page_gremove (name)
+ __pdf_backend_Page_gremove (name)
+end
+
+function ltx.__pdf.backend_Page_gclear ()
+ __pdf_backend_Page_gclear ()
+end
+
+local Properties = ltx.__pdf.Page.Resources.Properties
+local ResourceList= ltx.__pdf.Page.Resources.List
+local function __pdf_backend_PageResources_gpush (page)
+ local token=""
+ if Properties[page] then
+-- we sort the table, so that the pdf test works
+ local t = {}
+ for name,value in pairs (Properties[page]) do
+ table.insert (t,name)
+ end
+ table.sort (t)
+ for _,name in ipairs(t) do
+ token = token .. "/"..name.." ".. Properties[page][name]
+ end
+ token = "/Properties <<"..token..">>"
+ end
+ for i,name in ipairs(ResourceList) do
+ if ltx.__pdf.Page.Resources[name] then
+ token = token .. "/"..name.." "..ltx.pdf.object_ref("Page/Resources/"..name)
+ end
+ end
+ return token
+end
+
+-- the function is public, as I probably need it in tagpdf too ...
+function ltx.pdf.Page_Resources_Properties_gput (page,name,value) -- tex.count["g_shipout_readonly_int"]
+ Properties[page] = Properties[page] or {}
+ Properties[page][name]=value
+ pdf.setpageresources(__pdf_backend_PageResources_gpush (page))
+end
+
+function ltx.pdf.Page_Resources_gpush(page)
+ pdf.setpageresources(__pdf_backend_PageResources_gpush (page))
+end
+
+function ltx.pdf.object_ref (objname)
+ if ltx.__pdf.object[objname] then
+ local ref= ltx.__pdf.object[objname]
+ return ref
+ else
+ return "false"
+ end
+end
+--
+-- End of File `l3backend-testphase.lua'.
diff --git a/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx b/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx
new file mode 100644
index 00000000000..66293c0401e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx
@@ -0,0 +1,1940 @@
+%%
+%% This is file `pdfmanagement-testphase.ltx',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% pdfmanagement-testphase.dtx (with options: `header')
+%% l3pdfdict.dtx (with options: `package')
+%% l3pdfmanagement.dtx (with options: `package')
+%% ltdocinit.dtx (with options: `package')
+%% l3pdfannot.dtx (with options: `package')
+%% l3pdfxform.dtx (with options: `package')
+%% l3pdfmeta.dtx (with options: `package')
+%% l3pdftools.dtx (with options: `package')
+%% l3pdffile.dtx (with options: `package')
+%%
+%% Copyright (C) 2019-2021 The LaTeX Project
+%%
+%% It may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License (LPPL), either version 1.3c of
+%% this license or (at your option) any later version. The latest
+%% version of this license is in the file:
+%%
+%% https://www.latex-project.org/lppl.txt
+%%
+%% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
+%% and all files in that bundle must be distributed together.
+%%
+%% File: pdfmanagement-testphase.dtx
+\ProvidesExplFile
+ {pdfmanagement-testphase.ltx}{2021-02-22}{0.95a}
+ {PDF~management~code~(testphase)}
+%% File: l3pdfdict.dtx
+\cs_new:Npn \__pdfdict_get_type:n #1
+ {
+ \str_case_e:nn { \str_head:n{#1} }
+ {
+ {g}{global}
+ {l}{local}
+ }
+ }
+\msg_new:nnn { pdfdict } { show-dict }
+ { %#1: name of the dictionary
+ %#2: expanded content
+ %#3: type
+ The~#3~dictionary~'#1'~
+ \tl_if_empty:nTF {#2}
+ { is~empty \\>~ . }
+ { contains~the~pairs~(without~outer~braces): #2 . }
+ }
+\msg_new:nnn { pdfdict } { unknown-dict }
+ {
+ The~dictionary~'#1'~is~unknown.
+ }
+\msg_new:nnn { pdfdict } { dict-already-defined }
+ {
+ The~#2~dictionary~'#1'~is~already~defined.
+ }
+\msg_new:nnn { pdfdict } { empty-value }
+ { The~value~#1~for~#2~is~blank~and~will~be~ignored }
+
+\msg_new:nnn { pdfdict } { invalid-name }
+ { Name~'#1'~is~not~valid\\
+ Names~of~dictionaries~should~start~with~'g_'~or~'l_' }
+
+
+\seq_new:N \g__pdfdict_lnames_seq
+\seq_new:N \g__pdfdict_gnames_seq
+\cs_new:Npn \__pdfdict_name:n #1 % #1 dictionary name
+ {
+ \str_head:n{#1}__pdfdict_/#1_prop
+ }
+\cs_set_eq:NN \__kernel_pdfdict_name:n \__pdfdict_name:n
+
+\cs_new_protected:Npn \__pdfdict_new:n #1
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \msg_error:nnxx
+ { pdfdict }
+ { dict-already-defined }
+ { \tl_to_str:n {#1} }
+ { \__pdfdict_get_type:n{#1} }
+ }
+ {
+ \str_case_e:nnF { \str_head:n{#1} }
+ {
+ {g}
+ {
+ \prop_new:c { \__pdfdict_name:n { #1 } }
+ \seq_gput_right:cn {g__pdfdict_gnames_seq} { #1 }
+ }
+ {l}
+ {
+ \prop_new:c { \__pdfdict_name:n { #1 } }
+ \seq_gput_right:cn {g__pdfdict_lnames_seq} { #1 }
+ }
+ }
+ {
+ \msg_error:nnx{pdfdict}{invalid-name}{\tl_to_str:n{#1}}
+ }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_new:n \__pdfdict_new:n
+\cs_new_protected:Npn \__pdfdict_set_eq:nn #1 #2
+ {
+ \__pdfdict_if_exist:nTF { #2 }
+ {
+ \__pdfdict_if_exist:nF { #1 }
+ {
+ \__pdfdict_new:n { #1 }
+ }
+ \prop_set_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_set_eq:nn \__pdfdict_set_eq:nn
+
+\cs_new_protected:Npn \__pdfdict_gset_eq:nn #1 #2
+ {
+ \__pdfdict_if_exist:nTF { #2 }
+ {
+ \__pdfdict_if_exist:nF { #1 }
+ {
+ \__pdfdict_new:n { #1 }
+ }
+ \prop_gset_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_gset_eq:nn \__pdfdict_gset_eq:nn
+\prg_new_conditional:Npnn \__pdfdict_if_exist:n #1 { p , T , F , TF }
+ {
+ \prop_if_exist:cTF
+ { \__pdfdict_name:n { #1 } }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_set_eq_conditional:NNn
+ \pdfdict_if_exist:n \__pdfdict_if_exist:n { p , T , F , TF }
+\prg_new_conditional:Npnn \__pdfdict_if_empty:n #1 { p , T , F , TF }
+ {
+ \prop_if_empty:cTF
+ { \__pdfdict_name:n { #1 } }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_set_eq_conditional:NNn
+ \pdfdict_if_empty:n \__pdfdict_if_empty:n { p , T , F , TF }
+\cs_new_protected:Npn \__pdfdict_put:nnn #1 #2 #3 %#1 (local) dict, #2 name, #3 value
+ {
+ \tl_if_blank:nTF { #3 }
+ {
+ \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
+ }
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \exp_args:Nnx \prop_put:cnn
+ { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_put:nnn \__pdfdict_put:nnn
+\cs_generate_variant:Nn \pdfdict_put:nnn {nnx,nno}
+
+\cs_new_protected:Npn \__pdfdict_gput:nnn #1 #2 #3 %#1 global dict, #2 name, #3 value
+ {
+ \tl_if_empty:nTF { #3 }
+ {
+ \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
+ }
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \exp_args:Nnx \prop_gput:cnn
+ { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_gput:nnn \__pdfdict_gput:nnn
+\cs_generate_variant:Nn \pdfdict_gput:nnn {nnx,nno}
+\cs_new_protected:Npn \__pdfdict_get:nnN #1 #2 #3 %dict,key,macro
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \exp_args:Nnx \prop_get:cnN
+ { \__pdfdict_name:n { #1 } }
+ { \str_convert_pdfname:n { #2 } } #3
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_get:nnN \__pdfdict_get:nnN
+\cs_new_protected:Npn \__pdfdict_remove:nn #1 #2 %dict,name
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \exp_args:Nnx \prop_remove:cn
+ { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+\cs_set_eq:NN \pdfdict_remove:nn \__pdfdict_remove:nn
+
+\cs_new_protected:Npn \__pdfdict_gremove:nn #1 #2 %dict,name
+ {
+ \__pdfdict_if_exist:nTF { #1 }
+ {
+ \exp_args:Nnx \prop_gremove:cn
+ { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } }
+ }
+ {
+ \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_set_eq:NN \pdfdict_gremove:nn \__pdfdict_gremove:nn
+\cs_new_protected:Npn \__pdfdict_show:Nn #1#2 %#1 message command, #2 dict
+ {
+ \prop_if_exist:cTF { \__pdfdict_name:n { #2 } }
+ {
+ #1
+ { pdfdict }
+ { show-dict }
+ { \tl_to_str:n {#2} }
+ { \prop_map_function:cN {\__pdfdict_name:n { #2 }} \msg_show_item:nn }
+ { \__pdfdict_get_type:n{#2} }
+ { }
+ }
+ {
+ #1 { pdfdict } { unknown-dict } { #2 } {}{}{}
+ }
+ }
+\cs_new_protected:Npn \pdfdict_show:n #1
+ {
+ \__pdfdict_show:Nn \msg_show:nnxxxx {#1}
+ }
+\cs_new:Npn \__pdfdict_item:nn #1 #2 %#1 name, #2 value
+ {
+ \tl_if_blank:nF {#2} { /#1~#2~ }
+ }
+\cs_generate_variant:Nn \__pdfdict_item:nn {ne}
+\cs_set_eq:NN \pdfdict_item:nn \__pdfdict_item:nn
+\cs_generate_variant:Nn \pdfdict_item:nn {ne}
+\cs_new:Npn \__pdfdict_use:n #1 %#1 dict
+ {
+ \prop_map_function:cN { \__pdfdict_name:n { #1 } } \__pdfdict_item:ne
+ }
+
+\cs_set_eq:NN \pdfdict_use:n \__pdfdict_use:n
+%% File: l3pdfmanagement.dtx
+
+\msg_new:nnn { pdfmanagement } { unknown-dict }
+ { The~PDF~management~resource~'#1'~is~unknown. }
+
+\msg_new:nnn { pdfmanagement } { empty-value }
+ { The~value~for~#1~is~empty~and~will~be~ignored }
+
+\msg_new:nnn { pdfmanagement } { no-removal }
+ { It~is~not~possible~to~remove~values~from~'#1'.}
+
+\msg_new:nnn { pdfmanagement } { no-show }
+ { It~is~not~possible~to~show~the~content~of~'#1'.}
+
+\msg_new:nnn { pdfmanagement } { show-dict }
+ {
+ The~PDF~resource~'#1'~
+ \tl_if_empty:nTF {#2}
+ { is~empty \\>~ . }
+ { contains~the~pairs~(without~outer~braces): #2 . }
+ }
+\msg_new:nnn { pdfmanagement } { dict-already-defined }
+ {
+ The~path~'#1'~is~already~defined.
+ }
+\msg_new:nnn { pdfmanagement } { inactive }
+ {
+ The~PDF~resources~management~is~not~active\\
+ command~'#1'~ignored.
+ }
+\bool_new:N \g__pdfmanagement_active_bool
+\prg_new_conditional:Npnn \__pdfmanagement_if_active: { p , T , F , TF }
+ {
+ \bool_if:NTF \g__pdfmanagement_active_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_set_eq_conditional:NNn
+ \pdfmanagement_if_active: \__pdfmanagement_if_active: { p , T , F , TF }
+
+\hook_new:n {pdfmanagement/add}
+\cs_new_protected:Npn \pdfmanagement_add:nnn #1 #2 #3
+ {
+ \__pdfmanagement_if_active:TF
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \hook_gput_code:nnn
+ {pdfmanagement/add}
+ {pdfmanagement}
+ {
+ \__pdfmanagement_handler_gput:nnn { #1 }{ #2 }{ #3 }
+ }
+ }
+ {
+ \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
+ }
+ }
+ {
+ \msg_warning:nnx {pdfmanagement}{inactive}
+ {\tl_to_str:n {\pdfmanagement_add:nnn}}
+ }
+ }
+
+\cs_generate_variant:Nn \pdfmanagement_add:nnn {nnx,nxx}
+\tl_new:N \g__kernel_pdfmanagement_thispage_shipout_code_tl
+\tl_new:N \g__kernel_pdfmanagement_lastpage_shipout_code_tl
+\tl_new:N \g__kernel_pdfmanagement_end_run_code_tl
+\tl_gset:Nn \g__kernel_pdfmanagement_thispage_shipout_code_tl
+ {
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \exp_args:NV \__pdf_backend_ThisPage_gpush:n { \g_shipout_readonly_int }
+ \exp_args:NV \__pdf_backend_PageResources_gpush:n { \g_shipout_readonly_int }
+ }
+ }
+
+\tl_gset:Nn \g__kernel_pdfmanagement_lastpage_shipout_code_tl
+ {
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \__pdf_backend_PageResources_obj_gpush: %ExtGState etc
+ }
+ }
+
+\tl_gset:Nn \g__kernel_pdfmanagement_end_run_code_tl
+ {
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \__pdfmanagement_Pages_gpush: %pagesattr
+ \__pdfmanagement_Info_gpush: %pdfinfo
+ \__pdfmanagement_Catalog_gpush:
+ }
+ }
+
+
+
+\cs_new_protected:Npn \__pdfmanagement_handler_gput:nnn #1 #2 #3 %#1 dict, #2 name, #3 value
+ {
+ \tl_if_empty:nTF { #3 }
+ {
+ \msg_none:nnn { pdfmanagement }{ empty-value }{ /#1/#2 }
+ }
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \cs_if_exist:cTF
+ { __pdfmanagement_handler/#1/?_gput:nn } %general, name independant handler
+ { \use:c {__pdfmanagement_handler/#1/?_gput:nn} {#2} {#3} }
+ {
+ \cs_if_exist:cTF
+ { __pdfmanagement_handler/#1/#2_gput:n }
+ { \use:c {__pdfmanagement_handler/#1/#2_gput:n} {#3} } %special handler
+ {
+ \exp_args:Nnx
+ \prop_gput:cnn
+ { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
+ { \str_convert_pdfname:n { #2 } }
+ { #3 }
+ }
+ }
+ }
+ {
+ \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
+ }
+ }
+ }
+
+\cs_generate_variant:Nn \__pdfmanagement_handler_gput:nnn {nxx}
+
+\cs_new_protected:Npn \__pdfmanagement_get:nnN #1 #2 #3 %path,key,macro
+ {
+ \exp_args:Nnx
+ \prop_get:cnN
+ { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
+ { \str_convert_pdfname:n {#2} } #3
+ }
+
+\cs_new_protected:Npn \__pdfmanagement_handler_gremove:nn #1 #2 %path,key
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \cs_if_exist:cTF
+ { __pdfmanagement_handler/#1/?_gremove:n } %general, name independant handler
+ { \use:c {__pdfmanagement_handler/#1/?_gremove:n} {#2} }
+ {
+ \cs_if_exist:cTF
+ { __pdfmanagement_handler/#1/#2_gremove: }
+ { \use:c {__pdfmanagement_handler/#1/#2_gremove:} } %special handler
+ {
+ \exp_args:Nnx
+ \prop_gremove:cn
+ { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
+ { \str_convert_pdfname:n {#2} }
+ }
+ }
+ }
+ {
+ \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_new_protected:Npn \__pdfmanagement_gremove:nn #1 #2 %path,key
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \exp_args:Nnx
+ \prop_gremove:cn
+ { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
+ { \str_convert_pdfname:n{#2} }
+ }
+ {
+ \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
+ }
+ }
+
+\cs_new_protected:Npn \__pdfmanagement_show:Nn #1#2
+ {
+ \cs_if_exist:cTF
+ { __pdfmanagement_handler/#2/?_show: } %general, name independant handler
+ { \use:c {__pdfmanagement_handler/#2/?_show:} }
+ {
+ \prop_if_exist:cTF { \__kernel_pdfdict_name:n { g__pdf_Core/#2 } }
+ {
+ #1
+ { pdfmanagement } { show-dict }
+ { \tl_to_str:n {#2} }
+ {
+ \prop_map_function:cN
+ {\__kernel_pdfdict_name:n { g__pdf_Core/#2 }}
+ \msg_show_item:nn
+ }
+ { } { }
+ }
+ {
+ #1 { pdfmanagement } { unknown-dict } {#2}{}{}{}
+ }
+ }
+ }
+
+\cs_new_protected:Npn \__pdfmanagement_show:n #1 %path
+ {
+ \prop_show:c { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
+ }
+\cs_new_protected:Npn \pdfmanagement_show:n #1
+ {
+ \__pdfmanagement_show:Nn \msg_show:nnxxxx {#1}
+ }
+\cs_new_protected:Npn \pdfmanagement_remove:nn #1 #2
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \__pdfmanagement_handler_gremove:nn { #1 }{ #2 }
+ }
+ {
+ \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
+ }
+ }
+\cs_new_protected:Npn \pdfmanagement_get:nnN #1 #2 #3
+ {
+ \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
+ {
+ \__pdfmanagement_get:nnN { #1 }{ #2 } #3
+ }
+ {
+ \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
+ }
+ }
+\pdfdict_new:n { g__pdf_Core/Info}
+\cs_new_protected:Npn \__pdfmanagement_Info_gpush:
+ {
+ \prop_map_function:cN
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
+ \__pdf_backend_info_gput:nn
+ \prop_gclear:c { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
+ }
+\pdfdict_new:n { g__pdf_Core/Pages}
+\cs_new_protected:Npn \__pdfmanagement_Pages_gpush:
+ {
+ \exp_args:Nx \__pdf_backend_Pages_primitive:n
+ {
+ \pdfdict_use:n { g__pdf_Core/Pages}
+ }
+ }
+
+\pdfdict_new:n { g__pdf_Core/Page }
+\pdfdict_new:n { g__pdf_Core/ThisPage }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gput:nn } #1 #2
+ {
+ \__pdf_backend_Page_gput:nn { #1 }{ #2 }
+ }
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gremove:n } #1
+ {
+ \__pdf_backend_Page_gremove:n { #1 }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gput:nn } #1 #2
+ {
+ \prop_gput:cnn { \__kernel_pdfdict_name:n { g__pdf_Core/ThisPage } }{ #1 } { #2 }
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \__pdf_backend_ThisPage_gput:nn { #1 }{ #2 }
+ }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gremove:n } #1
+ {
+ \msg_warning:nnn { pdfmanagement } { no-removal }{ThisPage}
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_show: }
+ {
+ \msg_warning:nnn { pdfmanagement } { no-show }{ThisPage}
+ }
+
+\clist_const:Nn \c__pdfmanagement_PageResources_clist
+ {
+ ExtGState,
+ ColorSpace,
+ Pattern,
+ Shading,
+ }
+
+\clist_map_inline:Nn \c__pdfmanagement_PageResources_clist
+ {
+ \pdfdict_new:n { g__pdf_Core/Page/Resources/#1}
+ }
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ExtGState/?_gput:nn } #1 #2
+ {
+ \__pdf_backend_PageResources_gput:nnn {ExtGState} { #1 }{ #2 }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ColorSpace/?_gput:nn } #1 #2
+ {
+ \__pdf_backend_PageResources_gput:nnn {ColorSpace} { #1 }{ #2 }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Shading/?_gput:nn } #1 #2
+ {
+ \__pdf_backend_PageResources_gput:nnn {Shading} { #1 }{ #2 }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Pattern/?_gput:nn } #1 #2
+ {
+ \__pdf_backend_PageResources_gput:nnn {Pattern} { #1 }{ #2 }
+ }
+\pdfdict_new:n { g__pdf_Core/Catalog}
+
+\clist_const:Nn \c__pdfmanagement_Catalog_toplevel_clist
+ {
+ Collection,
+ DPartRoot,
+ Lang,
+ Legal,
+ Metadata,
+ NeedsRendering,
+ OCProperties/D,
+ OpenAction,
+ PageLabels,
+ PageLayout,
+ PageMode,
+ Perms,
+ PieceInfo,
+ SpiderInfo,
+ StructTreeRoot,
+ Threads,
+ URI,
+ Version
+ }
+
+\clist_const:Nn \c__pdfmanagement_Catalog_sub_clist
+ {
+ AA,
+ AcroForm,
+ AcroForm/DR,
+ AcroForm/DR/Font,
+ MarkInfo,
+ ViewerPreferences,
+ OCProperties
+ }
+
+\clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
+ {
+ \pdfdict_new:n { g__pdf_Core/Catalog/#1}
+ }
+
+\clist_const:Nn \c__pdfmanagement_Catalog_seq_clist
+ {
+ AF,
+ OCProperties/OCGs,
+ OCProperties/Configs,
+ OutputIntents,
+ Requirements,
+ AcroForm/Fields,
+ AcroForm/CO
+ }
+
+\clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
+ {
+ \seq_new:c { g__pdfmanagement_/Catalog/#1_seq } % new name later
+ \cs_new_protected:cpn { __pdfmanagement_handler/Catalog/#1_gput:n } ##1
+ {
+ \seq_gput_right:cn { g__pdfmanagement_/Catalog/#1_seq } { ##1 }
+ }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/OCProperties/D_gput:n } #1
+ {
+ \seq_gput_left:cn
+ { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
+ { #1 }
+ }
+\cs_new_protected:Npn \__pdfmanagement_Catalog_gpush:
+ {
+ \use:c { __pdfmanagement_/Catalog/AA_gpush: }
+ \use:c { __pdfmanagement_/Catalog/AcroForm_gpush: }
+ \use:c { __pdfmanagement_/Catalog/AF_gpush: }
+ \use:c { __pdfmanagement_/Catalog/MarkInfo_gpush: }
+ \pdfmeta_standard_verify:nT {Catalog_no_OCProperties}
+ {
+ \use:c { __pdfmanagement_/Catalog/OCProperties_gpush: }
+ }
+ \use:c { __pdfmanagement_/Catalog/OutputIntents_gpush: }
+ \use:c { __pdfmanagement_/Catalog/Requirements_gpush: }
+ \use:c { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
+ % output the single values:
+ \prop_map_function:cN
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog} }
+ \__pdf_backend_catalog_gput:nn
+ % output names tree:
+ \use:c { __pdfmanagement_/Catalog/Names/EmbeddedFiles_gpush: }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/AA_gpush: }
+ {
+ \prop_if_empty:cF
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AA } }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AA_obj } { dict }
+ \__pdf_backend_object_write:nx
+ { g__pdfmanagement_/Catalog/AA_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/AA } }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {AA}
+ {
+ \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AA_obj }
+ }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/AcroForm_gpush: }
+ {
+ \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/Fields_seq }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AcroForm/Fields_obj } { array }
+ \__pdf_backend_object_write:nx
+ { g__pdfmanagement_/Catalog/AcroForm/Fields_obj }
+ { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/Fields_seq } {~} }
+ \exp_args:Nnnx
+ \prop_gput:cnn %we have to use \prop here to avoid the handler ...
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
+ { Fields }
+ { \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AcroForm/Fields_obj } }
+ }
+ \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/CO_seq }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AcroForm/CO_obj } { array }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/AcroForm/CO_obj }
+ { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/CO_seq } {~} }
+ \exp_args:Nnnx
+ \prop_gput:cnn %we have to use \prop here to avoid the handler ...
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
+ { CO }
+ { \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AcroForm/CO_obj } }
+ }
+ \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR/Font}}
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AcroForm/DR/Font_obj } {dict}
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/AcroForm/DR/Font_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR/Font } }
+ \exp_args:Nnnx
+ \prop_gput:cnn %we have to use \prop here to avoid the handler ...
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR } }
+ { Font }
+ { \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AcroForm/DR/Font_obj } }
+ }
+ \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR}}
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AcroForm/DR_obj } {dict}
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/AcroForm/DR_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR } }
+ \exp_args:Nnnx
+ \prop_gput:cnn %we have to use \prop here to avoid the handler ...
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
+ { DR }
+ { \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AcroForm/DR_obj } }
+ }
+ \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm} }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AcroForm_obj } {dict}
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/AcroForm_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm } }
+ \exp_args:Nnnx
+ \__pdfmanagement_handler_gput:nnn
+ { Catalog }
+ { AcroForm }
+ { \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/AcroForm_obj } }
+ }
+ }
+
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/AF_gpush: }
+ {
+ \seq_if_empty:cF
+ { g__pdfmanagement_/Catalog/AF_seq }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/AF_obj } { array }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/AF_obj }
+ { \seq_use:cn { g__pdfmanagement_/Catalog/AF_seq } {~} }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {AF}
+ {
+ \__pdf_backend_object_ref:n {g__pdfmanagement_/Catalog/AF_obj}
+ }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/MarkInfo_gpush: }
+ {
+ \prop_if_empty:cF
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/MarkInfo } }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/MarkInfo_obj } { dict }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/MarkInfo_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/MarkInfo } }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {MarkInfo}
+ {
+ \__pdf_backend_object_ref:n {g__pdfmanagement_/Catalog/MarkInfo_obj}
+ }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/OCProperties_gpush: }
+ {
+ \int_compare:nNnT
+ {
+ ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq } )*
+ ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/Configs_seq } )
+ }
+ >
+ { 0 }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/OCProperties_obj } { dict }
+ \seq_gpop_left:cN { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} \l_tmpa_tl
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn {g__pdfmanagement_/Catalog/OCProperties_obj}
+ {
+ /OCGs~[ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq } {~} ]
+ /D~\l_tmpa_tl~
+ \seq_if_empty:cF { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
+ {
+ /Configs~
+ [ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} {~} ]
+ }
+ }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ { OCProperties }
+ { \__pdf_backend_object_ref:n {g__pdfmanagement_/Catalog/OCProperties_obj} }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/OutputIntents_gpush: }
+ {
+ \seq_if_empty:cF
+ { g__pdfmanagement_/Catalog/OutputIntents_seq }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/OutputIntents_obj } { array }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/OutputIntents_obj }
+ { \seq_use:cn { g__pdfmanagement_/Catalog/OutputIntents_seq } {~} }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {OutputIntents}
+ {
+ \__pdf_backend_object_ref:n {g__pdfmanagement_/Catalog/OutputIntents_obj}
+ }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/Requirements_gpush: }
+ {
+ \seq_if_empty:cF
+ { g__pdfmanagement_/Catalog/Requirements_seq }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/Requirements_obj } { array }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/Requirements_obj }
+ { \seq_use:cn { g__pdfmanagement_/Catalog/Requirements_seq } {~} }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {Requirements}
+ {
+ \__pdf_backend_object_ref:n { g__pdfmanagement_/Catalog/Requirements_obj }
+ }
+ }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
+ {
+ \prop_if_empty:cF
+ { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/ViewerPreferences } }
+ {
+ \__pdf_backend_object_new:nn { g__pdfmanagement_/Catalog/ViewerPreferences_obj } { dict }
+ \exp_args:Nnx
+ \__pdf_backend_object_write:nn
+ { g__pdfmanagement_/Catalog/ViewerPreferences_obj }
+ { \pdfdict_use:n { g__pdf_Core/Catalog/ViewerPreferences } }
+ \exp_args:Nnx
+ \__pdf_backend_catalog_gput:nn
+ {ViewerPreferences}
+ {
+ \__pdf_backend_object_ref:n {g__pdfmanagement_/Catalog/ViewerPreferences_obj}
+ }
+ }
+ }
+\pdfdict_new:n { g__pdf_Core/Catalog/Names }
+
+\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/EmbeddedFiles_gput:n } #1
+ {
+ \__pdf_backend_NamesEmbeddedFiles_add:n { #1 }
+ }
+\cs_new_protected:cpn { __pdfmanagement_/Catalog/Names/EmbeddedFiles_gpush: }
+ {
+ \seq_if_empty:NF \g__pdf_backend_EmbeddedFiles_seq
+ {
+ \exp_args:Nx \__pdf_backend_NamesEmbeddedFiles_gpush:n
+ {
+ \seq_use:Nn \g__pdf_backend_EmbeddedFiles_seq {~}
+ }
+ }
+ }
+\cs_new_protected:cpn {__pdfmanagement_handler/Catalog/?_show:}
+ {
+ \iow_term:x
+ {
+ \iow_newline:
+ The~Catalog~contains~in~the~top~level~the~single~value~entries
+ \prop_map_function:cN
+ {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog }}
+ \msg_show_item:nn
+ }
+ \clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
+ {
+ \seq_if_empty:cF { g__pdfmanagement_/Catalog/##1_seq }
+ {
+ \iow_term:x
+ {
+ The~'##1'~array~contains~the~entries
+ \seq_map_function:cN { g__pdfmanagement_/Catalog/##1_seq } \msg_show_item:n
+ }
+ }
+ }
+ \clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
+ {
+ \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 } }
+ {
+ \iow_term:x
+ {
+ The~Catalog~subdirectory~'##1'~contains~the~single~value~entries
+ \prop_map_function:cN
+ {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 }}
+ \msg_show_item:nn
+ }
+ }
+ }
+ \tl_show:x {\tl_to_str:n{\pdfmanagement_show:n{Catalog}}}
+ }
+\pdfdict_new:n { g__pdf_Core/Xform/Resources/Properties}
+%% File: ltdocinit.dtx
+\msg_new:nnn { document } { setup-after-documentclass }
+ {
+ \token_to_str:N \DeclareDocumentMetadata \c_space_tl
+ should~be~used~only~before~\token_to_str:N\documentclass
+ }
+\NewDocumentCommand\DeclareDocumentMetadata { m }
+ {
+ \cs_if_eq:NNTF \documentclass \@twoclasseserror
+ { \msg_error:nn { document }{ setup-after-documentclass } }
+ {
+ \keys_set_groups:nnn { document / metadata} {init}{ #1 }
+ %should be loaded after the backend is set, and only if not in the kernel
+ \cs_if_free:NTF \pdf_uncompress:
+ {\RequirePackage{l3pdf}}{\RequirePackage{expl3}}
+ \ExplSyntaxOn\makeatletter
+ \file_input:n {l3backend-testphase-\c_sys_backend_str.def}
+ \ExplSyntaxOff\makeatother
+ \bool_gset_true:N \g__pdfmanagement_active_bool
+ \keys_set_filter:nnn { document / metadata } { init } { lang=en-US, #1 }
+ \bool_if:NT \g__pdfmanagement_active_bool
+ {
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+ \hook_use_once:n {pdfmanagement/add}
+ \RenewDocumentCommand\DeclareDocumentMetadata { m }
+ {
+ \keys_set_filter:nnn { document / metadata } { init } { ##1 }
+ \bool_if:NTF \g__pdfmanagement_active_bool
+ {
+ \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+ \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
+ }
+ {
+ \str_remove_all:cn {opt@hyperref.sty}{customdriver=hgeneric-testphase}
+ }
+ }
+ \RequirePackage{pdfmanagement-firstaid}
+ }
+ }
+\prop_new:N \g__pdfmanagement_documentproperties_prop %
+\NewDocumentCommand\AddToDocumentProperties{O{\@currname}mm}
+ {
+ \exp_args:NNx
+ \prop_gput:Nnn \g__pdfmanagement_documentproperties_prop
+ {
+ \tl_if_blank:eTF {#1}{top-level/}{#1/} #2
+ }
+ { #3}
+ }
+\NewExpandableDocumentCommand\GetDocumentProperties{m}
+ {
+ \prop_item:Nn \g__pdfmanagement_documentproperties_prop {#1}
+ }
+\msg_new:nnn { pdfmanagement } { show-properties }
+ {
+ The~following~document~properties~have~been~stored:
+ #1
+ }
+\NewDocumentCommand\ShowDocumentProperties {}
+ {
+ \msg_show:nnx {pdfmanagement}{show-properties}
+ {
+ \prop_map_function:NN \g__pdfmanagement_documentproperties_prop \msg_show_item:nn
+ }
+ }
+\clist_new:N \g__pdfmanagement_firstaidoff_clist
+\keys_define:nn { document / metadata }
+ {
+ backend .code:n =
+ {
+ \PassOptionsToPackage { driver=#1 } {expl3}
+ \AddToDocumentProperties[document]{backend}{#1}
+ },
+ backend .groups:n = { init } ,
+ }
+
+\keys_define:nn { document / metadata }
+ {
+ ,pdfversion .code:n =
+ {
+ \pdf_version_gset:n { #1 }
+ \AddToDocumentProperties[document]{pdfversion}{#1}
+ }
+ ,uncompress .code:n =
+ {
+ \pdf_uncompress:
+ }
+ ,uncompress .value_forbidden:n = true
+ ,lang .code:n =
+ {
+ \pdfmanagement_add:nnn {Catalog} {Lang}{(#1)}
+ \AddToDocumentProperties[document]{lang}{#1}
+ }
+ %,xmpmeta .bool_gset:N = \g_pdfmeta_xmp_bool %see pdfmeta unused and undefined for now!
+ % this uses internal command from pdfmeta, it should probably move there ...
+ ,pdfstandard .code:n =
+ {
+ \exp_args:Nnx
+ \keys_set:nn {document / metadata} {_pdfstandard=\str_uppercase:n{#1}}
+ }
+ ,_pdfstandard .choices:nn =
+ {A-1B,A-2B,A-3B}
+ {
+ \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
+ {
+ \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
+ }
+ \AddToDocumentProperties [document]{pdfstandard}{#1}
+ }
+ ,_pdfstandard / unknown .code:n =
+ {
+ \msg_warning:nnn{pdf}{unknown-standard}{#1}
+ }
+ ,pdfmanagement .bool_gset:N = \g__pdfmanagement_active_bool
+ ,pdfmanagement .initial:n = {true}
+ ,firstaidoff .clist_gset:N = \g__pdfmanagement_firstaidoff_clist
+ }
+%% File: l3pdfannot.dtx
+\RequirePackage{l3bitset}
+\bitset_new:Nn \l_pdfannot_F_bitset
+ {
+ Invisible = 1,
+ Hidden = 2,
+ Print = 3,
+ NoZoom = 4,
+ NoRotate = 5,
+ NoView = 6,
+ ReadOnly = 7,
+ Locked = 8,
+ ToggleNoView = 9,
+ LockedContents = 10
+ }
+\bool_new:N \g__pdfannot_use_lastlink_bool
+
+\cs_new_protected:Npn \pdfannot_box:nnnn #1 #2 #3 #4
+ {
+ \__pdf_backend_annotation:nnnn {#1}{#2}{#3}{#4}
+ \bool_gset_false:N\g__pdfannot_use_lastlink_bool
+ }
+
+\cs_new:Npn \pdfannot_box_ref_last:
+ {
+ \__pdf_backend_annotation_last:
+ }
+
+\cs_new_protected:Npn \pdfannot_box:nnnnn #1 #2 #3 #4 #5
+ {
+ \exp_args:Nx
+ \__pdf_backend_annotation:nnnn {#2}{#3}{#4}
+ {
+ \pdfdict_if_exist:nT { l__pdfannot/#1 }
+ {
+ \pdfdict_use:n { l__pdfannot/#1}
+ }
+ #5
+ }
+ \bool_gset_false:N\g__pdfannot_use_lastlink_bool
+ }
+ \pdfdict_new:n { l__pdfannot/widget }
+ \pdfdict_put:nnn { l__pdfannot/widget }{ Subtype }{ /Widget }
+\seq_const_from_clist:Nn \c_pdfannot_link_types_seq { URI , GoToR , Launch , GoTo, Named }
+\seq_map_inline:Nn \c_pdfannot_link_types_seq
+ {
+ \pdfdict_new:n { l__pdfannot/link/#1 }
+ \hook_new_pair:nn
+ {pdfannot/link/#1/before}
+ {pdfannot/link/#1/after}
+ \hook_new_pair:nn
+ {pdfannot/link/#1/begin}
+ {pdfannot/link/#1/end}
+ }
+\cs_new_protected:Nn \pdfannot_link:nnn %#1 type (URI, GoTo etc),
+ %#2 action spec, #3 link text
+ {
+ \hook_use:n { pdfannot/link/#1/before}
+ \mode_leave_vertical:
+ \exp_args:Nxx %xetex needs expansion
+ \__pdf_backend_link_begin_user:nnw
+ {
+ \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
+ {
+ \pdfdict_use:n { l__pdfannot/link/#1}
+ }
+ }
+ {
+ /Subtype/Link
+ #2 %exp_not?
+ }
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/#1/begin}
+ #3
+ \hook_use:n { pdfannot/link/#1/end}
+ \__pdf_backend_link_end:
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/#1/after}
+ }
+\cs_generate_variant:Nn \pdfannot_link:nnn {nxn}
+\cs_new_protected:Npn \pdfannot_link_begin:nnw #1 #2 %#1 type, #2 action spec
+ {
+ \hook_use:n { pdfannot/link/#1/before}
+ \mode_leave_vertical:
+ \exp_args:Nxx %xetex needs expansion
+ \__pdf_backend_link_begin_user:nnw
+ {
+ \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
+ {
+ \pdfdict_use:n { l__pdfannot/link/#1}
+ }
+ }
+ { #2 }
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/#1/begin}
+ }
+
+\cs_new_protected:Nn \pdfannot_link_end:n %#1 type, e.g. url
+ {
+ \hook_use:n { pdfannot/link/#1/end}
+ \__pdf_backend_link_end:
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/#1/after}
+ }
+\cs_generate_variant:Nn \pdfannot_link_begin:nnw {nxw}
+\cs_new_protected:Npn \pdfannot_link_goto_begin:nw #1 %#1 destination
+ {
+ \hook_use:n { pdfannot/link/GoTo/before}
+ \mode_leave_vertical:
+ \exp_args:Nxx %xetex needs expansion
+ \__pdf_backend_link_begin_goto:nnw
+ {
+ \pdfdict_use:n { l__pdfannot/link/GoTo}
+ }
+ { #1 }
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/GoTo/begin}
+ }
+
+\cs_new_protected:Nn \pdfannot_link_goto_end:
+ {
+ \hook_use:n { pdfannot/link/GoTo/end}
+ \__pdf_backend_link_end:
+ \bool_gset_true:N \g__pdfannot_use_lastlink_bool
+ \hook_use:n { pdfannot/link/GoTo/after}
+ }
+\cs_new:Nn \pdfannot_link_ref_last: { \__pdf_backend_link_last: }
+\cs_new:Npn \pdfannot_ref_last:
+ {
+ \bool_if:NTF \g__pdfannot_use_lastlink_bool
+ {
+ \__pdf_backend_link_last:
+ }
+ {
+ \__pdf_backend_annotation_last:
+ }
+ }
+\cs_new_protected:Npn \pdfannot_link_margin:n #1
+ {
+ \__pdf_backend_link_margin:n { #1 }
+ }
+\cs_new_protected:Npn \pdfannot_dict_put:nnn #1 #2 #3
+ {
+ \pdfdict_put:nnn { l__pdfannot/#1 } { #2 }{ #3 }
+ }
+\cs_generate_variant:Nn \pdfannot_dict_put:nnn {nnx}
+\cs_new_protected:Npn \pdfannot_dict_remove:nn #1 #2
+ {
+ \pdfdict_remove:nn { l__pdfannot/#1 } { #2 }
+ }
+\cs_new_protected:Npn \pdfannot_dict_show:n #1
+ {
+ \pdfdict_show:n { l__pdfannot/#1 }
+ }
+%% File: l3pdfxform.dtx
+\cs_new_protected:Npn \pdfxform_new:nnn #1 #2 #3
+ {
+ \__pdf_backend_xform_new:nnnn { #1 } { #2 } { } { #3 }
+ }
+\cs_new_protected:Npn \pdfxform_use:n #1
+ {
+ \__pdf_backend_xform_use:n { #1 }
+ }
+\cs_new:Npn \pdfxform_ref:n #1
+ {
+ \__pdf_backend_xform_ref:n { #1 }
+ }
+
+\cs_generate_variant:Nn \pdfxform_ref:n {o}
+\cs_new:Npn \pdfxform_wd:n #1
+ {
+ \tl_use:c { c__pdf_backend_xform_wd_ \tl_to_str:n { #1 } _tl }
+ }
+
+\cs_new:Npn \pdfxform_ht:n #1
+ {
+ \tl_use:c { c__pdf_backend_xform_ht_ \tl_to_str:n { #1 } _tl }
+ }
+
+\cs_new:Npn \pdfxform_dp:n #1
+ {
+ \tl_use:c { c__pdf_backend_xform_dp_ \tl_to_str:n { #1 } _tl }
+ }
+%% File: l3pdfmeta.dtx
+\msg_new:nnn {pdf }{unknown-standard}{The~standard~'#1'~is~unknown~and~has~been~ignored}
+\tl_new:N\l__pdfmeta_tmpa_tl
+\tl_new:N\l__pdfmeta_tmpb_tl
+\str_new:N \l__pdfmeta_tmpa_str
+\prop_new:N \g__pdfmeta_standard_prop
+\cs_new:Npn \pdfmeta_standard_item:n #1
+ {
+ \prop_item:Nn \g__pdfmeta_standard_prop {#1}
+ }
+\cs_new_protected:Npn \pdfmeta_standard_get:nN #1 #2
+ {
+ \prop_get:NnN \g__pdfmeta_standard_prop {#1} #2
+ }
+\prg_new_conditional:Npnn \pdfmeta_standard_verify:n #1 {T,F,TF}
+ {
+ \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
+ {
+ \prg_return_false:
+ }
+ {
+ \prg_return_true:
+ }
+ }
+\prg_new_protected_conditional:Npnn \pdfmeta_standard_verify:nn #1 #2 {T,F,TF}
+ {
+ \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
+ {
+ \cs_if_exist:cTF {__pdfmeta_standard_verify_handler_#1:nn}
+ {
+ \exp_args:Nnnx
+ \use:c
+ {__pdfmeta_standard_verify_handler_#1:nn}
+ { #2 }
+ { \prop_item:Nn \g__pdfmeta_standard_prop {#1} }
+ }
+ {
+ \prg_return_false:
+ }
+ }
+ {
+ \prg_return_true:
+ }
+ }
+\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_min_pdf_version:nn #1 #2
+ {
+ \pdf_version_compare:NnTF <
+ { #2 }
+ {\prg_return_false:}
+ {\prg_return_true:}
+ }
+
+\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_named_actions:nn #1 #2
+ {
+ \tl_if_in:nnTF { #2 }{ #1 }
+ {\prg_return_true:}
+ {\prg_return_false:}
+ }
+\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_annot_action_A:nn #1 #2
+ {
+ \tl_if_in:nnTF { #2 }{ #1 }
+ {\prg_return_true:}
+ {\prg_return_false:}
+ }
+\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_outputintent_subtype:nn #1 #2
+ {
+ \tl_if_eq:nnTF { #2 }{ #1 }
+ {\prg_return_true:}
+ {\prg_return_false:}
+ }
+\cs_new_protected:Npn \__pdfmeta_verify_pdfa_annot_flags:
+ {
+ \bitset_set_true:Nn \l_pdfannot_F_bitset {Print}
+ \bitset_set_false:Nn \l_pdfannot_F_bitset {Hidden}
+ \bitset_set_false:Nn \l_pdfannot_F_bitset {Invisible}
+ \bitset_set_false:Nn \l_pdfannot_F_bitset {NoView}
+ \pdfannot_dict_put:nnn {link/URI}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
+ \pdfannot_dict_put:nnn {link/GoTo}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
+ \pdfannot_dict_put:nnn {link/GoToR}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
+ \pdfannot_dict_put:nnn {link/Launch}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
+ \pdfannot_dict_put:nnn {link/Named}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
+ }
+\hook_gput_code:nnn {begindocument} {pdf}
+ {
+ \pdfmeta_standard_verify:nF { annot_flags }
+ { \__pdfmeta_verify_pdfa_annot_flags: }
+ }
+\prop_new:c { g__pdfmeta_standard_pdf/A-1B_prop }
+\prop_set_from_keyval:cn { g__pdfmeta_standard_pdf/A-1B_prop }
+ {
+ ,name = pdf/A-1B
+ ,type = A
+ ,year = 2005
+ ,min_pdf_version = 1.4 %minimum
+ ,no_encryption =
+ ,no_external_content = % no F, FFilter, or FDecodeParms in stream dicts
+ ,no_embed_content = % no EF key in filespec, no /Type/EmbeddedFiles
+ ,max_string_size = 65535
+ ,max_array_size = 8191
+ ,max_dict_size = 4095
+ ,max_obj_num = 8388607
+ ,max_nest_qQ = 28
+ ,named_actions = {NextPage, PrevPage, FirstPage, LastPage}
+ ,annot_flags =
+ %booleans. Only the existence of the key matter.
+ %If the entry is added it means a requirements is there
+ %(in most cases "don't use ...")
+ %
+ %===============
+ % Rule 6.1.13-1 CosDocument, isOptionalContentPresent == false
+ ,Catalog_no_OCProperties =
+ %===============
+ % Rule 6.6.1-1: PDAction, S == "GoTo" || S == "GoToR" || S == "Thread"
+ % || S == "URI" || S == "Named" || S == "SubmitForm"
+ % means: no /S/Launch, /S/Sound, /S/Movie, /S/ResetForm, /S/ImportData,
+ % /S/JavaScript, /S/Hide
+ ,annot_action_A = {GoTo,GoToR,Thread,URI,Named,SubmitForm}
+ %===============
+ % Rule 6.6.2-1: PDAnnot, Subtype != "Widget" || AA_size == 0
+ % means: no AA dictionary
+ ,annot_widget_no_AA =
+ %===============
+ % Rule 6.9-2: PDAnnot, Subtype != "Widget" || (A_size == 0 && AA_size == 0)
+ % (looks like a tightening of the previous rule)
+ ,annot_widget_no_A_AA =
+ %===============
+ % Rule 6.9-1 PDAcroForm, NeedAppearances == null || NeedAppearances == false
+ ,form_no_NeedAppearances =
+ %===============
+ %Rule 6.9-3 PDFormField, AA_size == 0
+ ,form_no_AA =
+ %===============
+ % to be continued https://docs.verapdf.org/validation/pdfa-part1/
+ % - Outputintent/colorprofiles requirements
+ % an outputintent should be loaded and is unique.
+ ,outputintent_A = {GTS_PDFA1}
+ % - no Alternates key in image dictionaries
+ % - no OPI, Ref, Subtype2 with PS key in xobjects
+ % - Interpolate = false in images
+ % - no TR, TR2 in ExtGstate
+ }
+
+\prop_new:c { g__pdfmeta_standard_pdf/A-2B_prop }
+\prop_gset_eq:cc
+ { g__pdfmeta_standard_pdf/A-2B_prop }
+ { g__pdfmeta_standard_pdf/A-1B_prop }
+\prop_gput:cnn
+ { g__pdfmeta_standard_pdf/A-2B_prop }{name}{pdf/A-2B}
+\prop_gput:cnn
+ { g__pdfmeta_standard_pdf/A-2B_prop }{year}{2011}
+\prop_gremove:cn
+ { g__pdfmeta_standard_pdf/A-2B_prop }
+ { embed_content}
+
+\prop_new:c { g__pdfmeta_standard_pdf/A-3B_prop }
+\prop_gset_eq:cc
+ { g__pdfmeta_standard_pdf/A-3B_prop }
+ { g__pdfmeta_standard_pdf/A-2B_prop }
+\prop_gput:cnn
+ { g__pdfmeta_standard_pdf/A-3B_prop }{name}{pdf/A-3B}
+\prop_gput:cnn
+ { g__pdfmeta_standard_pdf/A-2B_prop }{year}{2012}
+\prop_gremove:cn
+ { g__pdfmeta_standard_pdf/A-3B_prop }
+ { embed_content}
+\prop_new:N \g__pdfmeta_outputintents_prop
+\keys_define:nn { document / metadata }
+ {
+ colorprofiles .code:n =
+ {
+ \keys_set:nn { document / metadata / colorprofiles }{#1}
+ }
+ }
+\keys_define:nn { document / metadata / colorprofiles }
+ {
+ ,A .code:n =
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \prop_gput:Nnn \g__pdfmeta_outputintents_prop
+ { GTS_PDFA1 } {#1}
+ }
+ }
+ ,a .code:n =
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \prop_gput:Nnn \g__pdfmeta_outputintents_prop
+ { GTS_PDFA1 } {#1}
+ }
+ }
+ ,X .code:n =
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \prop_gput:Nnn \g__pdfmeta_outputintents_prop
+ { GTS_PDFX } {#1}
+ }
+ }
+ ,x .code:n =
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \prop_gput:Nnn \g__pdfmeta_outputintents_prop
+ { GTS_PDFX } {#1}
+ }
+ }
+ ,unknown .code:n =
+ {
+ \tl_if_blank:nF {#1}
+ {
+ \exp_args:NNo
+ \prop_gput:Nnn \g__pdfmeta_outputintents_prop
+ { \l_keys_key_str } {#1}
+ }
+ }
+ }
+\pdfdict_new:n {l_pdfmeta/outputintent}
+\pdfdict_put:nnn {l_pdfmeta/outputintent}
+ {Type}{/OutputIntent}
+\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_sRGB.icc}
+ {
+ ,OutputConditionIdentifier=IEC~sRGB
+ ,Info=IEC~61966-2.1~Default~RGB~colour~space~-~sRGB
+ ,RegistryName=http://www.iec.ch
+ ,N = 3
+ }
+\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_FOGRA39L_coated.icc}
+ {
+ ,OutputConditionIdentifier=FOGRA39L~Coated
+ ,Info={Offset~printing,~according~to~ISO~12647-2:2004/Amd~1,~OFCOM,~ %
+ paper~type~1~or~2~=~coated~art,~115~g/m2,~tone~value~increase~
+ curves~A~(CMY)~and~B~(K)}
+ ,RegistryName=http://www.fogra.org
+ ,N = 4
+ }
+\cs_new_protected:Npn \__pdfmeta_embed_colorprofile:n #1%#1 file name
+ {
+ \pdf_object_if_exist:nF { __color_icc_ #1 }
+ {
+ \pdf_object_new:nn { __color_icc_ #1 }{fstream}
+ \pdf_object_write:nx { __color_icc_ #1 }
+ {
+ {/N\c_space_tl
+ \prop_item:cn{c__pdfmeta_colorprofile_#1}{N}
+ }
+ {#1}
+ }
+ }
+ }
+
+\cs_new_protected:Npn \__pdfmeta_write_outputintent:nn #1 #2 %#1 file name, #2 subtype
+ {
+ \group_begin:
+ \pdfdict_put:nnx {l_pdfmeta/outputintent}{S}{/\str_convert_pdfname:n{#2}}
+ \pdfdict_put:nnx {l_pdfmeta/outputintent}
+ {DestOutputProfile}
+ {\pdf_object_ref:n{ __color_icc_ #1 }}
+ \clist_map_inline:nn { OutputConditionIdentifier, Info, RegistryName }
+ {
+ \prop_get:cnNT
+ { c__pdfmeta_colorprofile_#1}
+ { ##1 }
+ \l__pdfmeta_tmpa_tl
+ {
+ \pdf_string_from_unicode:nVN {utf8/string}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_str
+ \pdfdict_put:nnx
+ {l_pdfmeta/outputintent}{##1}{\l__pdfmeta_tmpa_str}
+ }
+ }
+ \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n {l_pdfmeta/outputintent} }
+ \pdfmanagement_add:nnx {Catalog}{OutputIntents}{\pdf_object_ref_last:}
+ \group_end:
+ }
+
+\AddToHook{begindocument/end}
+ {
+ \pdfmeta_standard_verify:nTF {outputintent_A}
+ {
+ \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
+ {
+ \__pdfmeta_embed_colorprofile:n
+ {#2}
+ \__pdfmeta_write_outputintent:nn
+ {#2}
+ {#1}
+ }
+ }
+ {
+ \exp_args:NNx
+ \prop_if_in:NnF
+ \g__pdfmeta_outputintents_prop
+ { \pdfmeta_standard_item:n { outputintent_A } }
+ {
+ \exp_args:NNx
+ \prop_gput:Nnn
+ \g__pdfmeta_outputintents_prop
+ { \pdfmeta_standard_item:n { outputintent_A } }
+ { sRGB.icc }
+ }
+ \exp_args:NNx
+ \prop_get:NnN
+ \g__pdfmeta_outputintents_prop
+ { \pdfmeta_standard_item:n { outputintent_A } }
+ \l__pdfmeta_tmpb_tl
+ \exp_args:NV \__pdfmeta_embed_colorprofile:n \l__pdfmeta_tmpb_tl
+ \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
+ {
+ \exp_args:NV
+ \__pdfmeta_write_outputintent:nn
+ \l__pdfmeta_tmpb_tl
+ { #1 }
+ }
+ }
+ }
+%% File: l3pdftools.dtx
+\cs_generate_variant:Nn \str_convert_pdfname:n { e }
+
+\cs_new:Npn \pdf_name_from_unicode_e:n #1
+ {
+ / \str_convert_pdfname:e { \text_expand:n { #1 } }
+ }
+
+\cs_generate_variant:Nn \pdf_name_from_unicode_e:n {V}
+\bool_lazy_any:nTF
+ {
+ \sys_if_engine_luatex_p:
+ \sys_if_engine_xetex_p:
+ }
+ {
+ \prop_gput:Nnn \g__str_alias_prop { default } { }
+ }
+ {
+ \prop_gput:Nnn \g__str_alias_prop { default } { utf8 }
+ }
+\cs_new:Npn \pdf_string_from_unicode:nnN #1 #2 #3
+ {
+ \cs_if_exist_use:cF { __pdf_string_from_unicode_#1:nN }
+ {
+ \__kernel_msg_error:nnn { pdf } { unknown-convert } {#1}
+ \use_none:nn
+ }
+ { #2 } #3
+ }
+
+\cs_generate_variant:Nn \pdf_string_from_unicode:nnN {nVN}
+%% TODO Names need a review when it is clear which converters
+%% are actually needed
+%% string conversions and printing
+%% we assume here that the text purify step has been done. The input is
+%% a list of (utf8) chars.
+%% str convert, not expandable.
+
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string-raw:nN } #1 #2
+ {
+ \str_set_convert:Nnnn #2
+ { #1 }
+ { default }
+ {utf8/string}
+ }
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string:nN } #1 #2
+ {
+ \use:c { __pdf_string_from_unicode_utf8/string-raw:nN } { #1 } #2
+ \str_put_left:Nn #2 {(}
+ \str_put_right:Nn #2 {)}
+ }
+\cs_new_protected:cpx { __pdf_string_from_unicode_utf8/URI-raw:nN } #1 #2
+ {
+ \exp_not:N \str_set_convert:Nnnn #2
+ { #1 }
+ { default }
+ {utf8/url}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3A} {:}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2F} {/}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 23} {\c_hash_str}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5B} {[}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5D} {]}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 40} {\c_atsign_str}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 21} {!}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 24} {\c_dollar_str}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 26} {\c_ampersand_str}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 27} {'}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2A} {*}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2B} {+}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2C} {,}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3B} {;}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3D} {=}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 30} {0}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 31} {1}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 32} {2}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 33} {3}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 34} {4}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 35} {5}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 36} {6}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 37} {7}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 38} {8}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 39} {9}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 28} {\c_backslash_str(}
+ \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 29} {\c_backslash_str)}
+ }
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/URI:nN } #1 #2
+ {
+ \use:c { __pdf_string_from_unicode_utf8/URI-raw:nN } {#1} #2
+ \str_put_left:Nn #2 {(}
+ \str_put_right:Nn #2 {)}
+ }
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string-raw:nN } #1 #2
+ {
+ \str_set_convert:Nnnn #2
+ { #1 }
+ { default }
+ {utf16/string}
+ }
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string:nN } #1 #2
+ {
+ \use:c { __pdf_string_from_unicode_utf16/string-raw:nN } {#1} #2
+ \str_put_left:Nn #2 {(}
+ \str_put_right:Nn #2 {)}
+ }
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex-raw:nN } #1 #2
+ {
+ \str_set_convert:Nnnn #2
+ { #1 }
+ { default }
+ {utf16/hex}
+ }
+
+\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex:nN } #1 #2
+ {
+ \use:c { __pdf_string_from_unicode_utf16/hex-raw:nN } {#1} #2
+ \str_put_left:Nn #2 {<}
+ \str_put_right:Nn #2 {>}
+ }
+
+\cs_new_protected:Npn \pdf_bdc:nn #1 #2 { \__pdf_backend_bdc:nn { #1 }{ #2 } }
+\cs_new_protected:Npn \pdf_bdcobject:nn #1 #2 { \__pdf_backend_bdcobject:nn { #1 }{ #2 } }
+\cs_new_protected:Npn \pdf_bdcobject:n #1 { \__pdf_backend_bdcobject:n { #1 } }
+\cs_new_protected:Npn \pdf_bmc:n #1 { \__pdf_backend_bmc:n { #1 } }
+\cs_new_protected:Npn \pdf_emc: { \__pdf_backend_emc: }
+%% File: l3pdffile.dtx
+
+\cs_new_protected:Npn \__pdffile_filename_convert_to_print:nN #1 #2
+ {\pdf_string_from_unicode:nnN {utf16/hex}{#1}{#2}}
+\msg_new:nnn { pdffile } { file-not-found }
+ {
+ File~'\tl_to_str:n{#1}'~not~found
+ }
+
+\msg_new:nnn { pdffile } { mimetype-missing }
+ {
+ Mime~type~not~set~for~file~'\tl_to_str:n{#1}'
+ }
+
+\msg_new:nnn { pdffile } { target-name-missing }
+ {
+ a~target~name~for~the~/FileSpec~dictionary~is~missing.
+ }
+
+\msg_new:nnn { pdffile } { object-exists }
+ {
+ object~name~'#1'~is~already~used.
+ }
+
+\msg_new:nnn { pdffile } { show-files }
+ {
+ The~following~files~have~been~embedded\\
+ #1
+ }
+\tl_new:N \l__pdffile_tmpa_tl
+\tl_new:N \l__pdffile_tmpb_tl
+\str_new:N \l__pdffile_tmpa_str
+\str_new:N \l__pdffile_tmpb_str
+\str_new:N \l__pdffile_ext_str
+\tl_new:N \l__pdffile_automimetype_tl
+\tl_new:N \l__pdffile_embed_ref_tl
+\prop_new:N \g_pdffile_mimetypes_prop
+\prop_set_from_keyval:Nn \g_pdffile_mimetypes_prop
+ {
+ ,.csv = text/csv
+ ,.html= text/html
+ ,.dtx = text/plain %or application/x-tex, not in iana.org list
+ ,.eps = application/postscript
+ ,.jpg = image/jpeg
+ ,.mp4 = video/mp4
+ ,.pdf = application/pdf
+ ,.png = image/png
+ ,.tex = text/plain %or application/x-tex, not in iana.org list
+ ,.txt = text/plain
+ ,.sty = text/plain
+ }
+\str_new:N \l_pdffile_source_name_str
+\pdfdict_new:n { l_pdffile }
+\pdfdict_put:nnn { l_pdffile }{Type}{/EmbeddedFile}
+\pdfdict_new:n { l_pdffile/Params }
+\pdfdict_put:nnn { l_pdffile/Params }
+ {ModDate} { (\file_timestamp:n { \l_pdffile_source_name_str }) }
+\pdfdict_put:nnn { l_pdffile/Params }
+ {Size} { \file_size:n { \l_pdffile_source_name_str } }
+\pdfdict_put:nnn { l_pdffile/Params }
+ {CheckSum} { (\file_mdfive_hash:n { \l_pdffile_source_name_str }) }
+\pdfdict_new:n { l_pdffile/streamParams }
+\pdfdict_put:nnn { l_pdffile/streamParams }
+ {ModDate} {
+ (
+ D:\int_use:N\c_sys_year_int
+ \int_compare:nNnT{\c_sys_month_int}<{10}{0}
+ \int_use:N\c_sys_month_int
+ \int_compare:nNnT{\c_sys_day_int}<{10}{0}
+ \int_use:N\c_sys_day_int
+ )
+ }
+\pdfdict_new:n { l_pdffile/FileSpec }
+\pdfdict_put:nnn { l_pdffile/FileSpec }
+ {Type} { /FileSpec }
+\pdfdict_put:nnn { l_pdffile/FileSpec }
+ {AFRelationship} { /Unspecified }
+
+\prop_new:N \g_pdffile_embed_prop
+\cs_new_protected:Npn \pdffile_embed_show:
+ {
+ \msg_show:nnx
+ {pdffile}{show-files}
+ {
+ \prop_map_function:NN {\g_pdffile_embed_prop} \msg_show_item:nn
+ }
+ }
+\cs_new_protected:Npn \__pdffile_mimetype_set:nN #1 #2
+ {
+ \file_parse_full_name:nNNN
+ {#1}
+ \l__pdffile_tmpa_str %unused
+ \l__pdffile_tmpb_str %unused
+ \l__pdffile_ext_str
+ %check if Subtype has been set
+ \pdfdict_get:nnN { l_pdffile}{Subtype}\l__pdffile_tmpa_tl
+ %if not look up in the prop:
+ \quark_if_no_value:NT \l__pdffile_tmpa_tl
+ {
+ \prop_get:NVNTF
+ \g_pdffile_mimetypes_prop
+ \l__pdffile_ext_str
+ \l__pdffile_tmpb_tl
+ {
+ \tl_set:Nx #2 {/Subtype~\pdf_name_from_unicode_e:V \l__pdffile_tmpb_tl}
+ }
+ {
+ \msg_warning:nnx { pdffile }{ mimetype-missing} {#1}
+ \tl_clear:N #2
+ }
+ }
+ }
+
+\cs_generate_variant:Nn \__pdffile_mimetype_set:nN {VN}
+
+\cs_new_protected:Npn \__pdffile_fstream_write:nN #1 #2
+ {
+ \pdf_object_unnamed_write:nx { fstream }
+ {
+ {
+ #2
+ \pdfdict_use:n { l_pdffile}
+ \pdfdict_if_empty:nF { l_pdffile/Params}
+ {
+ /Params
+ <<
+ \pdfdict_use:n { l_pdffile/Params}
+ >>
+ }
+ }
+ { #1 }
+ }
+ \tl_clear:N \l__pdffile_automimetype_tl
+ }
+
+\cs_generate_variant:Nn \__pdffile_fstream_write:nN {VN}
+
+\cs_new_protected:Npn \__pdffile_stream_write:nN #1 #2
+ {
+ \pdf_object_unnamed_write:nx { stream }
+ {
+ {
+ #2
+ \pdfdict_use:n { l_pdffile}
+ \pdfdict_if_empty:nF { l_pdffile/streamParams}
+ {
+ /Params
+ <<
+ \pdfdict_use:n { l_pdffile/streamParams}
+ >>
+ }
+ }
+ { \exp_not:n { #1 } }
+ }
+ \tl_clear:N \l__pdffile_automimetype_tl
+ }
+
+\cs_generate_variant:Nn \__pdffile_stream_write:nN {VN}
+
+\cs_new_protected:Npn \__pdffile_filespec_write:nnn #1 #2 #3
+ {
+ \tl_if_blank:nT { #2 }
+ {
+ \msg_error:nn {pdffile}{target-name-missing}
+ }
+ {
+ \pdf_object_new:nn { #1 } {dict}
+ \group_begin:
+ \__pdffile_filename_convert_to_print:nN { #2 } \l__pdffile_tmpa_str
+ \pdfdict_put:nnx {l_pdffile/FileSpec}{F} { \l__pdffile_tmpa_str }
+ \pdfdict_put:nnx {l_pdffile/FileSpec}{UF}{ \l__pdffile_tmpa_str }
+ \pdf_object_write:nx { #1 }
+ {
+ \pdfdict_use:n { l_pdffile/FileSpec}
+ \tl_if_empty:nF { #3 }
+ {
+ /EF <</F~#3 /UF~#3>>
+ }
+ }
+ \group_end:
+ }
+ }
+
+\cs_new_protected:Npn \pdffile_embed_file:nnn #1 #2 #3
+ { % if #1 empty => only filespec
+ % if #2 empty => = #1
+ \pdf_object_if_exist:nTF { #3 }
+ {
+ \msg_error:nnn { pdffile }{ object-exists } { #3 }
+ }
+ {
+ \tl_if_blank:nTF { #1 }
+ {
+ \tl_set:Nn \l__pdffile_embed_ref_tl {}
+ }
+ {
+ \file_get_full_name:nNTF {#1} \l_pdffile_source_name_str
+ {
+ \__pdffile_mimetype_set:VN
+ \l_pdffile_source_name_str
+ \l__pdffile_automimetype_tl
+ \__pdffile_fstream_write:VN
+ \l_pdffile_source_name_str
+ \l__pdffile_automimetype_tl
+ \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
+ }
+ {
+ \msg_error:nnn { pdffile }{ file-not-found }{ #1 }
+ }
+
+ }
+ \prop_gput:Nnx
+ \g_pdffile_embed_prop
+ { #3 }
+ {
+ { \tl_if_blank:nTF { #1 } {filespec}{file} }
+ {\l_pdffile_source_name_str}
+ {
+ \tl_if_blank:nTF { #2 }
+ { \l_pdffile_source_name_str }
+ { \tl_to_str:n{#2}}
+ }
+ }
+ \tl_if_blank:nTF { #2 }
+ {
+ \exp_args:Nnnx
+ \__pdffile_filespec_write:nnn
+ %#1 dict, #2 target file name, #3 object ref
+ { #3 }
+ { #1 }
+ {\l__pdffile_embed_ref_tl}
+ }
+ {
+ \exp_args:Nnnx
+ \__pdffile_filespec_write:nnn
+ %#1 dict, #2 target file name, #3 object ref
+ { #3 }
+ { #2 }
+ {\l__pdffile_embed_ref_tl}
+ }
+ }
+ }
+
+\cs_new_protected:Npn \pdffile_embed_stream:nnn #1 #2 #3
+ {
+ % if #2 empty => error
+ \pdf_object_if_exist:nTF { #3 }
+ {
+ \msg_error:nnn { pdffile }{ object-exists } { #3 }
+ }
+ {
+ \prop_gput:Nnx
+ \g_pdffile_embed_prop
+ { #3 }
+ {{stream}{}{\tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}}}}
+ \tl_if_blank:nTF {#2}
+ { \__pdffile_mimetype_set:nN {stream.txt}\l__pdffile_automimetype_tl}
+ { \__pdffile_mimetype_set:nN { #2 } \l__pdffile_automimetype_tl }
+ \__pdffile_stream_write:nN
+ { #1 }
+ \l__pdffile_automimetype_tl
+ \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
+ \exp_args:Nnxx
+ \__pdffile_filespec_write:nnn
+ %#1 dict, #2 target file name, #3 object ref
+ { #3 }
+ { \tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}} }
+ {\l__pdffile_embed_ref_tl}
+ }
+ }
+
+%%
+%%
+%% End of file `pdfmanagement-testphase.ltx'.