Satır kesilmeden PDF'den metin kopyalamanın etkili bir yolu var mı?


12

PDF'lerden bir e-tabloya binlerce metin parçacığı almam gerekiyor. Kısa, nadiren 2-3 satırdan fazla, ancak her satır sonu yeni bir hücre yaratıyor ve bunu manuel olarak onarmam gerekiyor, bu da çok zaman alıyor.

Çünkü birçoğum var, "Word'e yapıştır ve bul ve değiştir" geçici çözümünü kullanmak benim için çok zaman harcıyor. Kopyada satır sonunun kaybolmasının bir yolu var mı? Belki bunun için özel bir kopyalama modu sunan veya bir eklentisi olan bir görüntüleyici var mı?

Belgeler bilimsel makalelerdir. Metin düzenlemesi oldukça doğrusaldır. Kopyaladığım metnin bir tablonun veya kayan nokta içinde olmadığını ve döndürülmediğini veya başka bir şey olmadığını varsayabilirsiniz. (Böyle bir şey olursa, elle başa çıkacağımı düşünüyorum). Metin sık sık iki sütuna ayarlanır, ancak yalnızca sütundan ihtiyacım olan metni işaretlemekte sorun yaşamıyorum. Herhangi bir özel biçimlendirmeyi korumama gerek yok. Örneğin, yazdırılamayan tüm karakterleri kaldıran bir çözüm denemeye hazırım. Metinler İngilizce'dir, çözüm yalnızca ASCII'de çalışıyorsa / kopyalanan metnin alfanümerik olmayan tüm ASCII'lerini kaldırırsa sorun yoktur.

Muhtemelen bir çeşit Okular eklentisi olan Linux üzerinde çalışacak bir çözüm için çok güçlü bir tercihim var. Ancak, yalnızca Windows'a yönelik bir çözüm varsa, bunu da duymak istiyorum. Windows makinesinde biraz yeni bir Acrobat Pro lisansım var.


Foxit Reader'ı denediniz mi?
Kasun

2
pdftotext genellikle en iyisidir, ancak yine de bazı post-processing'e ihtiyacınız vardır. Bkz. Linuxquestions.org/questions/programming-9/…
Nemo

@Kasun FoxitReader veya bir okuyucu kullandığı önemsizdir: pdf dosyası, çizgi satırlarını tanıtan dosyadır.
István Zachar

Yanıtlar:


5

Bir süre önce bir metin-konuşma senaryosu üzerinde çalışırken de benzer bir sorun yaşadım. Senaryom, yeni satırlar arayarak metin girişini parçalara ayırmaya çalışır. PDF dosyaları ile bu, her satırın yeni satırla bitişi nedeniyle karışıklığa neden olur.

Yaptığım şey birkaç tane oluşturmaktı sedve trkomutları yalnızca tam bir durakla biten yeni satırları gerçek satır sonları olarak düşünmekti. Çok hoş değildi ama işe yaradı.

Bu snippet'i kullanarak size yardımcı olacağını umduğum küçük bir senaryo yazdım:

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

Komut dosyası, xselo anda vurgulanan metni ayrıştırmak için kullanır ve daha sonra yukarıda bahsettiğim sedve trkomut satırı ile değiştirir . İşlenen metin daha sonra üzerinden panoya geri aktarılır xsel -bi.

Senaryoda senaryoyu nasıl kullanabileceğiniz aşağıda açıklanmıştır:

  1. xselYüklediğinizden emin olun ( sudo apt-get install xsel(K) Ubuntu üzerinde)
  2. betiği copy_without_linebreaksveya benzer bir şeyi kaydedin ve yürütülebilir yapın
  3. WM tercihlerinizde komut dosyasını istediğiniz bir kısayol tuşuna atama
  4. bir metni vurgulayın ve kısayol tuşuna basın
  5. Pano otomatik olarak değiştirilen metinle doldurulmalıdır

3

Bu beni yıllardır rahatsız ediyor, bu yüzden Autohotkey kullanarak genel (Windows) bir çözüm buldum . Autohotkey, Windows'un akla gelebilecek her şey için kısayol tuşları oluşturması için hafif, ücretsiz, açık kaynaklı bir komut dosyası oluşturma yazılımıdır.

Ctrl+ cTuşuna basıldığında , kod yalnızca etkin pencere bir PDF okuyucu ise tetiklenir, aksi takdirde verilen seçimi her zamanki gibi kopyalar. PDF okuyucu olması durumunda seçimi kopyalar, çizgi ve çift boşlukları kaldırır ve sonucu panoya koyar. Hiçbir şey seçilmezse, panoya pratik olarak dokunulmaz.

#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

Bu kodu uygulamadan önce tek görev ahk_class, okuyucunuzun pencere sınıfı adıdır . Tüm durumlar için tek bir PDF okuyucu kullanıyorum (ve çoğu insanın bunu yaptığını varsayıyorum), FoxitReader ve ahk_classöyle classFoxitReader. Kendi yazılımınızın sınıfını WinGetClasskomutla kolayca anlayabilirsiniz (örn AcrobatSDIWindow. Acrobat Reader için).

Tarayıcınızda PDF'leri okumayı tercih ediyorsanız, bu sizin çözümünüz değildir. Ya #IfWinActive ahk_class classFoxitReaderda kodu her zaman tetikleyecek şekilde basitçe kaldırabilirsiniz , ancak bu durumda sonuç her zaman çizgi kırılmalarından ve çift boşluklardan arındırılır.


Bu daha önce benim için çalışırdı, ama şimdi Ctrl + C'yi tamamen kırmış gibi görünüyor. Windows 10.
mikrofon

