¿Existe una manera eficiente de copiar texto de un PDF sin los saltos de línea?

12

Necesito obtener miles de fragmentos de texto de archivos PDF a una hoja de cálculo. Son cortos, rara vez más de 2-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 muchos de ellos, usar la solución alternativa "pegar en Word y hacer una búsqueda y reemplazo" es demasiado tiempo para mí. ¿Hay alguna manera de hacer que el salto de línea desaparezca en la copia? ¿Quizás hay un visor que ofrece un modo de copia especial para esto o tiene un complemento?

Los documentos son artículos científicos. La disposición del texto es bastante lineal. Puede suponer que el texto que estoy copiando no está dentro de una tabla o un flotante, y no está girado ni nada. (Si sucede algo así, creo que lo trataré manualmente). El texto se configura frecuentemente en dos columnas, pero no tengo problemas para marcar solo el texto que necesito de su columna. No necesito preservar 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 todos los ASCII no alfanuméricos del texto copiado.

Tengo una preferencia muy fuerte por una solución que funcione en Linux, posiblemente algún tipo de complemento Okular. Pero si resulta que hay una solución solo para Windows, también quiero escucharla. Tengo una licencia para un Acrobat Pro algo reciente en la máquina con Windows.

rumtscho
fuente
¿Intentaste con Fox Reader?
Kasun
2
pdftotext es generalmente el mejor, pero aún necesitará algo de procesamiento posterior. Ver linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader o cualquier lector que uno use es irrelevante: el archivo pdf es el que introduce los saltos de línea.
István Zachar

Respuestas:

5

Tuve un problema similar mientras trabajaba en un guión de texto a voz hace un tiempo. Mi script intentaría dividir la entrada de texto en fragmentos buscando nuevas líneas. Con 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 sedy trcomandos para considerar solo las nuevas líneas que terminan con un punto final como saltos de línea reales. No era muy bonito pero funcionó.

Usando este fragmento, escribí un pequeño script para usted que espero 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

Los usos de secuencias de comandos xselpara analizar el texto resaltado y luego lo modifica con el sedy trde línea de comandos que he mencionado anteriormente. El texto procesado se devuelve al portapapeles a través de xsel -bi.

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

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

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

Cuando se pulsa Ctrl+ c, el código solo se dispara si la ventana activa es un lector de PDF, de lo contrario, simplemente copia la selección dada como de costumbre. En el caso de un lector de PDF, copia la selección, elimina los saltos de línea y los espacios dobles y coloca el resultado en el portapapeles. Si no se selecciona nada, el portapapeles está 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 clase de ventana ( ahk_class) de su lector. Utilizo un solo lector de PDF para todos los casos (y supongo que la mayoría de la gente hace eso), FoxitReader, y lo ahk_classes classFoxitReader. Puede averiguar la clase para su propio software fácilmente mediante el WinGetClasscomando (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 se eliminará de los saltos de línea y los espacios dobles.

István Zachar
fuente
Esto solía funcionar para mí antes, pero ahora parece romper Ctrl + C por completo. Windows 10.
mic
@MiCl Todavía funciona a mi fin. ¿Qué máquina / sistema operativo / lector de PDF utiliza? ¿Cambiaste algo? ¿Te gusta actualizar tu lector? Por otro lado, quién sabe qué fue actualizado por Win 10 ...
István Zachar
1

Otra cosa que funcionó para mí fue guardar el archivo pdf como html. Los párrafos en el 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.

Cuasimodo
fuente
¿Cómo se guarda un archivo PDF como HTML?
Simon East
1

Aquí se muestra un tercer enfoque con macros , pero no lo he probado. Pegué las macros aquí para referencia futura, la macro 2 es del autor de la fuente - "Deborah Savadra" - y la macro 1 de su lector "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
Cuasimodo
fuente
1

Hay una solución de Windows se muestra aquí . Uno tiene que descargar el archivo "PDF Copy-Paster.exe" y ejecutarlo antes de copiar y pegar. Lo probé y funciona bien, excepto que elimina todos los saltos de línea. Entonces, si copia múltiples párrafos, más tarde tendrá solo uno.

Hay una pregunta relacionada sobre SU con una pequeña explicación, puede ser de interés para alguien ...

Cuasimodo
fuente
considere dividir sus tres enfoques en tres respuestas. Será más fácil votarlos individualmente de esa manera. (y, bienvenido a Superusuario :-))
nik
de acuerdo, lo haré. (y gracias por la bienvenida)
Quasimodo
No parece eliminar saltos de línea para mí, copiando de Foxit Reader en Windows 10
micrófono
1

