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

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

Preciso transferir 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 tenho que consertar isso manualmente, o que custa muito tempo.

Como tenho muitos deles, usar a solução alternativa "colar no Word e localizar e substituir" é uma perda de tempo demais para mim. Existe uma maneira de fazer com que a quebra de linha desapareça na cópia? Talvez exista 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 assumir que o texto que estou copiando não está dentro de uma tabela ou flutuante, nem girado nem nada. (Se isso acontecer, acho que vou lidar com isso manualmente). O texto é frequentemente definido em duas colunas, mas não tenho problemas em marcar apenas o texto necessário em 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, não há problema se a solução funcionar apenas em ASCII/retirar 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 do Okular. Mas se houver uma solução somente para Windows, também quero saber mais sobre ela. Eu tenho uma licença para um Acrobat Pro recente na máquina Windows.

Responder1

Eu tive um problema semelhante enquanto trabalhava em um script de conversão de texto em 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 bagunça devido à forma como cada linha termina com uma nova linha.

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

Usando este trecho, escrevi um pequeno script 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 xselpara analisar o texto atualmente destacado e, em seguida, modifica-o com a sedlinha trde comando que mencionei 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. Certifique-se de ter xselinstalado ( sudo apt-get install xselno (K) Ubuntu)
  2. salve o script como copy_without_linebreaksou algo semelhante e torne-o 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

Responder2

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

Quando Ctrl+ cé pressionado, o código só é acionado se a janela ativa for um leitor de PDF, caso contrário, ele simplesmente copia a seleção fornecida normalmente. No caso de 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 ficará praticamente intacta.

#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 presumo que a maioria das pessoas faça isso), o FoxitReader, e é ahk_classo classFoxitReader. Você pode descobrir facilmente a classe do seu próprio software peloWinGetClasscomando (por exemplo, AcrobatSDIWindowpara Acrobat Reader).

Se você prefere ler PDFs no seu navegador, esta 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 neste caso o resultado sempre será despojado de quebras de linha e espaços duplos.

Responder3

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

Responder4

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

Existe umpergunta relacionadano SU com uma pequena explicação, pode ser do interesse de alguém...

informação relacionada