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

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

Ich muss Tausende von Textschnipseln aus PDFs in eine Tabelle übertragen. Sie sind kurz, selten länger als 2-3 Zeilen, aber jeder Zeilenumbruch erzeugt eine neue Zelle, und das muss ich manuell reparieren, was viel Zeit kostet.

Da ich so viele davon habe, ist mir die Umgehung „In Word einfügen und Suchen und Ersetzen“ einfach zu zeitraubend. Gibt es eine Möglichkeit, den Zeilenumbruch beim Kopieren verschwinden zu lassen? Vielleicht gibt es einen Viewer, der dafür einen speziellen Kopiermodus bietet, oder ein Plugin?

Bei den Dokumenten handelt es sich um wissenschaftliche Artikel. Die Textanordnung ist ziemlich linear. Sie können davon ausgehen, dass der Text, den ich kopiere, nicht in einer Tabelle oder einem Float steht und nicht gedreht oder so ist. (Wenn so etwas passiert, werde ich das wohl manuell erledigen.) Der Text ist häufig in zwei Spalten angeordnet, aber ich habe keine Probleme damit, nur den Text zu markieren, den ich aus der jeweiligen Spalte brauche. Ich muss keine spezielle Formatierung beibehalten. Ich bin beispielsweise bereit, eine Lösung auszuprobieren, die alle nicht druckbaren Zeichen entfernt. Die Texte sind auf Englisch, es ist in Ordnung, wenn die Lösung nur in ASCII funktioniert/alle nicht alphanumerischen ASCII-Zeichen aus dem kopierten Text 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 relativ neues Acrobat Pro auf dem Windows-Rechner.

Antwort1

Ich hatte vor einiger Zeit ein ähnliches Problem, als ich an einem Text-to-Speech-Skript arbeitete. Mein Skript versuchte, den eingegebenen Text in Blöcke aufzuteilen, indem es nach Zeilenumbrüchen suchte. Bei PDF-Dateien führte dies zu einem Durcheinander, da jede Zeile mit einem Zeilenumbruch endete.

Also habe ich ein paar Befehle verfasst sed, trdie nur Zeilenumbrüche, die mit einem Punkt enden, als echte Zeilenumbrüche betrachten. Das war zwar nicht sehr schön, aber es hat funktioniert.

Anhand dieses Snippets habe ich ein kleines Skript für Sie geschrieben, von dem ich hoffe, dass es Ihnen weiterhilft:

#!/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 markierten Text und bearbeitet ihn dann mit der oben erwähnten sedund tr-Befehlszeile. Der verarbeitete Text wird dann über an 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 unter copy_without_linebreaksoder etwas Ähnlichem und machen Sie es ausführbar
  3. Weisen Sie dem Skript in Ihren WM-Einstellungen einen Hotkey Ihrer Wahl zu
  4. Markieren Sie einen Text und drücken Sie die Tastenkombination
  5. Die Zwischenablage sollte automatisch mit dem geänderten Text gefüllt werden

Antwort2

Das nervt mich schon seit Jahren, also habe ich eine allgemeine (Windows-)Lösung gefunden mitAutohotkey. Autohotkey ist eine leichte, kostenlose Open-Source-Skriptsoftware für Windows zum Erstellen von Hotkeys für fast alles Erdenkliche.

Wenn Ctrl+ cgedrückt wird, wird der Code nur ausgeführt, wenn das aktive Fenster ein PDF-Reader ist, andernfalls kopiert er einfach wie üblich die angegebene Auswahl. Im Falle eines PDF-Readers kopiert er die Auswahl, entfernt Zeilenumbrüche und doppelte Leerzeichen und legt das Ergebnis in die Zwischenablage. 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 der Anwendung dieses Codes ist der Name der Fensterklasse (ahk_class) Ihres Readers. Ich verwende für alle Fälle einen einzigen PDF-Reader (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 ganz einfach herausfinden, indem SieWinGetClassBefehl (zB AcrobatSDIWindowfür Acrobat Reader).

Wenn Sie PDFs lieber in Ihrem Browser lesen, ist dies nicht die richtige Lösung für Sie. Oder Sie könnten die #IfWinActive ahk_class classFoxitReaderZeile einfach entfernen, sodass der Code immer ausgelöst wird. In diesem Fall wird das Ergebnis jedoch immer von Zeilenumbrüchen und doppelten Leerzeichen befreit.

Antwort3

Eine weitere Möglichkeit, die PDF-Datei als HTML zu speichern, hat bei mir funktioniert. Absätze im HTML bleiben erhalten und können kopiert und eingefügt werden. Andere Dateiformate funktionieren auch, wie txt oder rtf... Dies sollte auch auf Linux-Systemen funktionieren.

Antwort4

Es wird eine Windows-Lösung angezeigtHier. Man muss die Datei "PDF Copy-Paster.exe" herunterladen und vor der Copy&Paste-Aktion ausführen. Ich habe es ausprobiert und es funktioniert einwandfrei, außer dass es alle Zeilenumbrüche entfernt. Wenn man also mehrere Absätze kopiert, hat man später nur noch einen.

Da ist einVerwandte Frageauf SU mit einer kleinen Erklärung, vielleicht ist es für jemanden interessant ...

verwandte Informationen