使表格内容可复制的技巧

使表格内容可复制的技巧

请看下表:

\documentclass{article}
\begin{document}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\end{document}

有哪些技术可以使该表的文本可复制(尽可能)?

例如,Evince 将其视为文本(请注意,顺序和行丢失):

11
12
21
22

(在这种情况下,Acrobat 的表现会稍微好一些,但在处理较大的表格时仍然会感到困惑)。

我探索过的一个替代方法是使用accsup。但是我不知道如何强制使用制表符(单元格之间)和新行;这不起作用:

\documentclass{article}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{ActualText=11\t 21\n 12\t 22\n} %this line produces errors
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}

我必须输入什么代码才能将其作为可复制文本11 \tab 21 \n 12 \tab 22 \n? 是否有其他技术可以帮助 PDF 查看器以更合理的方式跟踪(流动)可复制文本?


编辑accsup:我通过定义逐行替代文本取得了一些进展:

\documentclass{article}
\usepackage{accsupp}
\begin{document}
\begin{tabular}{|c|c|}
\BeginAccSupp{ActualText=11 21} 11 & 21 \EndAccSupp{} \\
\BeginAccSupp{ActualText=11 21} 12 & 22 \EndAccSupp{} \\
\end{tabular}
\end{document}

我仍然不知道如何添加制表符,但复制功能已经有所改进


编辑2:我可以用 生成制表符, \BeginAccSupp{method=hex,unicode,ActualText=0009}但是无法将其与普通文本结合。(如ActualText=a ?0009? b)。


编辑3:Heiko 的答案的逐行变体:

\documentclass{article}
\usepackage{accsupp}
\begin{document}
\begin{tabular}{|c|c|}
\BeginAccSupp{method=plain, ActualText=11\string\t 21}
11 & 21
\EndAccSupp{}\\
\BeginAccSupp{method=plain, ActualText=12\string\t 22} 
12 & 22 
\EndAccSupp{}\\
\end{tabular}
\end{document}

答案1

方法pdfstringdef

如果hyperref已加载,则可用并可以通过以下方式\pdfstringdef用于包:accsuppmethod=pdfstringdef

\documentclass{article}
\usepackage[pdfencoding=auto]{hyperref}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{
  method=pdfstringdef,
  ActualText=11\unichar{"0009}21\unichar{"000A}12\unichar{"0009}22\unichar{"000A},
}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}

\textHT可以用来代替\unichar{"000A}和。\textLF\unichar{"000A}

方法pdfstringdef是最舒适的方法,因为它支持广泛的 TeX 代码。\pdfstringdef是用于书签的相同宏。

方法plain

最危险的方法是plain,这里给出了字符串,因为它应该在扩展后出现在 PDF 文件中。要求对 PDF 或 PostScript 的字符串语法有很好的了解。

\t\n通常不能直接使用,因为它们不会扩展为自身,\t是重音命令并且\n通常未定义。这里\string(或\detokenize) 可用于将\t和转换\n为两个字符标记\andt\and \n

\documentclass{article}
\usepackage{accsupp}
\begin{document}
\BeginAccSupp{  
  method=plain,
  ActualText=11\string\t 21\string\n 12\string\t 22\string\n,
}
\begin{tabular}{|c|c|}
11 & 21 \\
12 & 22 \\
\end{tabular}
\EndAccSupp{}
\end{document}

方法escape

的风险plain是,如果反斜杠放在错误的位置或括号不匹配,则会导致 PDF 文件损坏/无效。方法escape通过转义有问题的字符来避免这种情况。因此\t\n不能以与方法相同的方式使用plain,因为反斜杠本身会被转义。相反,宏应该扩展为字符标记:

\documentclass{article}

% define \HT as horizontal tabular
\begingroup
  \lccode`\0=9\relax
\lowercase{\endgroup
  \def\HT{0}%
}

% define \LF as line feed
\begingroup
  \lccode`\0=10\relax
\lowercase{\endgroup
  \def\LF{0}%
}

\usepackage{accsupp}
\begin{document}
\BeginAccSupp{  
  method=escape,
  ActualText=11\HT 21\LF 12\HT 22\LF,
}
\begin{tabular}{|c|c|}
11 & 21 \\   
12 & 22 \\   
\end{tabular} 
\EndAccSupp{} 
\end{document}

答案2

我不是 PDF 专家。您认为 PDF 包含表格之类的内容,这种观点似乎值得怀疑。我认为 PDF 中没有表格,只有规则和字形。

第一步:复制 PDF 的内容。复制什么?复制内容,无论 PDF 中的内容是什么:字形、图形。有些软件能够用信息丰富将传输到剪贴板的内容。例如,我的旧版 Acrobat Pro 提供将文本“复制为表格”的功能。但这取决于 PDF 的查看器。据我所知,没有办法将 PDF 中的表格标记为“TABLE”。

现在,你把剪贴板的内容粘贴到另一个软件中。也许这个软件会分析剪贴板的内容并识别出表格的轮廓。

在某些情况下使用该命令似乎有所改进\pdfinterwordspaceon,但我自己的测试显示结果不佳。

所以:如果您希望共享表格,请不要将它们打印成 PDF。

相关内容