From 12040df23d64b7e2171cb181c7b056ca6b2fd335 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 25 Feb 2021 14:23:34 +0000 Subject: pdfmanagement-testphase runtime files (branch) git-svn-id: svn://tug.org/texlive/branches/branch2020.0@57896 c570f23f-e606-0410-a88d-b1316a301751 --- .../l3backend-testphase.lua | 143 ++ .../pdfmanagement-testphase.ltx | 1940 ++++++++++++++++++++ 2 files changed, 2083 insertions(+) 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 (limited to 'Master/texmf-dist/tex/latex/pdfmanagement-testphase') 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'. -- cgit v1.2.3