Czy istnieje skuteczny sposób kopiowania tekstu z pliku PDF bez podziału linii?

12

Potrzebuję przenieść tysiące fragmentów tekstu z plików PDF do arkusza kalkulacyjnego. Są krótkie, rzadko więcej niż 2-3 rzędy, ale każdy podział linii tworzy nową komórkę i muszę ją naprawić ręcznie, co kosztuje dużo czasu.

Ponieważ mam ich tak wiele, użycie metody „wklej do programu Word i wykonaj operację znajdowania i zastępowania” jest dla mnie zbyt czasochłonne. Czy istnieje sposób, aby podział linii zniknął podczas kopiowania? Może istnieje przeglądarka, która oferuje do tego specjalny tryb kopiowania lub ma wtyczkę?

Dokumenty są artykułami naukowymi. Układ tekstu jest dość liniowy. Możesz założyć, że tekst, który kopiuję, nie znajduje się w tabeli ani na liczbach zmiennoprzecinkowych, nie jest obrócony ani nic. (Jeśli coś takiego się wydarzy, myślę, że poradzę sobie z tym ręcznie). Tekst jest często ustawiany w dwóch kolumnach, ale nie mam problemu z zaznaczeniem tylko tekstu, którego potrzebuję z jego kolumny. Nie muszę zachowywać żadnego specjalnego formatowania. Jestem gotów wypróbować rozwiązanie, które usuwa na przykład wszystkie niedrukowalne znaki. Teksty są w języku angielskim, jest OK, jeśli rozwiązanie działa tylko w ASCII / usuwa wszystkie niealfanumeryczne ASCII kopiowanego tekstu.

Mam bardzo silną preferencję dla rozwiązania, które będzie działać na Linuksie, być może jakiejś wtyczki Okular. Ale jeśli zdarzy się rozwiązanie tylko dla systemu Windows, chcę o tym również usłyszeć. Mam licencję na nieco nową wersję programu Acrobat Pro na komputerze z systemem Windows.

rumtscho
źródło
Czy próbowałeś z czytnikiem Foxit?
Kasun,
2
pdftotext jest na ogół najlepszy, ale nadal będziesz potrzebować dodatkowej obróbki. Zobacz linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader lub jakikolwiek czytnik, którego używa, jest nieistotny: plik pdf to ten, który wprowadza łamanie wierszy.
István Zachar

Odpowiedzi:

5

Miałem podobny problem, gdy jakiś czas temu pracowałem nad skryptem zamiany tekstu na mowę. Mój skrypt próbowałby rozdzielić wprowadzanie tekstu na części, szukając znaków nowej linii. W przypadku plików PDF spowodowałoby to bałagan z powodu sposobu, w jaki każda linia kończy się nową linią.

Więc to, co zrobiłem, to skomponowałem kilka poleceń sedi trrozważyłem tylko znaki nowej linii kończące się kropką jako rzeczywiste łamanie linii. To nie było bardzo ładne, ale zadziałało.

Za pomocą tego fragmentu napisałem dla ciebie mały skrypt, który mam nadzieję pomoże:

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

Skrypt używa xseldo parsowania aktualnie podświetlonego tekstu, a następnie modyfikuje go za pomocą wspomnianego powyżej wiersza polecenia sedi tr. Przetworzony tekst jest następnie przekazywany z powrotem do schowka za pośrednictwem xsel -bi.

Oto jak możesz użyć skryptu w swoim scenariuszu:

  1. Upewnij się, że xselzainstalowałeś ( sudo apt-get install xselna (K) Ubuntu)
  2. zapisz skrypt jako copy_without_linebreakslub coś podobnego i uczyń go wykonywalnym
  3. przypisz skrypt do wybranego skrótu w swoich preferencjach WM
  4. zaznacz tekst i naciśnij klawisz skrótu
  5. Schowek powinien zostać automatycznie wypełniony zmodyfikowanym tekstem
Glutanimate
źródło
3

Przez lata mnie to denerwowało , więc wymyśliłem ogólne rozwiązanie (Windows) za pomocą Autohotkey . Autohotkey to lekkie, bezpłatne oprogramowanie skryptowe o otwartym kodzie źródłowym dla systemu Windows do tworzenia skrótów klawiszowych dla prawie wszystkiego, co można sobie wyobrazić.

Po naciśnięciu przycisku Ctrl+ ckod jest uruchamiany tylko wtedy, gdy aktywne okno jest czytnikiem plików PDF, w przeciwnym razie po prostu kopiuje podany wybór w zwykły sposób. W przypadku czytnika PDF kopiuje zaznaczenie, usuwa przełamania linii i podwójne spacje oraz umieszcza wynik w schowku. Jeśli nic nie jest zaznaczone, schowek jest praktycznie nietknięty.

#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

Jedynym zadaniem przed zastosowaniem tego kodu jest nazwa klasy okna ( ahk_class) czytnika. Używam jednego czytnika plików PDF dla wszystkich przypadków (i zakładam, że większość ludzi to robi), FoxitReader i tak ahk_classjest classFoxitReader. Możesz łatwo obliczyć klasę własnego oprogramowania za pomocą WinGetClasspolecenia (np. AcrobatSDIWindowDla Acrobat Reader).

Jeśli wolisz czytać pliki PDF w przeglądarce, to nie jest twoje rozwiązanie. Lub możesz po prostu usunąć #IfWinActive ahk_class classFoxitReaderlinię, aby kod zawsze uruchamiał się, ale w tym przypadku wynik zawsze będzie pozbawiony podziałów linii i podwójnych spacji.

