Esiste un modo efficace per copiare il testo da un PDF senza le interruzioni di riga?


12

Ho bisogno di ottenere migliaia di frammenti di testo da PDF a un foglio di calcolo. Sono brevi, raramente più di 2-3 righe, ma ogni interruzione di riga crea una nuova cella e devo ripararla manualmente, il che costa molto tempo.

Perché ne ho così tanti, usare la soluzione "incolla in Word e trova e sostituisci" è semplicemente una perdita di tempo per me. C'è un modo per far scomparire l'interruzione di linea sulla copia? Forse c'è un visualizzatore che offre una modalità di copia speciale per questo o ha un plugin?

I documenti sono articoli scientifici. La disposizione del testo è abbastanza lineare. Puoi presumere che il testo che sto copiando non sia all'interno di una tabella o di un float e non sia ruotato o altro. (Se succede una cosa del genere, penso che la tratterò manualmente). Il testo è spesso impostato su due colonne, ma non ho problemi a contrassegnare solo il testo che mi serve dalla sua colonna. Non ho bisogno di conservare alcuna formattazione speciale. Sono disposto a provare una soluzione che rimuove tutti i caratteri non stampabili, ad esempio. I testi sono in inglese, va bene se la soluzione funziona solo in ASCII / rimuove tutte le ASCII non alfanumeriche del testo copiato.

Ho una forte preferenza per una soluzione che funzionerà su Linux, forse una sorta di plugin Okular. Ma se dovesse esserci una soluzione solo per Windows, ne voglio sapere anche io. Ho una licenza per un Acrobat Pro un po 'recente sul computer Windows.


Hai provato con il lettore Foxit?
Kasun,

2
pdftotext è generalmente il migliore, ma avrai comunque bisogno di post-elaborazione. Vedi linuxquestions.org/questions/programming-9/…
Nemo

@Kasun FoxitReader o qualunque lettore si usi è irrilevante: il file pdf è quello che introduce le interruzioni di riga.
István Zachar,

Risposte:


5

Ho avuto un problema simile mentre stavo lavorando a una sceneggiatura di sintesi vocale qualche tempo fa. La mia sceneggiatura avrebbe cercato di spezzare il testo inserito in blocchi cercando nuove righe. Con i file PDF questo comporterebbe un disastro a causa del modo in cui ogni riga termina con una nuova riga.

Quindi quello che ho fatto è stato comporne alcuni sede trcomandi per considerare solo le nuove righe che terminano con un punto fermo come interruzioni di riga effettive. Non era molto carino ma ha funzionato.

Usando questo frammento ho scritto una piccola sceneggiatura per te che spero possa aiutarti:

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

Lo script utilizza xselper analizzare il testo attualmente evidenziato e quindi lo modifica con la riga di comando sede trdi cui ho parlato sopra. Il testo elaborato viene quindi restituito agli Appunti tramite xsel -bi.

Ecco come puoi usare lo script nel tuo scenario:

  1. Assicurati di aver xselinstallato ( sudo apt-get install xselsu (K) Ubuntu)
  2. salva lo script come copy_without_linebreakso qualcosa di simile e rendilo eseguibile
  3. assegnare lo script a un tasto di scelta rapida nelle preferenze di WM
  4. evidenziare del testo e premere il tasto di scelta rapida
  5. Gli appunti dovrebbero essere riempiti automaticamente con il testo modificato

3

Questo mi ha infastidito per anni, quindi ho capito una soluzione generale (Windows) usando Autohotkey . Autohotkey è un software di scripting open source leggero e gratuito per Windows che consente di creare tasti di scelta rapida per quasi tutto l'immaginabile.

Quando viene premuto Ctrl+ c, il codice si attiva solo se la finestra attiva è un lettore PDF, altrimenti copia semplicemente la selezione specificata come al solito. Nel caso di un lettore PDF, copia la selezione, rimuove le interruzioni di riga e i doppi spazi e inserisce il risultato negli Appunti. Se non viene selezionato nulla, gli Appunti sono praticamente intatti.

#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

L'unica attività prima di applicare questo codice è il nome della classe della finestra ( ahk_class) del tuo lettore. Uso un singolo lettore PDF per tutti i casi (e presumo che la maggior parte delle persone lo faccia), FoxitReader, e lo ahk_classè classFoxitReader. Puoi capire facilmente la classe per il tuo software con il WinGetClasscomando (ad es. AcrobatSDIWindowPer Acrobat Reader).

Se preferisci leggere i PDF nel tuo browser, questa non è la tua soluzione. Oppure puoi semplicemente rimuovere la #IfWinActive ahk_class classFoxitReaderlinea in modo che il codice venga sempre attivato, ma in questo caso il risultato sarà sempre privato delle interruzioni di riga e dei doppi spazi.


In passato funzionava per me, ma ora sembra che Ctrl + C non funzioni affatto. Windows 10.
mic

