有没有一种有效的方法可以在不换行的情况下从PDF复制文本?


12

我需要从PDF到电子表格中获取成千上万的文本片段。它们很短,很少超过2-3行,但是每个换行符都会创建一个新的单元格,我必须手动修复它,这会花费很多时间。

因为我有很多人,所以使用“粘贴到Word中并进行查找和替换”的解决方法对我来说太浪费时间了。有没有办法使换行符在副本上消失?也许有一个为此提供特殊复制模式的查看器,或者有一个插件?

这些文件是科学文章。文字排列非常线性。您可以假定我要复制的文本不在表格或浮点数内,并且没有旋转或任何其他内容。(如果发生这种情况,我想我会手动处理)。文本通常设置在两列中,但是我不会从其列中仅标记需要的文本。我不需要保留任何特殊格式。我愿意尝试一种解决方案,例如,删除所有无法打印的字符。文本为英文,如果解决方案仅以ASCII /条带复制的文本的所有非字母数字ASCII格式工作,则可以。

对于可以在Linux上运行的解决方案(可能是某种Okular插件),我非常有偏好。但是,如果碰巧只有Windows解决方案,我也想听听。我在Windows计算机上拥有一个较新的Acrobat Pro的许可证。


您是否尝试过福昕阅读器?
卡桑2014年

2
pdftotext通常是最好的,但是您仍然需要一些后期处理。见linuxquestions.org/questions/programming-9/...
尼莫

@Kasun FoxitReader或任何使用的阅读器都不相关:pdf文件是介绍换行符的文件。
伊什特万Zachar

Answers:


5

前一段时间,我在编写文本到语音脚本时遇到了类似的问题。我的脚本将尝试通过查找换行符将文本输入分成多个部分。对于PDF文件,由于每行以换行符结尾的方式会导致混乱。

所以我所做的就是撰写了几sedtr命令只考虑了句号作为实际换行符结束换行符。它不是很漂亮,但是很有效。

使用此代码段,我为您编写了一个小脚本,希望对您有所帮助:

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

在场景中使用脚本的方法如下:

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

3

多年来一直困扰着我,因此我想出了使用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

应用此代码之前,唯一的任务是ahk_class阅读器的窗口类名称()。在所有情况下,我都使用一个PDF阅读器(并且假定大多数人都这样做),即FoxitReader,它ahk_classclassFoxitReader。您可以通过WinGetClass命令轻松地找到自己软件的类(例如AcrobatSDIWindowAcrobat Reader)。

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


以前这对我有用,但现在似乎完全破坏了Ctrl +C。10.视窗
话筒

@MiCl到最后我仍然可以使用。您使用什么机器/ OS / PDF阅读器?你有改变吗?喜欢更新您的读者吗?在另一方面,谁知道被运10更新中...
伊什特万Zachar

1

对我有用的另一件事是将pdf文件另存为html。html中的段落保持不变,可以进行复制和粘贴。其他文件格式也可以使用,例如txt或rtf。这也应在Linux系统上使用。


如何将PDF文件另存为HTML?
西蒙·伊斯特

1

这里显示使用宏的第三种方法,但是我还没有尝试过。我在此处粘贴了宏以供将来参考,宏2由来源的作者“ Deborah Savadra”撰写,宏1由她的读者“ Benjamin”撰写:

宏1:

Sub pagebreaks()
'
' pagebreaks Macro
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "^p^p"
        .Replacement.Text = "¬ ¬"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "¬"
        .Replacement.Text = " "
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

宏2:

 Sub pagebreaks()
'
' pagebreaks Macro
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "^p^p"
        .Replacement.Text = "|"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "^p"
        .Replacement.Text = " "
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "|"
        .Replacement.Text = "^p^p"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

1

有显示一个Windows的解决方案在这里。必须先下载文件“ PDF Copy-Paster.exe”,然后再执行复制和粘贴操作。我尝试了一下,它工作得很好,除了它删除了所有换行符。因此,如果您复制多个段落,则以后只有一个。

SU上有一个相关的问题,有一点点解释,这可能对某人感兴趣...


考虑将三种方法分为三个答案。这样,将它们单独投票会更容易。(并且欢迎使用Superuser :-)
尼克,2014年

好的,我会做的。(并且感谢您的欢迎)
Quasimodo 2014年

似乎并没有为我删除换行符,而是从Windows 10的Foxit Reader复制
mic

1

我知道这是一个古老的问题,但是我认为回答这个问题将很有用,因为没有其他解决方案比这个解决方案更容易使用了。

使用名为Okular的Linux应用程序打开pdf文件。然后选择工具->表格选择工具,然后选择表格形式的文本。然后按Ctrl + C,您就可以开始了。


通过将未格式化的内容粘贴到LibreOffice(ctrl + shift + V)中,效果很好,因此它不会创建表。这个答案应该使其更接近顶部,因为它比其他答案(即简单的Linux + Okular解决方案)与问题更相关。
stragu

只是尝试了一下,当我粘贴特殊文本并选择了未格式化的文本时,我仍然有行尾。也许情况已经变了。Okular是0.24.2版LibreOffice是5.1.6.2版
frederickjh

1

实际问题:https : //askubuntu.com/questions/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

幸得肯恩

基于Glutanimate的脚本。

来源:https : //github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

从PDF复制文本时删除换行符(Linux):

此bash脚本可从PDF复制文本时删除换行符。它适用于Linux的Primary Selection和Clipboard。


#!/bin/bash

# title: copy_without_linebreaks
# author: Glutanimate (github.com/glutanimate)
# modifier: Siddharth (github.com/SidMan2001)
# license: MIT license

# Parses currently selected text and removes 
# newlines

while ./clipnotify;
do
  SelectedText="$(xsel)"
  CopiedText="$(xsel -b)"
  if [[ $SelectedText != *"file:///"* ]]; then
    ModifiedTextPrimary="$(echo "$SelectedText" | tr -s '\n' ' ')"
    echo -n "$ModifiedTextPrimary" | xsel -i
  fi
  if [[ $CopiedText != *"file:///"* ]]; then
    ModifiedTextClipboard="$(echo "$CopiedText" | tr -s '\n' ' '  )"
    echo -n "$ModifiedTextClipboard" | xsel -bi
  fi
done

依存关系:

  1. Xsel
    sudo apt-get install xsel
  2. clipnotify(https://github.com/cdown/clipnotify
    您可以使用存储库中提供的预编译的clipnotify或自己编译。

编译clipnotify自己:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

要使用:

  1. 以zip格式下载此存储库,或将脚本复制并粘贴到文本编辑器中,并将其另存为copy_without_linebreaks.sh。
  2. 确保脚本和clipnotify(下载或预编译)在同一文件夹中。
  3. 在脚本文件夹中打开终端并设置权限
    chmod +x "copy_without_linebreaks.sh"
  4. 双击脚本或通过输入终端运行:
    .\copy_without_linebreaks.sh
  5. 将文本复制为pdf并将其粘贴到任何地方。换行符将被删除。

0

如果您有Acrobat,请单击光标,使光标在文本中闪烁。(如果您不这样做,将无法使用。)转到“高级”,“辅助功能”,“添加标签”。如果您的文档较大,则需要几分钟,但比手动删除中断要快得多。瞧!


-1

此页面上的简单解决方案;http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. 从PDF复制所需的文本
  2. 粘贴到新的Word文档中
  3. 点击“编辑”,然后“替换”
  4. 确保您在“查找内容”字段中
  5. 点击“更多”,然后点击“特殊”
  6. 选择“段落标记”(在列表顶部)
  7. 点击进入“替换为”字段
  8. 按下空格键一次
  9. 点击“全部替换”
  10. 单击“确定”,然后关闭“查找并替换”框。

有点忙碌,但是一旦您掌握了快捷方式,它就会更快


1
复制和粘贴不可靠,这就是问题的全部。如果要通过搜索和替换进行清理,则d将首先使用转换为文本,pdftotext然后使用他们喜欢的任何文本编辑器(使用标准正则表达式)。
Nemo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.