¿Existe una forma eficaz de copiar texto de un PDF sin saltos de línea?

¿Existe una forma eficaz de copiar texto de un PDF sin saltos de línea?

Necesito pasar miles de fragmentos de texto de archivos PDF a una hoja de cálculo. Son cortos, rara vez tienen más de 2 o 3 filas, pero cada salto de línea crea una nueva celda y tengo que repararla manualmente, lo que cuesta mucho tiempo.

Debido a que tengo tantos, usar la solución alternativa "pegar en Word y buscar y reemplazar" es una pérdida de tiempo para mí. ¿Hay alguna manera de hacer que el salto de línea desaparezca al copiar? ¿Quizás haya un visor que ofrezca un modo de copia especial para esto o tenga un complemento?

Los documentos son artículos científicos. La disposición del texto es bastante lineal. Puedes asumir que el texto que estoy copiando no está dentro de una tabla o un flotador, ni está girado ni nada por el estilo. (Si tal cosa sucede, creo que lo solucionaré manualmente). El texto suele aparecer en dos columnas, pero no tengo problemas para marcar solo el texto que necesito en su columna. No necesito conservar ningún formato especial. Estoy dispuesto a probar una solución que elimine todos los caracteres no imprimibles, por ejemplo. Los textos están en inglés, está bien si la solución solo funciona en ASCII/elimina todo el ASCII no alfanumérico del texto copiado.

Tengo una gran preferencia por una solución que funcione en Linux, posiblemente algún tipo de complemento de Okular. Pero si existe una solución exclusiva para Windows, también quiero conocerla. Tengo una licencia para un Acrobat Pro algo reciente en la máquina con Windows.

Respuesta1

Tuve un problema similar mientras trabajaba en un guión de texto a voz hace un tiempo. Mi secuencia de comandos intentaría dividir la entrada de texto en fragmentos buscando nuevas líneas. Con los archivos PDF esto resultaría en un desastre debido a la forma en que cada línea termina con una nueva línea.

Entonces, lo que hice fue componer algunos sedcomandos trpara considerar solo las nuevas líneas que terminan con un punto como saltos de línea reales. No fue muy bonito pero funcionó.

Usando este fragmento, escribí un pequeño script para ti que espero te ayude:

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

El script utiliza xselpara analizar el texto resaltado actualmente y luego lo modifica con la línea de comando sedy trque mencioné anteriormente. Luego, el texto procesado se devuelve al portapapeles mediante xsel -bi.

Así es como puede utilizar el script en su escenario:

  1. Asegúrate de haber xselinstalado ( sudo apt-get install xselen (K)Ubuntu)
  2. guarde el script como copy_without_linebreakso algo similar y hágalo ejecutable
  3. asigne el script a una tecla de acceso rápido de su elección en sus preferencias de WM
  4. resalte algún texto y presione la tecla de acceso rápido
  5. El portapapeles debería llenarse automáticamente con el texto modificado.

Respuesta2

Esto me ha estado molestando durante años, así que descubrí una solución general (Windows) usandotecla de acceso automático. Autohotkey es un software de scripting ligero, gratuito y de código abierto para Windows que permite crear teclas de acceso rápido para casi cualquier cosa imaginable.

Cuando se presiona Ctrl+ , el código solo se activa si la ventana activa es un lector de PDF; de lo contrario, simplemente copia la selección dada como de costumbre. cEn el caso de un lector de PDF, copia la selección, elimina saltos de línea y espacios dobles y coloca el resultado en el portapapeles. Si no se selecciona nada, el portapapeles queda prácticamente intacto.

#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

La única tarea antes de aplicar este código es el nombre de la clase de ventana (ahk_class) de su lector. Utilizo un único lector de PDF para todos los casos (y supongo que la mayoría de la gente lo hace), FoxitReader, y ahk_classes classFoxitReader. Puede descubrir la clase para su propio software fácilmente mediante elWinGetClasscomando (por ejemplo, AcrobatSDIWindowpara Acrobat Reader).

Si prefiere leer archivos PDF en su navegador, esta no es su solución. O simplemente puede eliminar la #IfWinActive ahk_class classFoxitReaderlínea para que el código siempre se active, pero en este caso el resultado siempre estará libre de saltos de línea y espacios dobles.

Respuesta3

Otra cosa que funcionó para mí fue guardar el archivo pdf como html. Los párrafos del html permanecen intactos, listos para copiar y pegar. Otros formatos de archivo también funcionan, como txt o rtf... Esto también debería funcionar en sistemas Linux.

Respuesta4

Se muestra una solución de Windows.aquí. Hay que descargar el archivo "PDF Copy-Paster.exe" y ejecutarlo antes de la acción de copiar y pegar. Lo probé y funciona bien, excepto que elimina todos los saltos de línea. Entonces, si copias varios párrafos, luego tendrás solo uno.

Hay unpregunta relacionadaen SU ​​con una pequeña explicación, puede ser de interés para alguien...

información relacionada