@MiCl Funziona ancora alla mia fine. Quale macchina / lettore OS / PDF usi? Hai cambiato qualcosa? Ti piace aggiornare il tuo lettore? D'altra parte, chissà cosa è stato aggiornato da Win 10 ...
István Zachar

1

Un'altra cosa che ha funzionato per me è stato il salvataggio del file pdf come html. I paragrafi nell'html rimangono intatti, pronti per il copia e incolla. Anche altri formati di file funzionano, come txt o rtf ... Questo dovrebbe funzionare anche su sistemi Linux.


Come si salva un file PDF come HTML?
Simon East,

1

Un terzo approccio usando le macro è mostrato qui , ma non l'ho provato. Ho incollato qui le macro per riferimento futuro, la macro 2 è dell'autore della fonte - "Deborah Savadra" - e la macro 1 del suo lettore "Benjamin":

macro 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

macro 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

C'è una soluzione Windows mostrata qui . Uno deve scaricare il file "PDF Copy-Paster.exe" ed eseguirlo prima dell'azione copia e incolla. L'ho provato e funziona benissimo, tranne per il fatto che rimuove tutte le interruzioni di riga. Quindi, se copi moltiplicare i paragrafi, in seguito ne avrai solo uno.

C'è una domanda correlata su SU con una spiegazione a bitbit, potrebbe essere di interesse per qualcuno ...


considera di dividere i tuoi tre approcci in tre risposte. Sarà più facile votarli individualmente in quel modo. (e, benvenuto in Superuser :-))
nik,

ok, lo farò. (e grazie per il benvenuto)
Quasimodo

Non sembra rimuovere le interruzioni di linea per me, copiando da Foxit Reader su Windows 10
mic

1

So che questa è una vecchia domanda, tuttavia ho ritenuto utile rispondere perché nessun'altra soluzione era facile da usare come questa.

Usa l'app linux chiamata Okular per aprire il tuo file pdf. Quindi Strumenti-> Strumento selezione tabella, quindi seleziona il testo come era nella tabella. Quindi Ctrl + C e sei pronto per partire.


Funziona molto bene incollando non formattato in LibreOffice (ctrl + shift + V) in modo da non creare una tabella. Questa risposta dovrebbe avvicinarsi all'inizio, poiché è più pertinente alla domanda rispetto ad altre risposte (cioè una semplice soluzione Linux + Okular).
Stragu,

Ho appena provato questo e ho ancora avuto le terminazioni di riga quando ho incollato il testo speciale e selezionato non formattato. Forse le cose sono cambiate. Okular è la versione 0.24.2 LibreOffice è la versione 5.1.6.2
frederickjh

1

Domanda effettiva: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Il merito va a Kenn .

Basato sulla sceneggiatura di Glutanimate.

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

Rimuovere le interruzioni di riga durante la copia di testo da PDF (Linux):

Questo script bash rimuove le interruzioni di riga durante la copia di testo da PDF. Funziona sia con la selezione principale che con gli Appunti di 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

Dipendenze:

  1. Xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Puoi usare il clipnotify precompilato fornito nel repository o compilare te stesso.

Per compilare clipnotify te stesso:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Usare :

  1. Scarica questo repository come zip o copia e incolla lo script in un editor di testo e salvalo come copy_without_linebreaks.sh.
  2. Assicurarsi che script e clipnotify (scaricati o precompilati) siano nella stessa cartella.
  3. Apri il terminale nella cartella dello script e imposta l'autorizzazione
    chmod +x "copy_without_linebreaks.sh"
  4. Fai doppio clic sullo script o esegui inserendo nel terminale:
    .\copy_without_linebreaks.sh
  5. Copia il testo in pdf e incollalo ovunque. Le interruzioni di riga verranno rimosse.

0

Se hai Acrobat, fai clic sul cursore in modo che il cursore lampeggi nel testo. (Non funzionerà se non lo fai.) Vai su Avanzate, Accessibilità, Aggiungi tag. Ci vorranno alcuni minuti se si dispone di un documento di grandi dimensioni, ma molto più veloce rispetto alla rimozione manuale delle interruzioni. Ecco!


-1

Soluzione semplice da questa pagina; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. copia il testo che desideri dal PDF
  2. incollare in un nuovo documento di Word
  3. fai clic su "modifica" quindi "sostituisci"
  4. assicurati di essere nel campo "trova cosa"
  5. fai clic su "altro", quindi su "speciale"
  6. seleziona "segno di paragrafo" (in cima all'elenco)
  7. fai clic nel campo "Sostituisci con"
  8. premi una volta la barra spaziatrice
  9. fai clic su "Sostituisci tutto"
  10. fai clic su "ok", quindi chiudi la casella "trova e sostituisci".

Leggermente sfocato ma una volta che hai le scorciatoie sotto le dita è molto più veloce


1
Copia e incolla non è affidabile, questo è l'intero punto della domanda. Se si desidera ripulire con la ricerca e la sostituzione, si convertirà prima in testo con pdftotexte quindi utilizzare qualsiasi editor di testo che gli piace (con regex standard).
Nemo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.