Existe uma maneira eficiente de copiar texto de um PDF sem quebras de linha?

12

Preciso obter milhares de trechos de texto de PDFs para uma planilha. Eles são curtos, raramente têm mais de 2 a 3 linhas, mas cada quebra de linha cria uma nova célula, e eu preciso consertá-la manualmente, o que custa muito tempo.

Como eu tenho muitos deles, usar a solução alternativa "colar no Word e fazer uma busca e substituição" é uma perda de tempo demais para mim. Existe uma maneira de que a quebra de linha desapareça na cópia? Talvez haja um visualizador que ofereça um modo de cópia especial para isso, ou tenha um plugin?

Os documentos são artigos científicos. A disposição do texto é bastante linear. Você pode supor que o texto que estou copiando não esteja dentro de uma tabela ou em um flutuador e não seja girado ou algo assim. (Se isso acontecer, acho que vou lidar com isso manualmente). O texto é frequentemente definido em duas colunas, mas não tenho problemas para marcar apenas o texto necessário na sua coluna. Não preciso preservar nenhuma formatação especial. Estou disposto a tentar uma solução que remova todos os caracteres não imprimíveis, por exemplo. Os textos estão em inglês; tudo bem se a solução funcionar apenas em ASCII / retira todos os ASCII não alfanuméricos do texto copiado.

Tenho uma preferência muito forte por uma solução que funcione no Linux, possivelmente algum tipo de plugin Okular. Mas se houver uma solução apenas para Windows, também quero ouvir sobre isso. Eu tenho uma licença para um Acrobat Pro um tanto recente na máquina Windows.

rumtscho
fonte
Você tentou com o foxit reader?
Kasun
2
O pdftotext geralmente é o melhor, mas você ainda precisará de algum pós-processamento. Veja linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader ou qualquer outro leitor que seja usado é irrelevante: o arquivo pdf é o que apresenta as quebras de linha.
István Zachar

Respostas:

5

Eu tive um problema semelhante enquanto trabalhava em um script de texto para fala há um tempo. Meu script tentaria dividir a entrada de texto em partes procurando novas linhas. Com arquivos PDF, isso resultaria em confusão, devido à maneira como cada linha termina com uma nova linha.

Então, o que eu fiz foi compor alguns comandos sede trconsiderar apenas as novas linhas que terminam com um ponto final como quebras de linha reais. Não era muito bonito, mas funcionava.

Usando esse trecho, escrevi para você um pequeno script que espero que ajude:

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

Os usos de script xselpara analisar o texto atualmente destacado e, em seguida, modifica-lo com o sede trde linha de comando que eu mencionei acima. O texto processado é então retornado à área de transferência via xsel -bi.

Veja como você pode usar o script no seu cenário:

  1. Verifique se você xselinstalou ( sudo apt-get install xselno (K) Ubuntu)
  2. salve o script como copy_without_linebreaksou algo semelhante e o torne executável
  3. atribua o script a uma tecla de atalho de sua escolha nas preferências do WM
  4. destaque algum texto e pressione a tecla de atalho
  5. A área de transferência deve ser preenchida automaticamente com o texto modificado
Glutanimado
fonte
3

Isso me incomoda há anos, então descobri uma solução geral (Windows) usando a Autohotkey . O Autohotkey é um software de script leve, gratuito e de código aberto para Windows, para criar teclas de atalho para quase tudo o que se possa imaginar.

Quando Ctrl+ cé pressionado, o código é acionado apenas se a janela ativa for um leitor de PDF, caso contrário, simplesmente copia a seleção especificada como de costume. No caso de um leitor de PDF, ele copia a seleção, remove quebras de linha e espaços duplos e coloca o resultado na área de transferência. Se nada for selecionado, a área de transferência é praticamente intocada.

#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

A única tarefa antes de aplicar esse código é o nome da classe da janela ( ahk_class) do seu leitor. Eu uso um único leitor de PDF para todos os casos (e suponho que a maioria das pessoas faça isso), FoxitReader, e ahk_classé classFoxitReader. Você pode descobrir facilmente a classe do seu próprio software usando o WinGetClasscomando (por exemplo, AcrobatSDIWindowpara o Acrobat Reader).

Se você preferir ler PDFs no navegador, essa não é a sua solução. Ou você pode simplesmente remover a #IfWinActive ahk_class classFoxitReaderlinha para que o código sempre seja acionado, mas, nesse caso, o resultado será sempre retirado de quebras de linha e espaços duplos.

István Zachar
fonte
Isso costumava funcionar para mim antes, mas agora parece que interrompe Ctrl + C completamente. Windows 10.
mic
@ MiCl Ainda funciona no meu fim. Qual máquina / leitor de OS / PDF você usa? Você mudou alguma coisa? Gosta de atualizar seu leitor? Por outro lado, quem sabe o que foi atualizado por Win 10 ...
István Zachar
1

