Apakah ada cara yang efisien untuk menyalin teks dari PDF tanpa jeda baris?

11

Saya perlu mendapatkan ribuan potongan teks dari PDF ke spreadsheet. Mereka pendek, jarang lebih dari 2-3 baris, tetapi setiap jeda baris membuat sel baru, dan saya harus memperbaikinya secara manual, yang menghabiskan banyak waktu.

Karena saya memiliki begitu banyak dari mereka, menggunakan solusi "tempelkan ke Word dan temukan-dan-ganti" terlalu menyita waktu bagi saya. Apakah ada cara untuk menghilangkan garis putus pada salinan? Mungkin ada pemirsa yang menawarkan mode salin khusus untuk ini, atau memiliki plugin?

Dokumen-dokumen tersebut adalah artikel ilmiah. Pengaturan teksnya cukup linier. Anda dapat mengasumsikan bahwa teks yang saya salin tidak ada di dalam tabel atau float, dan tidak diputar atau apa pun. (Jika hal seperti itu terjadi, saya pikir saya akan menghadapinya secara manual). Teks sering diatur dalam dua kolom, tetapi saya tidak kesulitan menandai hanya teks yang saya butuhkan dari kolomnya. Saya tidak perlu menyimpan format khusus apa pun. Saya bersedia mencoba solusi yang menghapus semua karakter yang tidak patut dicetak, misalnya. Teksnya dalam bahasa Inggris, tidak apa-apa jika solusinya hanya bekerja di ASCII / menghapus semua ASCII non-alfanumerik dari teks yang disalin.

Saya memiliki preferensi yang sangat kuat untuk solusi yang akan bekerja di Linux, mungkin semacam plugin Okular. Tetapi jika kebetulan ada solusi Windows saja, saya ingin mendengarnya juga. Saya memiliki lisensi untuk Acrobat Pro yang agak baru di mesin Windows.

rumtscho
sumber
Apakah Anda mencoba dengan pembaca foxit?
Kasun
2
pdftotext umumnya yang terbaik, tetapi Anda masih memerlukan beberapa pemrosesan pasca. Lihat linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader atau apa pun yang digunakan pembaca tidak relevan: file pdf adalah yang memperkenalkan linebreak.
István Zachar

Jawaban:

5

Saya memiliki masalah yang sama ketika saya sedang mengerjakan naskah text to speech beberapa waktu lalu. Script saya akan mencoba memecah input teks menjadi potongan-potongan dengan mencari baris baru. Dengan file PDF ini akan menghasilkan kekacauan karena cara setiap baris berakhir dengan baris baru.

Jadi apa yang saya lakukan adalah menulis beberapa seddan trmemerintahkan untuk hanya mempertimbangkan baris baru yang diakhiri dengan berhenti penuh saat garis yang sebenarnya terputus. Itu tidak terlalu cantik tapi berhasil.

Dengan menggunakan cuplikan ini saya menulis sebuah skrip kecil untuk Anda yang saya harap akan membantu:

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

Script digunakan xseluntuk mem-parsing teks yang sedang disorot dan kemudian memodifikasinya dengan seddan trbaris perintah yang saya sebutkan di atas. Teks yang diproses kemudian diteruskan kembali ke clipboard via xsel -bi.

Inilah cara Anda dapat menggunakan skrip dalam skenario Anda:

  1. Pastikan Anda telah xselmenginstal ( sudo apt-get install xselpada (K) Ubuntu)
  2. simpan skrip sebagai copy_without_linebreaksatau sesuatu yang serupa dan membuatnya dapat dieksekusi
  3. tetapkan skrip ke hotkey pilihan Anda di preferensi WM Anda
  4. sorot beberapa teks dan tekan tombol pintas
  5. Papan klip harus secara otomatis diisi dengan teks yang dimodifikasi
Glutanimate
sumber
3

Ini telah mengganggu saya selama bertahun-tahun, jadi saya menemukan solusi umum (Windows) menggunakan Autohotkey . Autohotkey adalah perangkat lunak scripting open-source yang ringan, gratis, untuk Windows untuk membuat hotkey untuk hampir semua hal yang dapat dibayangkan.

Ketika Ctrl+ cdipukul, kode hanya akan menyala jika jendela aktif adalah pembaca PDF, jika tidak, ia hanya menyalin pilihan yang diberikan seperti biasa. Dalam hal pembaca PDF, itu menyalin pilihan, menghapus linebreak dan spasi ganda dan menempatkan hasilnya ke clipboard. Jika tidak ada yang dipilih, clipboard praktis tidak tersentuh.

#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

Satu-satunya tugas sebelum menerapkan kode ini adalah nama kelas jendela ( ahk_class) pembaca Anda. Saya menggunakan satu pembaca PDF untuk semua kasus (dan saya berasumsi kebanyakan orang melakukan itu), FoxitReader, dan ahk_classini classFoxitReader. Anda dapat mengetahui kelas untuk perangkat lunak Anda sendiri dengan mudah dengan WinGetClassperintah (misalnya AcrobatSDIWindowuntuk Acrobat Reader).

Jika Anda lebih suka membaca PDF-s di browser Anda, ini bukan solusi Anda. Atau Anda cukup menghapus #IfWinActive ahk_class classFoxitReaderbaris sehingga kode selalu menyala, tetapi dalam hal ini hasilnya akan selalu dilucuti dari linebreak dan spasi ganda.

