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

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

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

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

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

У меня была аналогичная проблема, когда я некоторое время работал над текстовым скриптом. Мой скрипт попытается разбить ввод текста на куски, ища новые строки. С файлами 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 (eg # 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 on (K) Ubuntu)
  2. Сохраните скрипт как copy_without_linebreaks или что-то подобное и сделайте его исполняемым
  3. Присвойте скрипту горячую клавишу по вашему выбору в ваших настройках WM
  4. Выделите текст и нажмите горячую клавишу
  5. Буфер обмена автоматически заполняется измененным текстом

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

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

Это вызывало у меня много лет, поэтому я решил использовать общее (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_classclassFoxitReader . Вы можете легко определить класс для своего программного обеспечения с помощью команды WinGetClass (например, AcrobatSDIWindow для Acrobat Reader).

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

Еще одна вещь, которая сработала для меня, – это сохранить файл в формате pdf как html. Пункты в html остаются неповрежденными, готовыми к копированию и вставке. Другие форматы файлов также работают, например, txt или rtf … Это также должно работать на системах Linux.

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

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

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

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

Простое решение с этой страницы; 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. Нажмите «ОК», затем закройте окно «Найти и заменить».

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

  • Как скопировать эту цитату из PDF?
  • PDF Blob не показывает контент, Angular 2
  • Добавление таблицы в существующий PDF на той же странице - ITEXT
  • Печать PDF-файла без фона
  • Как автоматически открыть «сохраненные» pdf-файлы в системном средстве просмотра на хроме?
  • Создание файлов PDF во время выполнения в c #
  • Как делать заметки в PDF-файлах в Linux
  • Открыть PDF в WebView
  • Чтение содержимого PDF с помощью itextsharp dll в VB.NET или C #
  • Как я могу сделать снимок экрана с полным PDF-файлом?
  • Как добавить текст внизу страниц с помощью pdftk?
  • Давайте будем гением компьютера.