줄 바꿈없이 PDF에서 텍스트를 복사하는 효율적인 방법이 있습니까?


12

PDF에서 스프레드 시트로 수천 개의 텍스트 스 니펫을 가져와야합니다. 짧아서 2-3 행을 넘지 않지만 각 줄 바꿈으로 인해 새로운 셀이 만들어 지므로 수동으로 복구해야하는데 시간이 많이 걸립니다.

나는 그것들이 너무 많기 때문에 "Word에 붙여 넣기 및 찾기 및 바꾸기"해결 방법을 사용하는 것은 너무 시간 낭비입니다. 사본에서 줄 바꿈이 사라지는 방법이 있습니까? 어쩌면 이것을 위해 특별한 복사 모드를 제공하거나 플러그인이있는 뷰어가 있습니까?

이 문서는 과학 기사입니다. 텍스트 배열은 매우 선형입니다. 복사하려는 텍스트가 테이블이나 플로트 안에 있지 않고 회전되지 않은 것으로 가정 할 수 있습니다. (이러한 일이 발생하면 수동으로 처리 할 것이라고 생각합니다). 텍스트는 종종 두 개의 열로 설정되지만 열에서 필요한 텍스트 만 표시하는 데 문제가 없습니다. 특별한 형식을 유지하지 않아도됩니다. 예를 들어 인쇄 할 수없는 모든 문자를 제거하는 솔루션을 기꺼이 시도합니다. 텍스트는 영어로되어 있습니다. 솔루션이 ASCII로만 작동하고 복사 된 텍스트의 영숫자가 아닌 ASCII 만 작동하면 괜찮습니다.

Linux에서 작동하는 솔루션, Okular 플러그인과 같은 솔루션을 선호합니다. 그러나 Windows 전용 솔루션이 있다면 그것에 대해서도 듣고 싶습니다. Windows 컴퓨터에 다소 최신 Acrobat Pro에 대한 라이센스가 있습니다.


Foxit Reader를 사용해 보셨습니까?
Kasun

2
pdftotext는 일반적으로 최고이지만 여전히 사후 처리가 필요합니다. linuxquestions.org/questions/programming-9/…
Nemo

@ Kasun FoxitReader 또는 독자가 사용하는 모든 것이 중요하지 않습니다. pdf 파일은 줄 바꿈을 소개하는 파일입니다.
István Zachar

답변:


5

얼마 전에 텍스트 음성 변환 스크립트를 작업하는 동안 비슷한 문제가 발생했습니다. 내 스크립트는 줄 바꿈을 찾아 텍스트 입력을 청크로 나눕니다. PDF 파일을 사용하면 각 줄이 줄 바꿈으로 끝나는 방식으로 인해 엉망이됩니다.

그래서 내가 한 것은 실제 줄 바꿈으로 완전히 멈추는 줄 바꿈 만 고려하는 명령 sedtr명령을 작성하는 것이 었습니다 . 아주 예쁘지는 않았지만 효과가있었습니다.

이 스 니펫을 사용하여 도움이 될만한 작은 스크립트를 작성했습니다.

#!/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현재 강조 표시된 텍스트를 구문 분석하고 위에서 언급 한 sedtr명령 줄을 사용하여 수정합니다 . 처리 된 텍스트는를 통해 클립 보드로 다시 전달됩니다 xsel -bi.

시나리오에서 스크립트를 사용하는 방법은 다음과 같습니다.

  1. (K (우분투)에 xsel설치되어 있는지 확인하십시오 sudo apt-get install xsel)
  2. 스크립트를 copy_without_linebreaks비슷한 이름 으로 저장하고 실행 가능하게하십시오
  3. WM 환경 설정에서 원하는 단축키에 스크립트를 할당하십시오.
  4. 텍스트를 강조 표시하고 핫키를 누릅니다
  5. 클립 보드에 수정 된 텍스트가 자동으로 채워집니다.

3

이것은 몇 년 동안 나를 괴롭 혔으므로 Autohotkey를 사용하는 일반적인 (Windows) 솔루션을 알아 냈습니다 . 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_classis classFoxitReader입니다. WinGetClass명령 (예 : AcrobatSDIWindowAcrobat Reader)으로 자신의 소프트웨어 클래스를 쉽게 파악할 수 있습니다 .