István Zachar
sumber
Ini dulu bekerja untuk saya sebelumnya, tapi sekarang sepertinya hanya memecah Ctrl + C sepenuhnya. Windows 10.
mic
@MiCl Ini masih berfungsi pada saya. Mesin / OS / PDF reader apa yang Anda gunakan? Apakah Anda mengubah sesuatu? Suka memperbarui pembaca Anda? Di sisi lain, siapa yang tahu apa yang diperbarui oleh Win 10 ...
István Zachar
1

Hal lain yang berhasil bagi saya adalah menyimpan file pdf sebagai html. Paragraf di html tetap utuh, siap untuk salin & tempel. Format file lain juga berfungsi, seperti txt atau rtf ... Ini juga harus bekerja pada sistem Linux.

Quasimodo
sumber
1

Pendekatan ketiga menggunakan makro ditunjukkan di sini , tapi saya belum mencobanya. Saya menempelkan makro di sini untuk referensi di masa mendatang, makro 2 oleh penulis sumber - "Deborah Savadra" - dan makro 1 oleh pembacanya "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
sumber
1

Ada solusi Windows yang ditampilkan di sini . Kita harus mengunduh file "Copy-Paster.exe" dan menjalankannya sebelum tindakan copy & paste. Saya mencobanya dan berfungsi dengan baik, kecuali bahwa itu menghilangkan semua linebreak. Jadi, jika Anda menyalin beberapa paragraf, nanti hanya ada satu paragraf.

Ada pertanyaan terkait pada SU dengan penjelasan littlebit, mungkin menarik bagi seseorang ...

Quasimodo
sumber
pertimbangkan untuk membagi tiga pendekatan Anda menjadi tiga jawaban. Akan lebih mudah untuk memilih mereka secara individual dengan cara itu. (dan, selamat datang di Superuser :-))
nik
ok, saya akan melakukannya. (dan terima kasih atas sambutannya)
Quasimodo
Tampaknya tidak menghapus jeda baris bagi saya, menyalin dari Foxit Reader pada Windows 10
mic
1

Saya tahu ini adalah pertanyaan lama, namun saya merasa akan berguna untuk menjawabnya karena tidak ada solusi lain yang mudah digunakan seperti ini.

Gunakan aplikasi linux bernama Okular untuk membuka file pdf Anda. Kemudian Tools-> Table selection tool. Kemudian pilih teks Anda seperti dalam bentuk tabel. Kemudian Ctrl + C dan Anda siap untuk pergi.

Arvanitis Christos
sumber
Ini bekerja dengan sangat baik dengan menempelkan yang tidak diformat ke dalam LibreOffice (ctrl + shift + V) sehingga tidak membuat tabel. Jawaban ini harus membuatnya lebih dekat ke atas, karena lebih relevan dengan pertanyaan daripada jawaban lain (yaitu solusi Linux + Okular sederhana).
bertengkar
Baru saja mencoba ini dan saya masih memiliki akhiran baris ketika saya menempelkan teks khusus yang belum diformat dan dipilih. Mungkin semuanya sudah berubah. Okular adalah versi 0.24.2 LibreOffice adalah versi 5.1.6.2
frederickjh
1

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

Penghargaan untuk Kenn .

Berdasarkan skrip Glutanimate.

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

Hapus Line Breaks saat menyalin teks dari PDF (Linux):

Skrip bash ini menghapus jeda baris saat menyalin teks dari PDF. Ini berfungsi baik untuk Pemilihan Utama dan Clipboard dari 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

Ketergantungan:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Anda dapat menggunakan clipnotify pra-kompilasi yang disediakan dalam repositori atau kompilasi sendiri.

Untuk mengkompilasi clipnotify diri Anda:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Menggunakan :

  1. Unduh repositori ini sebagai zip atau salin dan tempel skrip dalam editor teks dan simpan sebagai copy_without_linebreaks.sh.
  2. Pastikan skrip dan notifikasi klip (diunduh atau dikompilasi) ada di folder yang sama.
  3. Buka terminal di folder skrip dan atur izin
    chmod +x "copy_without_linebreaks.sh"
  4. Klik dua kali skrip atau jalankan dengan memasukkan di terminal:
    .\copy_without_linebreaks.sh
  5. Salin teks dalam pdf dan rekatkan di mana saja. Jeda baris akan dihapus.
SidMan
sumber
0

Jika Anda memiliki Acrobat, klik kursor Anda sehingga kursor berkedip dalam teks. (Ini tidak akan berfungsi jika Anda tidak melakukan itu.) Buka Lanjutan, Aksesibilitas, Tambahkan tag. Butuh beberapa menit jika Anda memiliki dokumen besar, tetapi jauh lebih cepat daripada menghapus secara manual. Voila!

segera
sumber
-1

Solusi mudah dari halaman ini; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. salin teks yang Anda inginkan dari PDF
  2. rekatkan ke dokumen Word baru
  3. klik "edit" lalu "ganti"
  4. pastikan Anda berada di bidang "temukan apa"
  5. klik "lebih" lalu "istimewa"
  6. pilih "tanda paragraf" (atas daftar)
  7. klik ke bidang “ganti dengan”
  8. tekan tombol spasi sekali
  9. klik "ganti semua"
  10. klik "ok" lalu tutup kotak "temukan & ganti".

Sedikit faffy tetapi begitu Anda mendapatkan pintasan di bawah jari Anda, itu jauh lebih cepat

Sunner
sumber
1
Salin dan tempel tidak dapat diandalkan, itulah inti dari pertanyaan. Jika seseorang ingin membersihkan dengan mencari dan mengganti, pertama-tama ia akan mengkonversi ke teks dengan pdftotextdan kemudian menggunakan editor teks yang mereka suka (dengan regex standar).
Nemo