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

10

Preciso ter milhares de trechos de texto de PDFs em uma planilha. Eles são curtos, raramente mais que 2-3 linhas, mas cada quebra de linha cria uma nova célula, e eu tenho que consertar isso manualmente, o que custa muito tempo.

Como eu tenho muitos deles, usar a solução "colar no Word e fazer um" localizar e substituir "é muito demorado para mim." Existe uma maneira de ter a quebra de linha desaparecer 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. O arranjo de texto é bastante linear. Você pode supor que o texto que estou copiando não está dentro de uma tabela ou de um float e não é girado ou algo assim. (Se tal coisa acontecer, acho que vou lidar com isso manualmente). O texto é frequentemente definido em duas colunas, mas não tenho dificuldade em marcar apenas o texto que preciso da 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, está tudo bem se a solução só funciona em ASCII / tira todos os ASCII não alfanuméricos do texto copiado.

Eu tenho uma strong preferência por uma solução que funcione no Linux, possivelmente algum tipo de plugin do Okular. Mas se houver uma solução apenas para Windows, também quero saber disso. Eu tenho uma licença para um Acrobat Pro um pouco recente na máquina Windows.

    
por rumtscho 13.08.2014 / 09:54

8 respostas

4

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

Então, o que fiz foi compor alguns comandos sed e tr para considerar apenas as linhas novas terminando com um ponto final como quebras de linha reais. Não foi muito bonito, mas funcionou.

Usando este trecho eu escrevi um pequeno roteiro para você 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

O script usa xsel para analisar o texto destacado no momento e, em seguida, modifica-o com a linha de comando sed e tr mencionada acima. O texto processado é então passado de volta para a área de transferência via xsel -bi .

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

  1. Verifique se você tem xsel instalado ( sudo apt-get install xsel on (K) Ubuntu)
  2. salve o script como copy_without_linebreaks ou algo semelhante e torne-o executável
  3. atribua o script a uma tecla de atalho de sua preferência em suas preferências do WM
  4. realce algum texto e pressione a tecla de atalho
  5. A área de transferência deve ser preenchida automaticamente com o texto modificado
por 13.08.2014 / 11:27
3

Isso tem me incomodado há anos, então descobri uma solução geral (Windows) usando Autohotkey . O Autohotkey é um software de script leve, gratuito e de código aberto para o Windows criar hotkeys para praticamente qualquer coisa imaginável.

Quando Ctrl + c é atingido, o código só é disparado se a janela ativa for um leitor de PDF, caso contrário, simplesmente copia a seleção dada 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 fica 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 este 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 eu suponho que a maioria das pessoas faz isso), FoxitReader e seu ahk_class é classFoxitReader . Você pode descobrir a classe do seu próprio software com facilidade pelo comando WinGetClass (por exemplo, AcrobatSDIWindow para o Acrobat Leitor).

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

    
por 04.08.2016 / 21:34
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.

    
por 13.08.2014 / 11:41
1

Há uma solução do Windows exibida aqui . É preciso baixar o arquivo "PDF Copy-Paster.exe" e executá-lo antes da cópia & colar-ação. Eu tentei e funciona muito bem, exceto que remove todas as quebras de linha. Então, se você copiar vários parágrafos, mais tarde terá apenas um.

Há uma pergunta relacionada na SU com uma explicação de pouco, pode ser de interesse para alguém ...

    
por 13.08.2014 / 11:32
1

Eu sei que essa é uma pergunta antiga, mas achei que seria útil responder porque nenhuma outra solução era tão fácil de usar quanto essa.

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

    
por 12.11.2016 / 14:47
0

Uma terceira abordagem usando macros é mostrada aqui , mas Eu não tentei isso. Eu colei as macros aqui para referência futura, macro 2 é pelo autor da fonte - "Deborah Savadra" - e macro 1 por 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
    
por 13.08.2014 / 11:43
0

Se você tiver o Acrobat, clique no cursor para que o cursor fique piscando 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!

    
por 28.02.2015 / 07:31
-1

Solução fácil desta página; link

  1. copy the text you want from the PDF
  2. paste into a new Word document
  3. click “edit” then “replace”
  4. make sure you’re in the “find what” field
  5. click “more” then “special”
  6. select “paragraph mark” (top of the list)
  7. click into the “replace with” field
  8. press the space bar once
  9. click “replace all”
  10. click “ok” then close the “find & replace” box.

Um pouco faffy, mas uma vez que você tenha os atalhos sob os dedos, é muito mais rápido

    
por 01.10.2014 / 04:06