브라우저에서 PDF를 읽는 것을 선호한다면 이것이 해결책이 아닙니다. 또는 #IfWinActive ahk_class classFoxitReader코드를 항상 실행하도록 줄을 간단히 제거 할 수 있지만이 경우 결과에 항상 줄 바꿈과 이중 공백이 제거됩니다.


이것은 전에 나를 위해 일했지만 지금은 Ctrl + C를 완전히 깨뜨린 것 같습니다. Windows 10.
마이크

@MiCl 그것은 여전히 ​​내 끝에서 작동합니다. 어떤 머신 / OS / PDF 리더기를 사용하십니까? 당신은 아무것도 변경 했습니까? 독자 업데이트처럼? 승리 (10)에 의해 갱신 된 것을 알고 다른 한편으로, ...에
이스트 반 Zachar

1

나를 위해 일한 또 다른 것은 pdf 파일을 html로 저장하는 것이 었습니다. html의 단락은 그대로 유지하면서 복사 및 붙여 넣기 준비가되었습니다. txt 또는 rtf와 같은 다른 파일 형식도 작동합니다. Linux 시스템에서도 작동합니다.


PDF 파일을 HTML로 어떻게 저장합니까?
Simon East

1

매크로를 사용하는 세 번째 방법은 여기 에 나와 있지만 시도하지는 않았습니다. 나중에 참조 할 수 있도록 여기에 매크로를 붙여 넣었습니다. 매크로 2는 소스의 작성자 인 "Deborah Savadra"-독자 1 인 "Benjamin"의 매크로 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"파일을 다운로드하여 copy & paste-action 전에 실행해야합니다. 나는 그것을 시도하고 모든 줄 바꿈을 제거한다는 것을 제외하고는 잘 작동합니다. 따라서 곱하기 단락을 복사하면 나중에 하나만 있습니다.

SU에 관한 약간의 설명 이있는 관련 질문 이 있습니다. 누군가에게 관심이있을 수 있습니다 ...


세 가지 접근법을 세 가지 답변으로 나누는 것을 고려하십시오. 그런 식으로 개별적으로 투표하는 것이 더 쉬울 것입니다. (및 수퍼 유저에 오신 것을 환영합니다 :-))
nik

알았어 내가 할게 (환영합니다)
Quasimodo

Windows 10의 Foxit Reader에서 복사하여 줄 바꿈을 제거하지 않는 것 같습니다
mic

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 다른 솔루션은 이것만큼 사용하기 쉽기 때문에 대답하는 것이 유용 할 것이라고 생각했습니다.

Okular라는 Linux 앱을 사용하여 pdf 파일을 엽니 다. 그런 다음 Tools-> Table selection tool. 그런 다음 텍스트를 표 형식으로 선택하십시오. 그런 다음 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

신용은 Kenn 에게 간다 .

Glutanimate의 스크립트를 기반으로합니다.

출처 : https://github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

PDF에서 텍스트를 복사 할 때 줄 바꿈 제거 (Linux) :

이 bash 스크립트는 PDF에서 텍스트를 복사 할 때 줄 바꿈을 제거합니다. 그것은 리눅스의 기본 선택과 클립 보드 모두에서 작동합니다.


#!/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를 사용하거나 직접 컴파일 할 수 있습니다.

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. 스크립트와 clipnotify (다운로드 또는 사전 컴파일)가 동일한 폴더에 있는지 확인하십시오.
  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. “more”를 클릭 한 다음“special”을 클릭하십시오
  6. “문단 표시”를 선택하십시오 (목록 상단)
  7. "바꾸기"필드를 클릭하십시오
  8. 스페이스 바를 한 번 누르십시오
  9. "모두 바꾸기"를 클릭하십시오
  10. "확인"을 클릭 한 다음 "찾기 및 바꾸기"상자를 닫습니다.

약간 모호하지만 손가락 아래에 단축키가 있으면 훨씬 빠릅니다.


1
복사하여 붙여 넣기는 신뢰할 수 없습니다. 이것이 문제의 핵심입니다. 검색과 바꾸기로 정리하려면 먼저 텍스트 pdftotext를 사용 하여 텍스트로 변환 한 다음 원하는 표준 편집기를 사용하여 원하는 텍스트 편집기를 사용하십시오.
니모
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.