我需要将 PDF 中的数千个文本片段导入电子表格。它们很短,很少超过 2-3 行,但每次换行都会创建一个新单元格,我必须手动修复它,这会花费大量时间。
因为我有太多这样的文件,所以使用“粘贴到 Word 中并进行查找和替换”的解决方法对我来说太浪费时间了。有没有办法让换行符在复制时消失?也许有一个查看器可以提供特殊的复制模式,或者有一个插件?
这些文档是科学文章。文本排列非常线性。您可以假设我复制的文本不在表格或浮动内,也没有旋转或任何其他内容。(如果发生这种情况,我想我会手动处理它)。文本通常设置在两列中,但我可以轻松地从其列中标记我需要的文本。我不需要保留任何特殊格式。例如,我愿意尝试一种删除所有不可打印字符的解决方案。文本是英文的,如果解决方案仅适用于 ASCII/删除复制文本的所有非字母数字 ASCII,则可以。
我非常希望找到一种可以在 Linux 上运行的解决方案,可能是某种 Okular 插件。但如果碰巧有仅适用于 Windows 的解决方案,我也想听听。我在 Windows 机器上有一个较新的 Acrobat Pro 许可证。
答案1
不久前,我在编写文本转语音脚本时遇到了类似的问题。我的脚本会尝试通过查找换行符将文本输入拆分成块。对于 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
该脚本使用xsel
来解析当前突出显示的文本,然后使用我上面提到的sed
和tr
命令行对其进行修改。处理后的文本然后通过 传回剪贴板xsel -bi
。
以下是如何在您的场景中使用该脚本的方法:
- 确保你已经
xsel
安装了(sudo apt-get install xsel
在(K)Ubuntu 上) - 将脚本另存为
copy_without_linebreaks
或类似名称并使其可执行 - 在 WM 偏好设置中将脚本分配给您选择的热键
- 突出显示一些文本并按下热键
- 剪贴板应自动填充修改后的文本
答案2
这个问题困扰了我好几年,所以我想出了一个通用的(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
应用此代码之前的唯一任务是窗口类名称(ahk_class
) 阅读器。我在所有情况下都使用一个 PDF 阅读器(我假设大多数人都这样做),FoxitReader,它是ahk_class
。classFoxitReader
您可以通过以下方式轻松找出您自己的软件的类别WinGetClass
命令(AcrobatSDIWindow
例如 Acrobat Reader)。
如果您更喜欢在浏览器中阅读 PDF,那么这不是您的解决方案。或者您可以简单地删除该#IfWinActive ahk_class classFoxitReader
行,以便代码始终触发,但在这种情况下,结果将始终删除换行符和双空格。
答案3
对我来说,另一个可行的方法是将 pdf 文件保存为 html。html 中的段落保持完整,可供复制和粘贴。其他文件格式也可以,例如 txt 或 rtf... 这也应该适用于 Linux 系统。