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

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

Мне нужно перенести тысячи фрагментов текста из 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.

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

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

решение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 с небольшим пояснением, может быть кому-то будет интересно...

Связанный контент