Есть ли эффективный способ скопировать текст из PDF без разрывов строк?


12

Мне нужно получить тысячи фрагментов текста из PDF-файлов в электронную таблицу. Они короткие, редко больше, чем 2-3 строки, но каждый разрыв строки создает новую ячейку, и мне приходится ремонтировать ее вручную, что стоит много времени.

Поскольку у меня их так много, использование обходного пути «вставь в Word и найди и замени» просто слишком трата времени для меня. Есть ли способ, чтобы разрыв строки исчез при копировании? Может быть, есть зритель, который предлагает специальный режим копирования для этого, или имеет плагин?

Документы являются научными статьями. Расположение текста довольно линейное. Вы можете предположить, что текст, который я копирую, не находится внутри таблицы или с плавающей точкой, и не вращается или что-то еще. (Если такое случится, я думаю, я справлюсь с этим вручную). Текст часто задается в двух столбцах, но у меня нет проблем с выделением нужного текста из его столбца. Мне не нужно сохранять какое-либо специальное форматирование. Я готов попробовать решение, которое удаляет все непечатаемые символы, например. Тексты на английском языке, это нормально, если решение работает только в ASCII / удаляет все не алфавитно-цифровые ASCII скопированного текста.

У меня есть очень сильное предпочтение для решения, которое будет работать на Linux, возможно, какой-то плагин Okular. Но если будет решение для Windows, я тоже хочу услышать об этом. У меня есть лицензия на несколько последних версий Acrobat Pro на компьютере с Windows.


Вы пробовали с Foxit Reader?
Касун

2
pdftotext, как правило, лучший, но вам все равно понадобится постобработка. См linuxquestions.org/questions/programming-9/...
Nemo

@Kasun FoxitReader или любой другой читатель, который вы используете, не имеет значения: PDF-файл - это тот, который вводит переносы строк.
Иштван Захар

Ответы:


5

У меня была похожая проблема, когда я работал над сценарием преобразования текста в речь некоторое время назад. Мой сценарий попытался бы разбить ввод текста на куски, ища строки. С PDF-файлами это может привести к путанице из-за того, что каждая строка заканчивается новой строкой.

Так что я сделал , было сочинить несколько sedи trкоманды , чтобы рассматривать только новые строки , заканчивающиеся полную остановку как фактические разрывы строк. Это было не очень красиво, но это сработало.

Используя этот фрагмент, я написал для вас небольшой скрипт, который, надеюсь, поможет:

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

Использует скрипт xselдля анализа текущего выделенного текста , а затем изменяет его с помощью sedи trкомандной строки я уже упоминал выше. Обработанный текст затем передается обратно в буфер обмена с помощью xsel -bi.

Вот как вы можете использовать скрипт в вашем сценарии:

  1. Убедитесь, что вы xselустановили ( sudo apt-get install xselна (K) Ubuntu)
  2. сохранить скрипт как copy_without_linebreaksили что-то похожее и сделать его исполняемым
  3. назначьте скрипт на горячую клавишу по вашему выбору в настройках WM
  4. выделите текст и нажмите горячую клавишу
  5. Буфер обмена должен автоматически заполняться измененным текстом

3

Это беспокоило меня годами, поэтому я нашел общее (Windows) решение с помощью Autohotkey . Autohotkey - это легкое бесплатное программное обеспечение с открытым исходным кодом для Windows, позволяющее создавать горячие клавиши практически для всего, что только можно себе представить.

При нажатии Ctrl+ cкод срабатывает только в том случае, если активным окном является программа чтения PDF, в противном случае он просто копирует заданный выбор, как обычно. В случае чтения PDF, он копирует выделение, удаляет разрывы строк и двойные пробелы и помещает результат в буфер обмена. Если ничего не выбрано, буфер обмена практически не тронут.

#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

Единственной задачей перед применением этого кода является имя класса окна ( ahk_class) вашего читателя. Я использую один PDF Reader для всех случаев (и я предполагаю, что большинство людей делают это), FoxitReader, и ahk_classэто так classFoxitReader. Вы можете легко определить класс для своего собственного программного обеспечения с помощью WinGetClassкоманды (например, AcrobatSDIWindowдля Acrobat Reader).

Если вы предпочитаете читать PDF-файлы в своем браузере, это не ваше решение. Или вы можете просто удалить #IfWinActive ahk_class classFoxitReaderстроку, чтобы код всегда срабатывал, но в этом случае результат всегда будет лишен переносов и пробелов.


Раньше это работало для меня, но теперь кажется, что оно полностью сломало Ctrl + C. Windows 10.
микрофон

@MiCl Это все еще работает на моем конце. Какой компьютер / OS / PDF Reader вы используете? Вы что-нибудь изменили? Как обновить ваш читатель? С другой стороны, кто знает, что было обновлено Win 10 ...
Иштван Захар

