改行なしでPDFからテキストをコピーする効率的な方法はありますか?


12

PDFからスプレッドシートに何千ものテキストスニペットを取得する必要があります。それらは短く、2〜3行以上はめったにありませんが、改行ごとに新しいセルが作成されるため、手動で修復する必要があり、時間がかかります。

私はそれらの多くを持っているため、「Wordに貼り付けて検索と置換を行う」回避策を使用するのは、私にとって時間の無駄です。コピー時に改行を消す方法はありますか?たぶん、これのための特別なコピーモードを提供するビューアーがあるか、プラグインがありますか?

文書は科学記事です。テキストの配置は非常に直線的です。私がコピーしているテキストは、テーブルやフロートの中になく、回転などしていないと仮定できます。(そのようなことが起こったら、私はそれを手動で処理すると思います)。テキストは2列に設定されることがよくありますが、その列から必要なテキストだけをマークしても問題ありません。特別な書式を保持する必要はありません。たとえば、すべての印刷できない文字を削除するソリューションを試してみます。テキストは英語です。ソリューションがASCIIでのみ機能する場合は問題ありません。コピーしたテキストのすべての非英数字ASCIIを削除します。

Linux、おそらくある種のOkularプラグインで動作するソリューションを非常に強く好みます。しかし、たまたまWindows専用のソリューションがある場合は、それについても聞きたいと思います。私はWindowsマシン上でやや最近のAcrobat Proのライセンスを持っています。


foxit readerで試しましたか?
カスン

2
通常、pdftotextが最適ですが、まだ後処理が必要です。linuxquestions.org/questions/programming-9/を
Nemo

@Kasun FoxitReaderまたは使用するリーダーは関係ありません。pdfファイルは改行を導入するファイルです。
イストヴァンザカール16

回答:


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、現在強調表示されたテキストを解析し、その後でそれを修正するsedと、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-sを読みたい場合、これはあなたの解決策ではありません。または、単に#IfWinActive ahk_class classFoxitReaderコードを実行するように行を削除することもできますが、この場合、結果から常に改行と二重スペースが削除されます。


以前はこれが機能していたが、今ではCtrl + Cが完全に壊れているようだ。Windows 10
マイク

@MiClそれは私の終わりでまだ動作します。どのマシン/ OS / PDFリーダーを使用していますか?変更しましたか?リーダーを更新したいですか?一方、誰が勝つ10 ...によって更新されたかを知っている
イシュトZachar

1

私にとってうまくいったもう一つのことは、pdfファイルをhtmlとして保存することでした。htmlの段落はそのままで、コピーと貼り付けの準備ができています。txtやrtfなど、他のファイル形式も同様に機能します。これはLinuxシステムでも機能するはずです。


PDFファイルをHTMLとしてどのように保存しますか?
サイモンイースト

1

マクロを使用する3番目のアプローチをここに示しますが、私は試していません。将来の参考のためにここにマクロを貼り付けました。マクロ2はソースの作成者-「デボラサバドラ」-およびマクロ1は読者の「ベンジャミン」-

マクロ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」をダウンロードし、copy&paste-actionの前に実行する必要があります。私はそれを試してみましたが、すべての改行を削除することを除いて、うまく動作します。したがって、複数の段落をコピーすると、後で1つだけになります。

SUには関連する質問があり、少し説明があります。誰かにとって興味深いかもしれません...


3つのアプローチを3つの答えに分割することを検討してください。そのように個別に投票する方が簡単です。(と、スーパーユーザーに歓迎:-)
NIK

わかった、そうするよ。(そして歓迎していただきありがとうございます)
カジモド

Windowsの10上のFoxit Readerのコピーから、私のために改行を削除していないようだ
マイク

1

これは古い質問であることは知っていますが、答える方が便利だと感じました。他のソリューションはこれほど使いやすいものではなかったからです。

Okularという名前のLinuxアプリを使用して、pdfファイルを開きます。次に、「ツール」->「表選択ツール」を選択します。次に、表形式のテキストを選択します。次に、Ctrl + Cを押すと、準備が整います。


これは、未フォーマットのLibreOffice(ctrl + shift + V)に貼り付けることで非常にうまく機能するため、テーブルは作成されません。この回答は、他の回答よりも質問との関連性が高いため(つまり、単純なLinux + Okularソリューション)、トップに近づける必要があります。
ストラグ

これを試してみたところ、特別な形式のテキストを選択して書式設定されていないテキストを選択すると、行末が表示されていました。たぶん物事は変わった。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

クレジットはKennになります。

グルタニメートのスクリプトに基づいています。

ソース:https : //github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

PDFからテキストをコピーするときに改行を削除する(Linux):

このbashスクリプトは、PDFからテキストをコピーするときに改行を削除します。Linuxのプライマリ選択とクリップボードの両方で機能します。


#!/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. スペースバーを1回押す
  9. 「すべて置換」をクリックします
  10. [OK]をクリックし、[検索と置換]ボックスを閉じます。

少し気味が悪いが、あなたの指の下にショートカットを取得すると、それははるかに高速です


1
コピーと貼り付けは信頼できません。それが問題の全体的なポイントです。検索と置換でクリーンアップする場合、thedは最初にテキストに変換しpdftotext、次に(標準の正規表現を使用して)任意のテキストエディターを使用します。
ニモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.