Gibt es eine effiziente Möglichkeit, Text aus einem PDF-Dokument ohne Zeilenumbrüche zu kopieren?

11

Ich muss Tausende von Textausschnitten aus PDFs in eine Tabellenkalkulation übertragen. Sie sind kurz, selten mehr als 2-3 Zeilen, aber jeder Zeilenumbruch erzeugt eine neue Zelle, und ich muss diese manuell reparieren, was viel Zeit kostet.

Weil ich so viele davon habe, ist es mir einfach zu zeitaufwändig, die Problemumgehung "Einfügen in Word und Suchen und Ersetzen" zu verwenden. Gibt es eine Möglichkeit, den Zeilenumbruch beim Kopieren verschwinden zu lassen? Vielleicht gibt es einen Viewer, der dafür einen speziellen Kopiermodus anbietet, oder ein Plugin?

Die Dokumente sind wissenschaftliche Artikel. Die Textanordnung ist ziemlich linear. Sie können davon ausgehen, dass sich der von mir kopierte Text nicht in einer Tabelle oder einem Gleitkomma befindet und nicht gedreht wurde. (Wenn so etwas passiert, denke ich, dass ich es manuell erledigen werde). Der Text wird häufig in zwei Spalten gesetzt, aber ich habe keine Probleme, nur den Text zu markieren, den ich aus seiner Spalte benötige. Ich muss keine spezielle Formatierung beibehalten. Ich bin bereit, eine Lösung auszuprobieren, die zum Beispiel alle nicht druckbaren Zeichen entfernt. Die Texte sind in englischer Sprache, es ist in Ordnung, wenn die Lösung nur in ASCII funktioniert / alle nicht-alphanumerischen ASCII-Zeichen des kopierten Textes entfernt.

Ich bevorzuge eine Lösung, die unter Linux funktioniert, möglicherweise eine Art Okular-Plugin. Aber wenn es eine reine Windows-Lösung gibt, möchte ich auch davon erfahren. Ich habe eine Lizenz für ein etwas neues Acrobat Pro auf dem Windows-Rechner.

rumtscho
quelle
Hast du es mit foxit reader versucht?
Kasun
2
pdftotext ist im Allgemeinen das Beste, aber Sie müssen noch etwas nachbearbeiten. Siehe linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader oder welcher Reader auch immer verwendet wird, ist irrelevant: Die PDF-Datei enthält die Zeilenumbrüche.
István Zachar

Antworten:

5

Ich hatte vor einiger Zeit ein ähnliches Problem, als ich an einem Text-zu-Sprache-Skript arbeitete. Mein Skript würde versuchen, die Texteingabe durch Suchen nach Zeilenumbrüchen in Blöcke aufzuteilen. Bei PDF-Dateien würde dies zu einem Durcheinander führen, da jede Zeile mit einer neuen Zeile endet.

Also habe ich ein paar Zeilen sedund trBefehle geschrieben, um nur Zeilenumbrüche zu berücksichtigen, die mit einem Punkt enden. Es war nicht sehr hübsch, aber es hat funktioniert.

Mit diesem Snippet habe ich ein kleines Skript für Sie geschrieben, von dem ich hoffe, dass es helfen wird:

#!/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

Das Skript xselanalysiert den aktuell hervorgehobenen Text und ändert ihn dann mit der oben erwähnten Befehlszeile sedund tr. Der verarbeitete Text wird dann über in die Zwischenablage zurückgegeben xsel -bi.

So können Sie das Skript in Ihrem Szenario verwenden:

  1. Stellen Sie sicher, dass Sie xsel( sudo apt-get install xselauf (K) Ubuntu) installiert haben
  2. Speichern Sie das Skript als copy_without_linebreaksoder ähnlich und machen Sie es ausführbar
  3. Weisen Sie das Skript in Ihren WM-Einstellungen einem Hotkey Ihrer Wahl zu
  4. Markieren Sie einen Text und drücken Sie den Hotkey
  5. Die Zwischenablage sollte automatisch mit dem geänderten Text gefüllt werden
Glutanimate
quelle
3

