从 PDF 复制文本时是否可以提供替代文本?第 2 部分

从 PDF 复制文本时是否可以提供替代文本?第 2 部分

跟进这个问题

对于此字体和相当多其他字体,小写字母在复制时显示为大写,如以下输出中的第 1 行和第 4 行所示。我试图覆盖每个单独的 unicode 值,使其在输出中与输入中相同,并尽可能对扩展的命令执行相同操作。也许我误解了扩展的工作原理。

  1. 这是\@tfor正确的工具吗?是否可以让它尊重空格,同时仍然单独影响每个字符?

  2. accsupp好像有更多级别的扩展。这可以扩展吗?扩展命令的正确用法是什么?是否有命令可以扩展,直到没有命令可以扩展为止?

输出

MULTIPLE WORDS OCTOBER 11, 2018
MultipleWords\today 
MultipleWords\today 
MULTIPLE WORDS OCTOBER 11, 2018
MultipleWordsOctober 11, 2018
MultipleWordsOctober 11, 2018

平均能量损失

\documentclass{report}

\usepackage{fontspec}
\setmainfont{SourceSerifPro-Regular.otf}

\usepackage{tagpdf}
\tagpdfsetup{uncompress,activate-all}

\usepackage{accsupp}

\makeatletter

\DeclareRobustCommand*{\actualtext}[1]{{%
    \@tfor\next@letter:=#1\do{%
        \tagmcbegin{tag=Span,actualtext-o=\next@letter}%
        \next@letter%
        \tagmcend%
    }%
}}%

\DeclareRobustCommand{\PDFreplace}[1]{{%
    \@tfor\next@letter:=#1\do{%
        \BeginAccSupp{method=escape,ActualText=\next@letter}%
        \next@letter%
        \EndAccSupp{}%
    }%
}}%

\makeatother

\begin{document}

{\scshape{Multiple Words \today}}

{\scshape\actualtext{Multiple Words \today}}

{\scshape\expandafter\actualtext\expandafter{Multiple Words \today}}

{\scshape{Multiple Words \today}}

{\scshape\PDFreplace{Multiple Words \today}}

{\scshape\expandafter\PDFreplace\expandafter{Multiple Words \today}}

\end{document}

答案1

我假设您的真正目标是将小写小型大写字母复制为小写字母。虽然可以使用 Actualtext 在小部分中完成此操作,但它不适用于任意文本,也许不可扩展的文本。

使用 luatex 的更好的解决方案是改变 tounicode 值:

\documentclass{report}

\usepackage{fontspec}
\setmainfont{SourceSerifPro-Regular.otf}
\usepackage{luacode}
\begin{luacode}

local scnames = { -- needs extension, can be done with a lua loop.
    ["A.sc"] = "0062",
    ["B.sc"] = "0062",
    ["C.sc"] = "0063",
    ["D.sc"] = "0064",
    ["E.sc"] = "0065",
    ["F.sc"] = "0066",
    ["G.sc"] = "0067",
    ["I.sc"] = "0069",
    ["L.sc"] = "006C",
    ["O.sc"] = "006F",
    ["P.sc"] = "0070",
    ["R.sc"] = "0072",
    ["S.sc"] = "0073",
    -- ....
    ["T.sc"] = "0074",
    ["U.sc"] = "0075",
    }


local patch_sccopy = function (fontdata)
   if fontdata.resources.unicodes then
    for k, v in pairs(fontdata.resources.unicodes) do
          if  scnames[k]  then
              fontdata.characters[v]["tounicode"] = scnames[k]
          end
    end
   end
end

luatexbase.add_to_callback
 (
  "luaotfload.patch_font",
   patch_sccopy,
  "change_copy_sclowercase"
 )
\end{luacode}
\begin{document}

{\scshape Multiple Words \today }

Copies as: Multiple Words October 12, 2018

\end{document}

我没有检查其他字体是否使用A.sc大写小写字母 A 的名称,因此现在会错误地将 A 复制为 a。如果发生这种情况,则必须将补丁限制在特定字体上。

相关内容