From 474777ad858c2d46ba7aa86176ea5182f76e91ea Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 24 Feb 2021 23:39:12 +0000 Subject: pdfmanagement-testphase runtime files git-svn-id: svn://tug.org/texlive/branches/branch2020@57884 c570f23f-e606-0410-a88d-b1316a301751 --- .../l3backend-testphase.lua | 143 -- .../pdfmanagement-testphase.ltx | 1940 -------------------- .../l3backend-testphase.lua | 143 ++ .../pdfmanagement-testphase.ltx | 1940 ++++++++++++++++++++ Master/tlpkg/libexec/ctan2tds | 1 + 5 files changed, 2084 insertions(+), 2083 deletions(-) delete mode 100644 Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.lua delete mode 100644 Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx create mode 100644 Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase.lua create mode 100644 Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx diff --git a/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.lua b/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.lua deleted file mode 100644 index f6ae9306076..00000000000 --- a/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.lua +++ /dev/null @@ -1,143 +0,0 @@ --- --- 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/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx b/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx deleted file mode 100644 index 66293c0401e..00000000000 --- a/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx +++ /dev/null @@ -1,1940 +0,0 @@ -%% -%% 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 <> - } - } - \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'. 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 <> + } + } + \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'. diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 99387fd7c7f..3507ae8ee0a 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -2096,6 +2096,7 @@ $standardtex 'patch', '\.tex', 'pdf-trans', 'pdf-trans.tex', 'pdfcprot', '\.cpa|\.sty', + 'pdfmanagement-testphase', '\.(lua|ltx)$|' . $standardtex, 'pdftexcmds', '\.lua$|' . $standardtex, 'pdfscreen', 'overlay.*pdf|but.*pdf|left.*pdf|right\.pdf|pdfscreen.sty', 'pdfslide', '\.jpg|\.sty|\.clo|\.cfg|meta.*\.pdf', -- cgit v1.2.3