Das nervt mich schon seit Jahren, deshalb habe ich mit Autohotkey eine allgemeine (Windows-) Lösung gefunden . Autohotkey ist eine kompakte, kostenlose Open-Source-Skriptsoftware für Windows, mit der Sie Hotkeys für fast alles erstellen können, was Sie sich vorstellen können.

Wenn Ctrl+ cgedrückt wird, wird der Code nur ausgelöst, wenn das aktive Fenster ein PDF-Reader ist. Andernfalls wird die angegebene Auswahl einfach wie gewohnt kopiert. Bei einem PDF-Reader wird die Auswahl kopiert, Zeilenumbrüche und doppelte Leerzeichen entfernt und das Ergebnis in die Zwischenablage kopiert. Wenn nichts ausgewählt ist, bleibt die Zwischenablage praktisch unberührt.

#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

Die einzige Aufgabe vor dem Anwenden dieses Codes ist der Fensterklassenname ( ahk_class) Ihres Lesers. Ich benutze einen einzigen PDF-Reader für alle Fälle (und ich gehe davon aus, dass die meisten Leute das tun), FoxitReader, und es ahk_classist classFoxitReader. Sie können die Klasse für Ihre eigene Software einfach mit dem WinGetClassBefehl herausfinden (z. B. AcrobatSDIWindowfür Acrobat Reader).

Wenn Sie PDF-Dateien lieber in Ihrem Browser lesen möchten, ist dies nicht Ihre Lösung. Sie können die #IfWinActive ahk_class classFoxitReaderZeile auch einfach entfernen , sodass der Code immer ausgelöst wird. In diesem Fall werden jedoch Zeilenumbrüche und doppelte Leerzeichen entfernt.

István Zachar
quelle
Früher hat das bei mir funktioniert, jetzt scheint es nur noch Strg + C zu brechen. Windows 10.
mic
@MiCl Es funktioniert immer noch an meinem Ende. Welche Maschine / OS / PDF-Reader verwenden Sie? Hast du etwas geändert? Möchten Sie Ihren Reader aktualisieren? Auf der anderen Seite, wer weiß, was von Win 10 aktualisiert wurde ...
István Zachar
1

Eine andere Sache, die für mich geklappt hat, war das Speichern der PDF-Datei als HTML. Absätze in HTML bleiben intakt und können kopiert und eingefügt werden. Andere Dateiformate wie txt oder rtf funktionieren ebenfalls. Dies sollte auch auf Linux-Systemen funktionieren.

Quasimodo
quelle
1

Ein dritter Ansatz mit Makros wird hier gezeigt , aber ich habe es nicht ausprobiert. Ich habe die Makros zur späteren Bezugnahme hier eingefügt. Makro 2 stammt vom Autor der Quelle - "Deborah Savadra" - und Makro 1 von ihrem Leser "Benjamin":

Makro 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

Makro 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
Quasimodo
quelle
1

Es ist eine Windows - Lösung gezeigt hier . Man muss die Datei "PDF Copy-Paster.exe" herunterladen und vor dem Kopieren & Einfügen ausführen. Ich habe es ausprobiert und es funktioniert einwandfrei, außer dass es alle Zeilenumbrüche entfernt. Wenn Sie also mehrere Absätze kopieren, haben Sie später nur einen.

Es gibt eine verwandte Frage zu SU mit einer kleinen Erklärung, die für jemanden von Interesse sein könnte ...

Quasimodo
quelle
Teilen Sie Ihre drei Ansätze in drei Antworten auf. Es wird einfacher sein, sie auf diese Weise einzeln abzustimmen. (und, willkommen bei Superuser :-))
Nik
OK, ich werde es machen. (und danke für die Begrüßung)
Quasimodo
Scheint keine Zeilenumbrüche für mich zu beseitigen, kopiert von Foxit Reader auf Windows 10
mic
1

Ich weiß, dass dies eine alte Frage ist, aber ich hielt es für nützlich, sie zu beantworten, da keine andere Lösung so einfach zu bedienen war wie diese.

