มีวิธีที่มีประสิทธิภาพในการคัดลอกข้อความจาก PDF โดยไม่ต้องขึ้นบรรทัดใหม่หรือไม่?


12

ฉันต้องการรับตัวอย่างข้อความนับพันจาก PDF ไปยังสเปรดชีต พวกมันสั้นกว่า 2-3 แถว แต่การแบ่งบรรทัดแต่ละครั้งจะสร้างเซลล์ใหม่และฉันต้องซ่อมแซมมันเองซึ่งต้องใช้เวลาเยอะ

เนื่องจากฉันมีพวกเขาจำนวนมากการใช้การ "วางลงใน Word และทำการค้นหาและแทนที่" เป็นวิธีที่เสียเวลามากเกินไปสำหรับฉัน มีวิธีที่จะให้ตัวแบ่งบรรทัดหายไปกับการคัดลอกหรือไม่? อาจมีผู้ชมที่มีโหมดคัดลอกพิเศษสำหรับสิ่งนี้หรือมีปลั๊กอิน?

เอกสารเป็นบทความทางวิทยาศาสตร์ การจัดเรียงข้อความค่อนข้างเป็นเส้นตรง คุณสามารถสันนิษฐานได้ว่าข้อความที่ฉันกำลังคัดลอกไม่ได้อยู่ในโต๊ะหรือลอยและไม่หมุนหรืออะไร (หากเกิดเหตุการณ์เช่นนี้ขึ้นฉันคิดว่าฉันจะจัดการเอง) ข้อความถูกตั้งค่าบ่อย ๆ ในสองคอลัมน์ แต่ฉันไม่มีปัญหาในการทำเครื่องหมายเฉพาะข้อความที่ฉันต้องการจากคอลัมน์ ฉันไม่จำเป็นต้องจัดรูปแบบพิเศษใด ๆ ฉันยินดีที่จะลองวิธีแก้ปัญหาที่ลบอักขระที่ไม่สามารถพิมพ์ได้ทั้งหมดออก ข้อความเป็นภาษาอังกฤษมันก็โอเคถ้าการแก้ปัญหาทำงานใน ASCII / แถบ ASCII ที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมดของข้อความที่คัดลอก

ฉันมีการตั้งค่าที่แข็งแกร่งมากสำหรับโซลูชั่นที่จะทำงานบน Linux อาจเป็นปลั๊กอิน Okular บางชนิด แต่หากมีวิธีการแก้ปัญหาสำหรับ Windows เท่านั้นฉันต้องการทราบเกี่ยวกับมันด้วย ฉันมีใบอนุญาตสำหรับ Acrobat Pro ล่าสุดในเครื่อง Windows


คุณลองกับโปรแกรมอ่าน foxit ไหม?
Kasun

2
โดยทั่วไปแล้ว pdftotext นั้นดีที่สุด แต่คุณยังต้องมีการประมวลผลภายหลัง ดูlinuxquestions.org/questions/programming-9/…
Nemo

@ Kasun FoxitReader หรืออะไรก็ตามที่ผู้อ่านใช้ไม่เกี่ยวข้อง: ไฟล์ pdf เป็นสิ่งที่แนะนำ linebreaks
István Zachar

คำตอบ:


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

