Мне нужно перенести тысячи фрагментов текста из PDF-файлов в электронную таблицу. Они короткие, редко больше 2-3 строк, но каждый перенос строки создает новую ячейку, и мне приходится восстанавливать это вручную, что занимает много времени.
Поскольку у меня их так много, использование обходного пути "вставить в Word и выполнить поиск и замену" для меня просто слишком долгое занятие. Есть ли способ сделать так, чтобы разрыв строки исчезал при копировании? Может быть, есть просмотрщик, который предлагает специальный режим копирования для этого, или у него есть плагин?
Документы представляют собой научные статьи. Текст расположен довольно линейно. Можно предположить, что текст, который я копирую, не находится внутри таблицы или плавающего объекта, не повернут и т. п. (Если такое случится, думаю, я разберусь с этим вручную). Текст часто размещается в двух столбцах, но у меня нет проблем с выделением только нужного мне текста из столбца. Мне не нужно сохранять какое-либо специальное форматирование. Я готов попробовать решение, которое удаляет все непечатаемые символы, например. Тексты на английском языке, все в порядке, если решение работает только в ASCII/удаляет все небуквенно-цифровые ASCII из скопированного текста.
У меня есть очень сильное предпочтение решению, которое будет работать на Linux, возможно, какой-то плагин Okular. Но если есть решение только для Windows, я хочу услышать и о нем. У меня есть лицензия на довольно недавнюю версию Acrobat Pro на машине Windows.
решение1
У меня была похожая проблема, когда я некоторое время назад работал над скриптом преобразования текста в речь. Мой скрипт пытался разбить текстовый ввод на куски, ища новые строки. С файлами 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
.
Вот как вы можете использовать этот сценарий в своем сценарии:
- Убедитесь, что у вас
xsel
установлен (sudo apt-get install xsel
на (K)Ubuntu) - сохраните скрипт как
copy_without_linebreaks
или что-то подобное и сделайте его исполняемым - назначьте скрипт на горячую клавишу по вашему выбору в настройках WM
- выделите текст и нажмите горячую клавишу
- Буфер обмена должен автоматически заполниться измененным текстом.
решение2
Это беспокоило меня годами, поэтому я придумал общее (для Windows) решение с помощьюАвтохоткей. Autohotkey — это легковесное, бесплатное программное обеспечение с открытым исходным кодом для создания горячих клавиш для практически любых действий, которые только можно себе представить.
При нажатии 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 для всех случаев (и я предполагаю, что большинство людей так делают), FoxitReader, и это ahk_class
. classFoxitReader
Вы можете легко определить класс для своего собственного программного обеспечения поWinGetClass
команда (например, AcrobatSDIWindow
для Acrobat Reader).
Если вы предпочитаете читать PDF-файлы в браузере, это не ваше решение. Или вы можете просто удалить строку #IfWinActive ahk_class classFoxitReader
, чтобы код всегда срабатывал, но в этом случае результат всегда будет лишен переносов строк и двойных пробелов.
решение3
Еще одна вещь, которая сработала для меня, это сохранение файла pdf как html. Абзацы в html остаются нетронутыми, готовыми к копированию и вставке. Другие форматы файлов также работают, такие как txt или rtf... Это также должно работать в системах Linux.
решение4
Показано решение для Windows.здесь. Нужно скачать файл "PDF Copy-Paster.exe" и запустить его перед копированием и вставкой. Я попробовал, и он отлично работает, за исключением того, что он удаляет все переносы строк. Так что если вы копируете несколько абзацев, у вас позже будет только один.
Eстьсвязанный вопросна SU с небольшим пояснением, может быть кому-то будет интересно...