Verwenden Sie die Linux-App namens Okular, um Ihre PDF-Datei zu öffnen. Klicken Sie dann auf Extras-> Tabellenauswahlwerkzeug. Wählen Sie dann Ihren Text in Tabellenform aus. Dann Strg + C und los geht's.

Arvanitis Christos
quelle
Dies funktioniert sehr gut, wenn Sie unformatierte Dateien in LibreOffice einfügen (Strg + Umschalt + V), sodass keine Tabelle erstellt wird. Diese Antwort sollte näher an die Spitze rücken, da sie für die Frage relevanter ist als andere Antworten (dh eine einfache Linux + Okular-Lösung).
stragu
Habe gerade versucht, und ich hatte immer noch die Zeilenenden, als ich speziellen und ausgewählten unformatierten Text einfügte. Vielleicht haben sich die Dinge geändert. OkularName ist Version 0.24.2 Libreoffice ist die Version 5.1.6.2
frederickjh
1

Aktuelle Frage: https://askubuntu.com/questions/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Gutschrift geht an Kenn .

Basierend auf dem Skript von Glutanimate.

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

Zeilenumbrüche beim Kopieren von Text aus PDF entfernen (Linux):

Dieses Bash-Skript entfernt Zeilenumbrüche beim Kopieren von Text aus PDF. Es funktioniert sowohl für die primäre Auswahl als auch für die Zwischenablage von 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

Abhängigkeiten:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Sie können das im Repository bereitgestellte vorkompilierte clipnotify verwenden oder es selbst kompilieren.

So kompilieren Sie clipnotify:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Benutzen :

  1. Laden Sie dieses Repository als zip herunter oder kopieren Sie das Skript und fügen Sie es in einen Texteditor ein und speichern Sie es als copy_without_linebreaks.sh.
  2. Stellen Sie sicher, dass sich Skript und clipnotify (heruntergeladen oder vorkompiliert) im selben Ordner befinden.
  3. Öffnen Sie das Terminal im Skriptordner und legen Sie die Berechtigung fest
    chmod +x "copy_without_linebreaks.sh"
  4. Doppelklicken Sie auf das Skript oder führen Sie es aus, indem Sie Folgendes in das Terminal eingeben:
    .\copy_without_linebreaks.sh
  5. Kopieren Sie den Text im PDF-Format und fügen Sie ihn an einer beliebigen Stelle ein. Zeilenumbrüche werden entfernt.
SidMan
quelle
0

Wenn Sie Acrobat verwenden, klicken Sie mit dem Cursor, sodass der Cursor im Text blinkt. (Andernfalls funktioniert es nicht.) Gehen Sie zu Erweitert, Eingabehilfen, Tags hinzufügen. Wenn Sie ein großes Dokument haben, dauert es einige Minuten, aber viel schneller als das manuelle Entfernen von Pausen. Voila!

anon
quelle
-1

Einfache Lösung von dieser Seite; http://www.iom3.org/news/how-instant-remove-unwanted-line-breaks-when-copying-pdf

  1. Kopieren Sie den gewünschten Text aus der PDF-Datei
  2. Einfügen in ein neues Word-Dokument
  3. Klicken Sie auf "Bearbeiten" und dann auf "Ersetzen".
  4. Stellen Sie sicher, dass Sie sich im Feld "Suchen nach" befinden
  5. Klicken Sie auf "mehr" und dann auf "besonders".
  6. Wählen Sie "Absatzmarke" (oben in der Liste)
  7. Klicken Sie in das Feld "Ersetzen durch"
  8. drücke die Leertaste einmal
  9. Klicken Sie auf "Alle ersetzen"
  10. Klicken Sie auf "OK" und schließen Sie das Feld "Suchen & Ersetzen".

Etwas schwammig, aber sobald Sie die Verknüpfungen unter Ihren Fingern haben, geht es viel schneller

Sunner
quelle
1
Kopieren und Einfügen ist nicht zuverlässig, das ist der springende Punkt. Wenn Sie durch Suchen und Ersetzen aufräumen möchten, konvertieren Sie diese zuerst in Text pdftotextund verwenden dann einen beliebigen Texteditor (mit Standard-Regex).
Nemo