นี้ได้รับการ bugging ฉันสำหรับปีดังนั้นฉันคิดออกทั่วไป (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เส้นเพื่อให้โค้ดยิงเสมอ แต่ในกรณีนี้ผลลัพธ์จะถูกแยกออกจาก linebreaks และเว้นวรรคสองครั้ง


สิ่งนี้เคยทำงานให้ฉันมาก่อน แต่ตอนนี้ดูเหมือนว่าจะทำลาย Ctrl + C โดยสิ้นเชิง Windows 10
mic

@MiCl มันยังทำงานได้ในตอนท้ายของฉัน คุณใช้เครื่องอ่าน OS / PDF อะไร คุณเปลี่ยนอะไรเหรอ? ชอบอัปเดตผู้อ่านของคุณหรือไม่ ในทางกลับกันใครจะรู้ว่าสิ่งที่ได้รับการปรับปรุงโดย Win 10 ...
István Zachar

1

อีกสิ่งที่ได้ผลสำหรับฉันคือการบันทึกไฟล์ pdf เป็น html ย่อหน้าใน html ยังคงเหมือนเดิมพร้อมสำหรับการคัดลอกและวาง รูปแบบไฟล์อื่นสามารถใช้งานได้เช่น txt หรือ rtf ... ซึ่งควรทำงานบนระบบ Linux


คุณจะบันทึกไฟล์ PDF เป็น HTML ได้อย่างไร
Simon East

1

วิธีที่สามที่ใช้มาโครแสดงอยู่ที่นี่แต่ฉันไม่ได้ลองเลย ฉันวางมาโครที่นี่เพื่อใช้อ้างอิงในอนาคตมาโคร 2 เป็นผู้เขียนของแหล่งข้อมูล - "Deborah Savadra" - และมาโคร 1 โดยผู้อ่านของเธอ "Benjamin":

มาโคร 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" และเรียกใช้ก่อนที่จะคัดลอกและวางการกระทำ ฉันลองแล้วมันใช้งานได้ดียกเว้นว่าจะลบ linebreaks ทั้งหมด ดังนั้นหากคุณคัดลอกทวีคูณย่อหน้าคุณในภายหลังจะมีเพียงหนึ่งย่อหน้า

มีคำถามที่เกี่ยวข้องกับ SU พร้อมคำอธิบายเล็กน้อยมันอาจเป็นที่สนใจของใครบางคน ...


พิจารณาแบ่งสามแนวทางของคุณออกเป็นสามคำตอบ มันจะง่ายกว่าที่จะลงคะแนนให้พวกเขาที (และยินดี Superuser :-))
nik

ตกลงฉันจะทำอย่างนั้น (และขอบคุณสำหรับการต้อนรับ)
Quasimodo

ดูเหมือนจะไม่ลบตัวแบ่งบรรทัดสำหรับฉันคัดลอกจาก Foxit Reader บน Windows 10
mic

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):

สคริปต์ทุบตีนี้จะลบตัวแบ่งบรรทัดเมื่อคัดลอกข้อความจาก 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 ที่รวบรวมไว้ล่วงหน้าที่มีให้ในที่เก็บหรือรวบรวมด้วยตัวคุณเอง

ในการรวบรวมคลิปบอร์ดระบุตัวเอง:
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. เปิด terminal ในโฟลเดอร์ของสคริปต์และตั้งค่าการอนุญาต
    chmod +x "copy_without_linebreaks.sh"
  4. คลิกสองครั้งที่สคริปต์หรือเรียกใช้โดยป้อนในเทอร์มินัล:
    .\copy_without_linebreaks.sh
  5. คัดลอกข้อความใน pdf และวางไว้ที่ใดก็ได้ ตัวแบ่งบรรทัดจะถูกลบ

0

หากคุณมี Acrobat ให้คลิกเคอร์เซอร์ของคุณเพื่อให้เคอร์เซอร์กะพริบในข้อความ (มันจะไม่ทำงานหากคุณไม่ทำเช่นนั้น) ไปที่ขั้นสูงการเข้าถึงและเพิ่มแท็ก จะใช้เวลาสองสามนาทีถ้าคุณมีเอกสารขนาดใหญ่ แต่เร็วกว่าการลบตัวแบ่งด้วยตนเอง Voila!


-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
การคัดลอกและวางไม่น่าเชื่อถือนั่นคือประเด็นทั้งหมดของคำถาม หากต้องการล้างข้อมูลด้วยการค้นหาและแทนที่สิ่งที่แรกจะแปลงเป็นข้อความด้วยpdftotextแล้วใช้โปรแกรมแก้ไขข้อความใด ๆ ที่พวกเขาต้องการ (ด้วย regex มาตรฐาน)
Nemo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.