web-dev-qa-db-ja.com

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

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

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

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

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

12
rumtscho

しばらく前にテキスト読み上げスクリプトを作成しているときにも、同様の問題が発生しました。私のスクリプトは、改行を探すことによってテキスト入力をチャンクに分割しようとします。 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を介してクリップボードに戻されます。

シナリオでスクリプトを使用する方法は次のとおりです。

  1. xselがインストールされていることを確認してください((K)UbuntuのSudo apt-get install xsel
  2. スクリプトをcopy_without_linebreaksまたは同様の名前で保存し、実行可能にします
  3. wMプリファレンスで選択したホットキーにスクリプトを割り当てます
  4. テキストをハイライト表示して、ホットキーを押します
  5. クリップボードには、変更されたテキストが自動的に入力されます
5
Glutanimate

これは何年もの間私を悩ませてきたので、私は 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 コマンド(たとえば、Acrobat Readerの場合はAcrobatSDIWindow)を使用して、独自のソフトウェアのクラスを簡単に把握できます。

ブラウザでPDF-sを読みたい場合、これはソリューションではありません。または、単に#IfWinActive ahk_class classFoxitReader lineコードが常に実行されるようにしますが、この場合、結果は常に改行と二重スペースが取り除かれます。

3
István Zachar

ここ に示されているWindowsソリューションがあります。 「PDF Copy-Paster.exe」ファイルをダウンロードして、copy&pasteアクションの前に実行する必要があります。私はそれを試してみましたが、すべての改行が削除されることを除いて、問題なく動作します。したがって、複数の段落をコピーすると、後で1つだけになります。

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

1
Quasimodo

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

1
Quasimodo

マクロを使用した3番目のアプローチを示します here ですが、まだ試していません。将来の参考のためにここにマクロを貼り付けました。マクロ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
Quasimodo

これは古い質問であることはわかっていますが、これほど簡単に使えるソリューションは他にないので、答えるのは有益だと思いました。

Okularという名前のLinuxアプリを使用して、PDFファイルを開きます。次に、[ツール]-> [テーブル選択ツール]をクリックします。次に、テキストをテーブル形式のまま選択します。次にCtrl + Cで準備完了です。

1

実際の質問: https://askubuntu.com/questions/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

クレジットは ケン に送られます。

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

ソース: 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. クリップ通知( 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のテキストをコピーして、どこにでも貼り付けます。改行は削除されます。
1
SidMan

Acrobatを使用している場合は、カーソルをクリックして、テキスト内でカーソルを点滅させます。 (そうしないと機能しません。)[詳細設定]、[ユーザー補助]、[タグの追加]に移動します。大きなドキュメントの場合は数分かかりますが、手動で改行を削除するよりもはるかに高速です。出来上がり!

0
anon