István Zachar
źródło
Kiedyś działało to dla mnie wcześniej, ale teraz wydaje się, że całkowicie łamie Ctrl + C. Windows 10.
mikrofon
@MiCl To wciąż działa na moim końcu. Jakiego urządzenia / czytnika plików PDF / OS używasz? Zmieniłeś coś? Lubisz aktualizować swój czytnik? Z drugiej strony, kto wie, co zaktualizował Win 10 ...
István Zachar
1

Kolejną rzeczą, która mi się sprawdziła, było zapisanie pliku pdf jako html. Akapity w html pozostają nienaruszone, gotowe do skopiowania i wklejenia. Inne formaty plików również działają, takie jak txt lub rtf ... Powinno to również działać w systemach Linux.

Quasimodo
źródło
Jak zapisać plik PDF jako HTML?
Simon East
1

Trzecie podejście z wykorzystaniem makr zostało pokazane tutaj , ale nie próbowałem tego. Wkleiłem tutaj makra na przyszłość, makro 2 autorstwa autora źródła - „Deborah Savadra” - a makro 1 jej czytelnika „Benjamina”:

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
źródło
1

Istnieje rozwiązanie Okna pokazane tutaj . Należy pobrać plik „PDF Copy-Paster.exe” i uruchomić go przed kopiowaniem i wklejaniem. Wypróbowałem to i działa dobrze, oprócz tego, że usuwa wszystkie łamania linii. Więc jeśli skopiujesz wiele akapitów, później będziesz miał tylko jeden.

Jest powiązane pytanie na temat SU z drobnym wyjaśnieniem, może być interesujące dla kogoś ...

Quasimodo
źródło
rozważ podzielenie trzech podejść na trzy odpowiedzi. W ten sposób będzie łatwiej głosować indywidualnie. (i witamy w Superuser :-))
nik
OK, zrobię to. (i dziękuję za powitanie)
Quasimodo,
Wydaje się, że nie usuwa podziałów wierszy dla mnie, kopiowanie z Foxit Reader na Windows 10
mic
1

Wiem, że to stare pytanie, ale czułem, że warto byłoby na nie odpowiedzieć, ponieważ żadne inne rozwiązanie nie było tak łatwe w użyciu jak to.

Użyj aplikacji linux o nazwie Okular, aby otworzyć plik pdf. Następnie Narzędzia-> Narzędzie do wyboru tabeli, a następnie zaznacz tekst w formie tabeli. Następnie Ctrl + C i jesteś gotowy do pracy.

Arvanitis Christos
źródło
Działa to bardzo dobrze, wklejając niesformatowane do LibreOffice (ctrl + shift + V), aby nie tworzyło tabeli. Ta odpowiedź powinna przybliżyć ją do szczytu, ponieważ jest bardziej adekwatna do pytania niż inne odpowiedzi (np. Proste rozwiązanie Linux + Okular).
stragu 18.07.17
Po prostu spróbowałem tego i nadal miałem zakończenia linii, kiedy wkleiłem specjalny i wybrałem niesformatowany tekst. Może coś się zmieniło. Okular to wersja 0.24.2 LibreOffice to wersja 5.1.6.2
frederickjh
1

Rzeczywiste pytanie: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Kredyt trafia do Kenna .

Na podstawie skryptu Glutanimate.

Źródło: https://github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

Usuń podział wiersza podczas kopiowania tekstu z pliku PDF (Linux):

Ten skrypt bash usuwa podziały wierszy podczas kopiowania tekstu z pliku PDF. Działa zarówno w przypadku wyboru podstawowego, jak i Schowka systemu 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

Zależności:

  1. Xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Możesz użyć wstępnie skompilowanego clipnotify podanego w repozytorium lub skompilować się samodzielnie.

Aby skompilować klip, powiadom się:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Używać :

  1. Pobierz to repozytorium jako zip lub skopiuj i wklej skrypt w edytorze tekstu i zapisz go jako copy_without_linebreaks.sh.
  2. Upewnij się, że skrypt i clipnotify (pobrane lub wstępnie skompilowane) znajdują się w tym samym folderze.
  3. Otwórz terminal w folderze skryptu i ustaw uprawnienia
    chmod +x "copy_without_linebreaks.sh"
  4. Kliknij dwukrotnie skrypt lub uruchom, wprowadzając terminal:
    .\copy_without_linebreaks.sh
  5. Skopiuj tekst w pdf i wklej go w dowolnym miejscu. Podziały linii zostaną usunięte.
SidMan
źródło
0

Jeśli masz program Acrobat, kliknij kursor, aby kursor migał w tekście. (To nie zadziała, jeśli tego nie zrobisz.) Przejdź do Zaawansowane, Dostępność, Dodaj tagi. Jeśli masz duży dokument, zajmie to kilka minut, ale znacznie szybciej niż ręczne usuwanie przerw. Voila!

zaraz
źródło
-1

Proste rozwiązanie z tej strony; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. skopiuj żądany tekst z pliku PDF
  2. wklej do nowego dokumentu Word
  3. kliknij „edytuj”, a następnie „zamień”
  4. upewnij się, że jesteś w polu „znajdź co”
  5. kliknij „więcej” niż „specjalne”
  6. wybierz „znak akapitu” (na górze listy)
  7. kliknij pole „zamień na”
  8. naciśnij raz spację
  9. kliknij „zamień wszystko”
  10. kliknij „ok”, a następnie zamknij pole „znajdź i zamień”.

Nieco dziwaczny, ale kiedy dostaniesz skróty pod palcami, jest to znacznie szybsze

Sunner
źródło
1
Kopiowanie i wklejanie nie jest wiarygodne, o to właśnie chodzi. Jeśli ktoś chce oczyścić przez wyszukiwanie i zamianę, najpierw skonwertuje na tekst, pdftotexta następnie użyje dowolnego edytora tekstu, który mu się podoba (ze standardowym wyrażeniem regularnym).
Nemo