Existe-t-il un moyen efficace de copier du texte à partir d'un PDF sans les sauts de ligne?

12

J'ai besoin de récupérer des milliers d'extraits de texte de PDF dans une feuille de calcul. Ils sont courts, rarement plus de 2-3 lignes, mais chaque saut de ligne crée une nouvelle cellule, et je dois la réparer manuellement, ce qui coûte beaucoup de temps.

Étant donné que j'en ai tellement, l'utilisation de la solution de contournement "Coller dans Word et rechercher et remplacer" est tout simplement trop longue pour moi. Existe-t-il un moyen de faire disparaître le saut de ligne lors de la copie? Peut-être y a-t-il une visionneuse qui offre un mode de copie spécial pour cela, ou a un plugin?

Les documents sont des articles scientifiques. La disposition du texte est assez linéaire. Vous pouvez supposer que le texte que je copie n'est pas à l'intérieur d'un tableau ou d'un flotteur, et qu'il n'est pas tourné ou quoi que ce soit. (Si une telle chose se produit, je pense que je vais m'en occuper manuellement). Le texte est souvent défini sur deux colonnes, mais je n'ai aucun problème à marquer uniquement le texte dont j'ai besoin dans sa colonne. Je n'ai pas besoin de conserver de formatage spécial. Je suis prêt à essayer une solution qui supprime tous les caractères non imprimables, par exemple. Les textes sont en anglais, c'est OK si la solution ne fonctionne qu'en ASCII / enlève tous les ASCII non alphanumériques du texte copié.

J'ai une très forte préférence pour une solution qui fonctionnera sous Linux, éventuellement une sorte de plugin Okular. Mais s'il se trouve qu'il existe une solution Windows uniquement, je veux aussi en entendre parler. J'ai une licence pour un Acrobat Pro quelque peu récent sur la machine Windows.

rumtscho
la source
Avez-vous essayé avec Foxit Reader?
Kasun
2
pdftotext est généralement le meilleur, mais vous aurez toujours besoin d'un post-traitement. Voir linuxquestions.org/questions/programming-9/…
Nemo
@Kasun FoxitReader ou tout autre lecteur que l'on utilise n'a pas d'importance: le fichier pdf est celui qui introduit les sauts de ligne.
István Zachar

Réponses:

5

J'ai eu un problème similaire pendant que je travaillais sur un script de synthèse vocale il y a quelque temps. Mon script essaierait de diviser la saisie de texte en morceaux en recherchant des nouvelles lignes. Avec les fichiers PDF, cela entraînerait un gâchis en raison de la façon dont chaque ligne se termine par une nouvelle ligne.

J'ai donc composé quelques commandes sedet trne considérer que les sauts de ligne se terminant par un point final comme des sauts de ligne réels. Ce n'était pas très joli mais ça a marché.

À l'aide de cet extrait, j'ai écrit un petit script pour vous qui, je l'espère, vous aidera:

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

Le script utilise xselpour analyser le texte actuellement en surbrillance, puis le modifie avec la ligne de commande sedet trmentionnée ci-dessus. Le texte traité est ensuite renvoyé au presse-papiers via xsel -bi.

Voici comment utiliser le script dans votre scénario:

  1. Assurez-vous que vous avez xselinstallé ( sudo apt-get install xselsur (K) Ubuntu)
  2. enregistrer le script sous copy_without_linebreaksou quelque chose de similaire et le rendre exécutable
  3. attribuer le script à un raccourci clavier de votre choix dans vos préférences WM
  4. sélectionnez du texte et appuyez sur la touche de raccourci
  5. Le presse-papiers doit être automatiquement rempli avec le texte modifié
Glutanimate
la source
3

Cela me dérange depuis des années, j'ai donc trouvé une solution générale (Windows) utilisant Autohotkey . Autohotkey est un logiciel de script open source léger et gratuit pour Windows permettant de créer des raccourcis clavier pour presque tout ce qui est imaginable.

Lorsque Ctrl+ cest touché, le code ne se déclenche que si la fenêtre active est un lecteur PDF, sinon il copie simplement la sélection donnée comme d'habitude. Dans le cas d'un lecteur PDF, il copie la sélection, supprime les sauts de ligne et les doubles espaces et met le résultat dans le presse-papiers. Si rien n'est sélectionné, le presse-papiers est pratiquement intact.

#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 seule tâche avant d'appliquer ce code est le nom de classe de fenêtre ( ahk_class) de votre lecteur. J'utilise un seul lecteur PDF pour tous les cas (et je suppose que la plupart des gens le font), FoxitReader, et ahk_classc'est le cas classFoxitReader. Vous pouvez facilement déterminer la classe de votre propre logiciel par la WinGetClasscommande (par exemple AcrobatSDIWindowpour Acrobat Reader).

Si vous préférez lire les PDF dans votre navigateur, ce n'est pas votre solution. Ou vous pouvez simplement supprimer la #IfWinActive ahk_class classFoxitReaderligne pour que le code se déclenche toujours, mais dans ce cas, le résultat sera toujours débarrassé des sauts de ligne et des espaces doubles.

István Zachar
la source
Auparavant, cela fonctionnait pour moi, mais maintenant, il semble juste casser complètement Ctrl + C. Windows 10.
mic
@MiCl Cela fonctionne toujours de mon côté. Quelle machine / OS / lecteur PDF utilisez-vous? Avez-vous changé quelque chose? Vous aimez mettre à jour votre lecteur? D'un autre côté, qui sait ce qui a été mis à jour par Win 10 ...
István Zachar
1

Une autre chose qui a fonctionné pour moi a été d'enregistrer le fichier pdf en html. Les paragraphes en html restent intacts, prêts à être copiés et collés. D'autres formats de fichiers fonctionnent également, comme txt ou rtf ... Cela devrait également fonctionner sur les systèmes Linux.

Quasimodo
la source
Comment enregistrer un fichier PDF au format HTML?
Simon East
1

Une troisième approche utilisant des macros est présentée ici , mais je ne l'ai pas essayée. J'ai collé les macros ici pour référence future, la macro 2 est de l'auteur de la source - "Deborah Savadra" - et la macro 1 de son lecteur "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
la source
1

Il existe une solution Windows illustrée ici . Il faut télécharger le fichier "PDF Copy-Paster.exe" et l'exécuter avant le copier-coller. Je l'ai essayé et cela fonctionne très bien, sauf qu'il supprime tous les sauts de ligne. Donc, si vous copiez plusieurs paragraphes, vous n'en aurez plus qu'un par la suite.

Il y a une question connexe sur SU avec une petite explication, elle peut intéresser quelqu'un ...

Quasimodo
la source
pensez à diviser vos trois approches en trois réponses. Il sera plus facile de les voter individuellement de cette façon. (et bienvenue au superutilisateur :-))
nik
ok, je vais le faire. (et merci pour l'accueil)
Quasimodo
Ne semble pas supprimer les sauts de ligne pour moi, copie à partir de Foxit Reader sur Windows 10
mic
1

Je sais que c'est une vieille question, mais j'ai pensé qu'il serait utile d'y répondre car aucune autre solution n'était aussi facile à utiliser que celle-ci.

Utilisez l'application Linux nommée Okular pour ouvrir votre fichier pdf. Ensuite, Outils-> Outil de sélection de tableau, puis sélectionnez votre texte tel qu'il était sous forme de tableau. Ensuite, Ctrl + C et vous êtes prêt à partir.

Arvanitis Christos
la source
Cela fonctionne très bien en collant non formaté dans LibreOffice (ctrl + shift + V) afin qu'il ne crée pas de tableau. Cette réponse devrait se rapprocher du sommet, car elle est plus pertinente pour la question que les autres réponses (c'est-à-dire une solution Linux + Okular simple).
stragu
Je viens d'essayer ceci et j'avais toujours les fins de ligne quand j'ai collé du texte spécial et sélectionné non formaté. Peut-être que les choses ont changé. Okular est la version 0.24.2 LibreOffice est la version 5.1.6.2
frederickjh
1