Sé que esta es una vieja pregunta, sin embargo, sentí que sería útil responderla porque ninguna otra solución era tan fácil de usar como esta.

Use la aplicación de Linux llamada Okular para abrir su archivo pdf. Luego Herramientas-> Herramienta de selección de tabla. Luego seleccione su texto tal como estaba en forma de tabla. Luego Ctrl + C y ya está listo para comenzar.

Arvanitis Christos
fuente
Esto funciona muy bien al pegar sin formato en LibreOffice (ctrl + shift + V) para que no cree una tabla. Esta respuesta debería estar más cerca de la parte superior, ya que es más relevante para la pregunta que otras respuestas (es decir, una solución simple de Linux + Okular).
stragu
Solo intenté esto y todavía tenía los finales de línea cuando pegué texto especial y sin formato seleccionado. Tal vez las cosas han cambiado. Okular es la versión 0.24.2 LibreOffice es la versión 5.1.6.2
frederickjh
1

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

El crédito va a Kenn .

Basado en el guión de Glutanimate.

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

Eliminar saltos de línea al copiar texto de PDF (Linux):

Este script bash elimina los saltos de línea al copiar texto de PDF. Funciona tanto para la selección primaria como para el portapapeles de 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

Dependencias:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Puede usar el clipnotify precompilado proporcionado en el repositorio o compilarlo usted mismo.

Para compilar clipnotifícate:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Usar :

  1. Descargue este repositorio como zip o copie y pegue el script en un editor de texto y guárdelo como copy_without_linebreaks.sh.
  2. Asegúrese de que el script y clipnotify (descargado o precompilado) estén en la misma carpeta.
  3. Abra el terminal en la carpeta del script y configure el permiso
    chmod +x "copy_without_linebreaks.sh"
  4. Haga doble clic en el script o ejecute ingresando en la terminal:
    .\copy_without_linebreaks.sh
  5. Copie el texto en pdf y péguelo en cualquier lugar. Se eliminarán los saltos de línea.
SidMan
fuente
0

Si tiene Acrobat, haga clic en el cursor para que el cursor parpadee en el texto. (No funcionará si no lo hace). Vaya a Avanzado, Accesibilidad, Agregar etiquetas. Tomará unos minutos si tiene un documento grande, pero mucho más rápido que eliminar los descansos manualmente. Voila!

luego
fuente
-1

Solución fácil desde esta página; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. copia el texto que quieras del PDF
  2. pegar en un nuevo documento de Word
  3. haga clic en "editar" y luego "reemplazar"
  4. asegúrese de estar en el campo "buscar qué"
  5. haga clic en "más" y luego en "especial"
  6. seleccione "marca de párrafo" (parte superior de la lista)
  7. haga clic en el campo "reemplazar con"
  8. presione la barra espaciadora una vez
  9. haga clic en "reemplazar todo"
  10. haga clic en "ok" y luego cierre el cuadro "buscar y reemplazar".

Un poco faffy pero una vez que tienes los atajos debajo de tus dedos es mucho más rápido

Sunner
fuente
1
Copiar y pegar no es confiable, ese es el punto central de la pregunta. Si se quiere limpiar mediante búsqueda y reemplazo, primero se convertiría a texto con pdftotexty luego usaría cualquier editor de texto que quisieran (con expresiones regulares estándar).
Nemo