@MiCl Hala sonunda çalışıyor. Hangi makine / OS / PDF okuyucu kullanıyorsunuz? Bir şey değiştirdin mi? Okuyucunuzu güncellemek ister misiniz? Öte yandan, Win 10 tarafından nelerin güncellendiğini bilen ...
István Zachar

1

Benim için işe yarayan başka bir şey, pdf dosyasını html olarak kaydetmektir. HTML'deki paragraflar bozulmadan kalır, kopyala & yapıştır için hazırdır. Diğer dosya biçimleri de çalışır, örneğin txt veya rtf ... Bu aynı zamanda Linux sistemlerinde de çalışmalıdır.


Bir PDF dosyasını HTML olarak nasıl kaydedersiniz?
Simon East

1

Makroları kullanan üçüncü bir yaklaşım burada gösterilmiştir , ancak denemedim. Makroları ileride başvurmak üzere buraya yapıştırdım, makro 2 kaynağın yazarı - "Deborah Savadra" - ve makro 1 okuyucusu "Benjamin" tarafından:

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

1

Burada gösterilen bir Windows çözümü var . Biri "PDF Copy-Paster.exe" dosyasını indirmeli ve kopyala & yapıştır eyleminden önce çalıştırmalıdır. Bunu denedim ve tüm çizgi kırıklarını kaldırması dışında gayet iyi çalışıyor. Bu nedenle, paragrafları çoğaltırsanız daha sonra yalnızca bir tane olur.

SU ile ilgili küçük bir açıklama ile ilgili bir soru var, biri için ilgi çekici olabilir ...


üç yaklaşımınızı üç cevaba ayırmayı düşünün. Onlara bu şekilde bireysel olarak oy vermek daha kolay olacaktır. (ve Superuser'a hoş geldiniz :-))
nik

tamam yapacağım. (ve karşılama için teşekkür ederiz)
Quasimodo

Windows 10'da Foxit Reader'dan kopyalamak benim için satır sonlarını kaldırmıyor gibi görünüyor
mic

1

Bunun eski bir soru olduğunu biliyorum, ancak buna cevap vermenin yararlı olacağını düşündüm, çünkü başka hiçbir çözüm bu kadar kolay değildi.

Pdf dosyanızı açmak için Okular adlı linux uygulamasını kullanın. Sonra Araçlar-> Tablo seçim aracı Sonra metninizi tablo biçiminde olduğu gibi seçin. Sonra Ctrl + C ve gitmeye hazırsınız.


Bu, biçimlendirilmemiş LibreOffice'e (ctrl + shift + V) yapıştırarak çok iyi çalışır, böylece tablo oluşturmaz. Bu cevap, diğer cevaplardan (yani basit bir Linux + Okular çözümü) soruyla daha ilgili olduğu için en üste yaklaşmalıdır.
stragu

Sadece bunu denedim ve özel ve biçimlendirilmemiş metni yapıştırdığımda satır sonları vardı. Belki işler değişti. Okular sürüm 0.24.2 LibreOffice sürüm 5.1.6.2
frederickjh

1

Gerçek Soru: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Kredi Kenn'e gidiyor .

Glutanimate'ın senaryosuna dayanmaktadır.

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

PDF'den (Linux) metin kopyalarken Satır Kesmelerini Kaldır:

Bu bash betiği PDF'den metin kopyalarken satır sonlarını kaldırır. Linux'un Birincil Seçimi ve Panosu için çalışır.


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

Bağımlılıklar:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Depoda sağlanan önceden derlenmiş clipnotify'ı kullanabilir veya kendinizi derleyebilirsiniz.

Klip bildirimini derlemek için:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Kullanmak :

  1. Bu havuzu zip olarak indirin veya komut dosyasını bir metin düzenleyicisine kopyalayıp yapıştırın ve copy_without_linebreaks.sh olarak kaydedin.
  2. Komut dosyası ve clipnotify'ın (indirilmiş veya önceden derlenmiş) aynı klasörde olduğundan emin olun.
  3. Terminali komut dosyasının klasöründe açma ve izin ayarlama
    chmod +x "copy_without_linebreaks.sh"
  4. Komut dosyasına çift tıklayın veya terminali girerek çalıştırın:
    .\copy_without_linebreaks.sh
  5. Pdf olarak metni kopyalayın ve istediğiniz yere yapıştırın. Satır kesmeleri kaldırılacak.

0

Acrobat'ınız varsa, imlecin metinde yanıp sönmesi için imlecinizi tıklayın. (Bunu yapmazsanız çalışmaz.) Gelişmiş, Erişilebilirlik, Etiket ekle'ye gidin. Büyük bir belgeniz varsa birkaç dakika sürer, ancak molaları manuel olarak kaldırmaktan çok daha hızlıdır. İşte bu kadar!


-1

Bu sayfadan kolay çözüm; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. PDF'den istediğiniz metni kopyalayın
  2. yeni bir Word belgesine yapıştır
  3. "düzenle" yi ve ardından "değiştir" i tıklayın
  4. "ne bul" alanında olduğunuzdan emin olun
  5. "daha" ve sonra "özel" i tıklayın
  6. "paragraf işareti" ni seçin (listenin en üstünde)
  7. "ile değiştir" alanını tıklayın
  8. boşluk çubuğuna bir kez basın
  9. "tümünü değiştir" i tıklayın
  10. "Tamam" ı tıklayın ve "bul ve değiştir" kutusunu kapatın.

Hafifçe tüylü ama kısayolları parmaklarınızın altına aldığınızda çok daha hızlı


1
Kopyala ve yapıştır güvenilir değildir, sorunun tamamı budur. Biri arama ve değiştirme ile temizlemek isterse, önce metne dönüştürülür pdftotextve sonra istedikleri herhangi bir metin düzenleyiciyi kullanır (standart normal ifade ile).
Nemo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.