1

Еще одна вещь, которая сработала для меня, это сохранение файла PDF в формате HTML. Параграфы в HTML остаются без изменений, готовые для копирования и вставки. Работают и другие форматы файлов, такие как txt или rtf ... Это также должно работать в системах Linux.


Как сохранить файл PDF в формате HTML?
Саймон Ист

1

Третий подход с использованием макросов показан здесь , но я не пробовал. Я вставил здесь макросы для дальнейшего использования, макрос 2 - автор источника - «Дебора Савадра» - и макрос 1 - ее читатель «Бенджамин»:

макрос 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

макрос 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

1

Существует решение для Windows показано здесь . Нужно скачать файл «PDF Copy-Paster.exe» и запустить его перед копированием и вставкой. Я попробовал это, и он работает просто отлично, за исключением того, что он удаляет все переводы строки. Поэтому, если вы скопируете несколько абзацев, у вас будет только один.

Есть вопрос по SU с небольшим объяснением, он может быть интересен для кого-то ...


рассмотрите возможность разделения трех подходов на три ответа. Так будет легче голосовать за них по отдельности. (и, добро пожаловать в Superuser :-))
Ник

хорошо, я сделаю это (и спасибо за прием)
Квазимодо

Кажется, не удаляет разрывы строк, копируя из Foxit Reader на Windows 10
микрофон

1

Я знаю, что это старый вопрос, однако я чувствовал, что было бы полезно ответить на него, потому что ни одно другое решение не было так легко использовать, как это.

Используйте приложение Linux с именем Okular, чтобы открыть файл PDF. Затем Инструменты-> Инструмент выбора таблицы. Затем выделите текст, который был в форме таблицы. Затем Ctrl + C, и вы готовы к работе.


Это работает очень хорошо, вставляя неформатированный в LibreOffice (ctrl + shift + V), поэтому он не создает таблицу. Этот ответ должен приблизить его к вершине, так как он более актуален для вопроса, чем другие ответы (т.е. простое решение Linux + Okular).
Страгу

Просто попробовал это, и у меня все еще были окончания строки, когда я вставил специальный и выделил неформатированный текст. Может быть, все изменилось. Okular - версия 0.24.2 LibreOffice - версия 5.1.6.2
frederickjh,

1

Актуальный вопрос: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Кредит идет к Кенну .

По сценарию Глутанимате.

Источник: https://github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

Удалить разрывы строк при копировании текста из PDF (Linux):

Этот скрипт bash удаляет разрывы строк при копировании текста из PDF. Он работает как для основного выбора, так и для буфера обмена 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

Зависимости:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Вы можете использовать предварительно скомпилированный clipnotify, предоставленный в репозитории, или скомпилировать себя.

Чтобы скомпилировать клипнотизировать себя:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

Использовать :

  1. Загрузите этот репозиторий в виде zip или скопируйте и вставьте скрипт в текстовый редактор и сохраните его как copy_without_linebreaks.sh.
  2. Убедитесь, что скрипт и clipnotify (загруженный или предварительно скомпилированный) находятся в одной папке.
  3. Откройте терминал в папке скрипта и установите разрешение
    chmod +x "copy_without_linebreaks.sh"
  4. Дважды щелкните скрипт или запустите, введя в терминал:
    .\copy_without_linebreaks.sh
  5. Скопируйте текст в формате PDF и вставьте его куда угодно. Разрывы линий будут удалены.

0

Если у вас есть Acrobat, нажмите на курсор, чтобы курсор мигал в тексте. (Это не сработает, если вы этого не сделаете.) Перейдите в раздел «Дополнительно», «Доступность», «Добавить теги». Это займет несколько минут, если у вас большой документ, но намного быстрее, чем удаление разрывов вручную. Вуаля!


-1

Простое решение с этой страницы; http://www.iom3.org/news/how-instantly-remove-unwanted-line-breaks-when-copying-pdf

  1. скопируйте нужный текст из PDF
  2. вставить в новый документ Word
  3. нажмите «изменить», затем «заменить»
  4. убедитесь, что вы находитесь в поле «найти что»
  5. нажмите «больше», затем «специальные»
  6. выберите «знак абзаца» (верхняя часть списка)
  7. щелкните в поле «заменить на»
  8. нажмите пробел один раз
  9. нажмите «заменить все»
  10. нажмите «ОК», затем закройте окно «Найти и заменить».

Немного капризный, но как только вы получаете ярлыки под пальцами, это намного быстрее


1
Копировать и вставлять не надежно, вот и весь вопрос. Если кто-то хочет очистить с помощью поиска и замены, thed сначала преобразует в текст, pdftotextа затем использует любой текстовый редактор, который им нравится (со стандартным регулярным выражением).
Немо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.