Чи є ефективний спосіб копіювання тексту з PDF без розривів рядків?


12

Мені потрібно отримати тисячі фрагментів тексту з PDF-файлів до електронної таблиці. Вони короткі, рідко більше 2-3 рядків, але кожен розрив рядка створює нову клітинку, і мені доведеться відремонтувати цю вручну, що коштує багато часу.

Оскільки у мене їх так багато, використання способу "вставити в Word і зробити" знайти і замінити "- це занадто витрачає час на мене. Чи існує спосіб зникнення розриву рядка під час копіювання? Можливо, є переглядач, який пропонує для цього спеціальний режим копіювання, або має плагін?

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

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


Чи пробували ви з читачем foxit?
Касун

2
pdftotext, як правило, найкращий, але вам все одно знадобиться деяка післяобробка. Дивіться linuxquestions.org/questions/programming-9/…
Немо,

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

Якщо ви віддаєте перевагу читати PDF-файли у своєму браузері, це не ваше рішення. Або ви можете просто видалити #IfWinActive ahk_class classFoxitReaderрядок, щоб код завжди справлявся, але в цьому випадку результат завжди буде позбавлений перерив рядків та подвійних пробілів.


Раніше це працювало для мене, але тепер, здається, цілком порушується Ctrl + C. Windows 10.
мкм

@MiCl Це все ще працює в моєму кінці. Яку машину / ОС / PDF-рідер ви використовуєте? Ви щось змінили? Як оновлення читача? З іншого боку, хто знає, що було оновлено Win 10 ...
István Zachar

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" і запустити його перед дією копіювання та вставки. Я спробував це, і він працює чудово, за винятком того, що він видаляє всі рядки. Отже, якщо ви копіюєте множення абзаців, у вас пізніше є лише один.

Існує пов'язане питання щодо СУ з невеликим бітовим поясненням, воно може зацікавити когось ...


Подумайте, як розділити три підходи на три відповіді. Голосувати їх буде індивідуально таким чином. (і, ласкаво просимо до Суперусера :-))
nik

добре, я зроблю це. (і дякую за привітання)
Квазімодо

Здається, не видаляються для мене розриви рядків, копіюючи з Foxit Reader на Windows 10
мікрофон

1

Я знаю, що це давнє питання, проте я вважав, що було б корисно відповісти на нього, оскільки жодне інше рішення не було таким простим у використанні, як це.

Скористайтеся програмою linux під назвою Okular, щоб відкрити файл PDF. Потім виберіть Інструменти-> Інструмент вибору таблиці. Потім виберіть текст таким, яким він був у формі таблиці. Потім Ctrl + C, і ви готові йти.


Це дуже добре працює, вставляючи неформатований у LibreOffice (ctrl + shift + V), тому він не створює таблицю. Ця відповідь повинна наблизити її до вершини, оскільки вона є більш актуальною для питання, ніж інші відповіді (тобто просте рішення Linux + Okular).
stragu

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

1

Актуальне запитання: /ubuntu/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Кредит йде на Кенна .

На основі сценарію Glutanimate.

Джерело: 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. Переконайтесь, що скрипт та відмітка про кліп (завантажені чи попередньо складені) знаходяться в одній папці.
  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.