Question réelle: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Le mérite revient à Kenn .

Basé sur le script de Glutanimate.

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

Supprimer les sauts de ligne lors de la copie de texte à partir d'un PDF (Linux):

Ce script bash supprime les sauts de ligne lors de la copie de texte à partir d'un PDF. Il fonctionne à la fois pour la sélection principale et le presse-papiers 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

Dépendances:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Vous pouvez utiliser le clipnotify précompilé fourni dans le référentiel ou compiler vous-même.

Pour compiler le clip, notifiez-vous:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Utiliser :

  1. Téléchargez ce référentiel sous forme de zip ou copiez et collez le script dans un éditeur de texte et enregistrez-le sous copy_without_linebreaks.sh.
  2. Assurez-vous que le script et clipnotify (téléchargés ou précompilés) se trouvent dans le même dossier.
  3. Ouvrir le terminal dans le dossier du script et définir l'autorisation
    chmod +x "copy_without_linebreaks.sh"
  4. Double-cliquez sur le script ou exécutez-le en entrant dans le terminal:
    .\copy_without_linebreaks.sh
  5. Copiez du texte en pdf et collez-le n'importe où. Les sauts de ligne seront supprimés.
SidMan
la source
0

Si vous avez Acrobat, cliquez sur votre curseur pour que le curseur clignote dans le texte. (Cela ne fonctionnera pas si vous ne le faites pas.) Allez dans Avancé, Accessibilité, Ajouter des balises. Cela prendra quelques minutes si vous avez un document volumineux, mais beaucoup plus rapide que la suppression manuelle des pauses. Voila!

anon
la source
-1

Solution facile à partir de cette page; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. copiez le texte que vous voulez du PDF
  2. coller dans un nouveau document Word
  3. cliquez sur "modifier" puis "remplacer"
  4. assurez-vous que vous êtes dans le champ «trouver quoi»
  5. cliquez sur "plus" puis sur "spécial"
  6. sélectionnez «marque de paragraphe» (en haut de la liste)
  7. cliquez dans le champ "remplacer par"
  8. appuyez une fois sur la barre d'espace
  9. cliquez sur "remplacer tout"
  10. cliquez sur «ok» puis fermez la case «rechercher et remplacer».

Légèrement mou mais une fois que vous avez les raccourcis sous les doigts, c'est beaucoup plus rapide

Sunner
la source
1
Le copier-coller n'est pas fiable, c'est tout le point de la question. Si l'on veut nettoyer par recherche et remplacement, la thed serait d'abord convertir en texte avec pdftotextpuis utiliser n'importe quel éditeur de texte qu'ils aiment (avec regex standard).
Nemo