rum*_*cho 19 linux pdf copy-paste microsoft-excel
我需要从 PDF 中获取数千个文本片段到电子表格。它们很短,很少超过 2-3 行,但是每次换行都会创建一个新单元格,我必须手动修复它,这会花费很多时间。
因为我有这么多,使用“粘贴到 Word 中并执行查找和替换”的解决方法对我来说太浪费时间了。有没有办法让换行符在复制时消失?也许有一个查看器为此提供了特殊的复制模式,或者有一个插件?
这些文件是科学文章。文字排列相当线性。您可以假设我正在复制的文本不在表格或浮点数内,也没有旋转或任何东西。(如果发生这样的事情,我想我会手动处理)。文本通常设置在两列中,但我可以毫不费力地从其列中标记我需要的文本。我不需要保留任何特殊格式。例如,我愿意尝试一种删除所有不可打印字符的解决方案。文本是英文的,如果解决方案仅适用于 ASCII/剥离复制文本的所有非字母数字 ASCII,则可以。
我非常喜欢可以在 Linux 上运行的解决方案,可能是某种 Okular 插件。但是,如果碰巧有仅适用于 Windows 的解决方案,我也想听听。我在 Windows 机器上有一个最近的 Acrobat Pro 的许可证。
不久前我在处理文本到语音脚本时遇到了类似的问题。我的脚本会尝试通过查找换行符来将输入的文本分成块。对于 PDF 文件,由于每行以换行符结尾的方式,这会导致混乱。
所以我所做的就是撰写了几sed和tr命令只考虑了句号作为实际换行符结束换行符。它不是很漂亮,但它奏效了。
使用这个片段,我为你写了一个小脚本,希望对你有所帮助:
#!/bin/bash
# title: copy_without_linebreaks
# author: Glutanimate (github.com/glutanimate)
# license: MIT license
# Parses currently selected text and removes
# newlines that aren't preceded by a full stop
SelectedText="$(xsel)"
ModifiedText="$(echo "$SelectedText" | \
sed 's/\.$/.|/g' | sed 's/^\s*$/|/g' | tr '\n' ' ' | tr '|' '\n')"
# - first sed command: replace end-of-line full stops with '|' delimiter and keep original periods.
# - second sed command: replace empty lines with same delimiter (e.g.
# to separate text headings from text)
# - subsequent tr commands: remove existing newlines; replace delimiter with
# newlines
# This is less than elegant but it works.
echo "$ModifiedText" | xsel -bi
Run Code Online (Sandbox Code Playgroud)
该脚本使用xsel解析当前突出显示的文本,然后用修改它sed和tr我在上面提到的命令行。处理后的文本然后通过 传递回剪贴板xsel -bi。
以下是在您的场景中使用脚本的方法:
xsel安装(sudo apt-get install xsel在 (K)Ubuntu 上)copy_without_linebreaks或类似的东西并使其可执行这一直困扰着我多年,所以我想出了一个使用Autohotkey的通用(Windows)解决方案。Autohotkey 是一款适用于 Windows 的轻量级、免费、开源脚本软件,可为几乎所有可以想象的事物创建热键。
当Ctrl+c被点击时,代码仅在活动窗口是 PDF 阅读器时触发,否则它会像往常一样简单地复制给定的选择。如果是 PDF 阅读器,它会复制选择、删除换行符和双空格并将结果放入剪贴板。如果未选择任何内容,则剪贴板实际上不会受到影响。
#IfWinActive ahk_class classFoxitReader
^c::
old := ClipboardAll
clipboard := ""
send ^c
clipwait 0.1
if clipboard =
clipboard := old
else {
tmp := RegExReplace(clipboard, "(\S.*?)\R(.*?\S)", "$1 $2")
clipboard := tmp
StringReplace clipboard, clipboard, % " ", % " ", A
clipwait 0.1
}
old := ""
tmp := ""
return
Run Code Online (Sandbox Code Playgroud)
应用此代码之前的唯一任务是ahk_class阅读器的窗口类名称 ( )。我在所有情况下都使用一个 PDF 阅读器(我假设大多数人都这样做),FoxitReader,它ahk_class是classFoxitReader. 您可以通过WinGetClass命令(例如AcrobatSDIWindowAcrobat Reader)轻松找出您自己软件的类别。
如果您更喜欢在浏览器中阅读 PDF-s,这不是您的解决方案。或者您可以简单地删除该#IfWinActive ahk_class classFoxitReader行,以便代码始终触发,但在这种情况下,结果将始终去除换行符和双空格。