Outra coisa que funcionou para mim foi salvar o arquivo pdf como html. Os parágrafos no html permanecem intactos, prontos para copiar e colar. Outros formatos de arquivo também funcionam, como txt ou rtf ... Isso também deve funcionar em sistemas Linux.

Quasimodo
fonte
Como você salva um arquivo PDF como HTML?
Simon East
1

Uma terceira abordagem usando macros é mostrada aqui , mas ainda não tentei. Eu colei as macros aqui para referência futura, a macro 2 é da autora da fonte - "Deborah Savadra" - e a macro 1 do seu leitor "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
Quasimodo
fonte
1

Há uma solução do Windows mostrada aqui . É necessário baixar o arquivo "PDF Copy-Paster.exe" e executá-lo antes da ação copiar e colar. Eu tentei e funciona muito bem, exceto que remove todas as quebras de linha. Portanto, se você copiar parágrafos de multiplicação, mais tarde terá apenas um.

Existe uma pergunta relacionada ao SU com uma explicação littlebit, pode ser do interesse de alguém ...

Quasimodo
fonte
considere dividir suas três abordagens em três respostas. Será mais fácil votá-los individualmente dessa maneira. (e, bem-vindo ao superusuário :-))
nik
OK eu farei isso. (e obrigado pelas boas-vindas)
Quasimodo
Parece não remover quebras de linha para mim, copiando do Foxit Reader no Windows 10
mic
1

Sei que essa é uma pergunta antiga, mas achei que seria útil respondê-la, porque nenhuma outra solução era tão fácil de usar quanto esta.

Use o aplicativo linux chamado Okular para abrir seu arquivo pdf. Em seguida, selecione Ferramentas-> Ferramenta de seleção de tabela. Em seguida, selecione o texto como estava no formato de tabela. Então Ctrl + C e você está pronto para começar.

Arvanitis Christos
fonte
Isso funciona muito bem colando o não formatado no LibreOffice (ctrl + shift + V) para não criar uma tabela. Esta resposta deve torná-lo mais próximo do topo, pois é mais relevante para a pergunta do que outras respostas (ou seja, uma solução Linux + Okular simples).
Stragu 18/07
Apenas tentei isso e eu ainda tinha as terminações de linha quando colava texto especial e selecionado não formatado. Talvez as coisas tenham mudado. O Okular é a versão 0.24.2 O LibreOffice é a versão 5.1.6.2
frederickjh
1

Pergunta real: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

O crédito vai para Kenn .

Baseado no roteiro de Glutanimate.

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

Remova quebras de linha ao copiar texto de PDF (Linux):

Esse script bash remove quebras de linha ao copiar texto do PDF. Ele funciona para a seleção primária e a área de transferência do 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

Dependências:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Você pode usar o clipnotify pré-compilado fornecido no repositório ou compilar-se.

Para compilar o clipe, notifique-se:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Usar :

  1. Faça o download deste repositório como zip ou copie e cole o script em um editor de texto e salve-o como copy_without_linebreaks.sh.
  2. Verifique se o script e o clipnotify (baixados ou pré-compilados) estão na mesma pasta.
  3. Abra o terminal na pasta do script e defina a permissão
    chmod +x "copy_without_linebreaks.sh"
  4. Clique duas vezes no script ou execute digitando no terminal:
    .\copy_without_linebreaks.sh
  5. Copie o texto em pdf e cole-o em qualquer lugar. As quebras de linhas serão removidas.
SidMan
fonte
0

Se você possui o Acrobat, clique no cursor para que ele pisque no texto. (Não funcionará se você não fizer isso.) Vá para Avançado, Acessibilidade, Adicionar tags. Levará alguns minutos se você tiver um documento grande, mas muito mais rápido do que remover manualmente as quebras. Voila!

anon
fonte
-1

Solução fácil desta página; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. copie o texto desejado do PDF
  2. cole em um novo documento do Word
  3. clique em "editar" e depois "substituir"
  4. verifique se você está no campo "encontre o que"
  5. clique em "mais" e depois em "especial"
  6. selecione "marca de parágrafo" (topo da lista)
  7. clique no campo "substituir por"
  8. pressione a barra de espaço uma vez
  9. clique em "substituir tudo"
  10. clique em "ok" e feche a caixa "localizar e substituir".

Um pouco fraco, mas depois de colocar os atalhos sob os dedos, é muito mais rápido

Sunner
fonte
1
Copiar e colar não é confiável, esse é o ponto principal da questão. Se alguém quiser limpar com pesquisa e substituição, primeiro converterá em texto pdftotexte depois usará o editor de texto que desejar (com regex padrão).
Nemo