有没有一种有效的方法可以从 PDF 中复制文本而不带换行符?

有没有一种有效的方法可以从 PDF 中复制文本而不带换行符?

我需要将 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来解析当前突出显示的文本,然后使用我上面提到的sedtr命令行对其进行修改。处理后的文本然后通过 传回剪贴板xsel -bi

以下是如何在您的场景中使用该脚本的方法:

  1. 确保你已经xsel安装了(sudo apt-get install xsel在(K)Ubuntu 上)
  2. 将脚本另存为copy_without_linebreaks或类似名称并使其可执行
  3. 在 WM 偏好设置中将脚本分配给您选择的热键
  4. 突出显示一些文本并按下热键
  5. 剪贴板应自动填充修改后的文本

答案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_classclassFoxitReader您可以通过以下方式轻松找出您自己的软件的类别WinGetClass命令(AcrobatSDIWindow例如 Acrobat Reader)。

如果您更喜欢在浏览器中阅读 PDF,那么这不是您的解决方案。或者您可以简单地删除该#IfWinActive ahk_class classFoxitReader行,以便代码始终触发,但在这种情况下,结果将始终删除换行符和双空格。

答案3

对我来说,另一个可行的方法是将 pdf 文件保存为 html。html 中的段落保持完整,可供复制和粘贴。其他文件格式也可以,例如 txt 或 rtf... 这也应该适用于 Linux 系统。

答案4

显示了一个 Windows 解决方案这里。必须下载文件“PDF Copy-Paster.exe”并在复制和粘贴操作之前运行它。我试过了,它工作得很好,除了它会删除所有换行符。所以如果你复制多个段落,你以后就只有一个段落了。

有一个相关问题在 SU 上进行一点解释,可能会引起某些人的兴趣......

相关内容