11

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

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

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

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

8 ответов8

4

У меня была похожая проблема, когда я работал над сценарием преобразования текста в речь некоторое время назад. Мой сценарий попытался бы разбить ввод текста на куски, ища строки. С 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-ридер для всех случаев (и я полагаю, что большинство людей так делают), FoxitReader, а его ahk_class - classFoxitReader . Вы можете легко определить класс для своего собственного программного обеспечения с помощью команды WinGetClass (например, AcrobatSDIWindow для Acrobat Reader).

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

2

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

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

1

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

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

1

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

0

Третий подход с использованием макросов показан здесь, но я не пробовал его. Я вставил здесь макросы для дальнейшего использования, макрос 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
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. нажмите «ОК», затем закройте окно «Найти и заменить».

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .