Có cách nào hiệu quả để sao chép văn bản từ PDF mà không bị ngắt dòng không?


12

Tôi cần lấy hàng ngàn đoạn văn bản từ tệp PDF sang bảng tính. Chúng ngắn, hiếm khi hơn 2-3 hàng, nhưng mỗi dòng ngắt tạo ra một ô mới và tôi phải sửa nó bằng tay, tốn rất nhiều thời gian.

Bởi vì tôi có rất nhiều trong số họ, sử dụng cách giải quyết "dán vào Word và tìm cách thay thế" là quá lãng phí thời gian đối với tôi. Có cách nào để ngắt dòng biến mất trên bản sao không? Có lẽ có một người xem cung cấp chế độ sao chép đặc biệt cho điều này hoặc có một plugin?

Các tài liệu là bài báo khoa học. Việc sắp xếp văn bản khá tuyến tính. Bạn có thể giả định rằng văn bản tôi đang sao chép không nằm trong bảng hoặc hình nổi và không được xoay hoặc bất cứ thứ gì. (Nếu điều đó xảy ra, tôi nghĩ tôi sẽ giải quyết bằng tay). Văn bản thường được đặt trong hai cột, nhưng tôi không gặp khó khăn khi chỉ đánh dấu văn bản tôi cần từ cột của nó. Tôi không cần phải giữ bất kỳ định dạng đặc biệt nào. Tôi sẵn sàng thử một giải pháp loại bỏ tất cả các ký tự không thể in được, ví dụ. Các văn bản bằng tiếng Anh, sẽ ổn nếu giải pháp chỉ hoạt động ở ASCII / dải tất cả ASCII không chữ và số của văn bản được sao chép.

Tôi có một ưu tiên rất lớn cho một giải pháp sẽ hoạt động trên Linux, có thể là một loại plugin Okular nào đó. Nhưng nếu có một giải pháp chỉ dành cho Windows, tôi cũng muốn nghe về nó. Tôi có giấy phép cho một Acrobat Pro gần đây trên máy Windows.


Bạn đã thử với người đọc foxit?
Kasun

2
pdftotext nói chung là tốt nhất, nhưng bạn vẫn sẽ cần một số xử lý hậu kỳ. Xem linuxquestions.org/questions/programming-9/ Kẻ
Nemo

@Kasun FoxitReader hoặc bất kỳ trình đọc nào mà người dùng sử dụng đều không liên quan: tệp pdf là tệp giới thiệu các ngắt dòng.
István Zachar

Câu trả lời:


5

Tôi đã có một vấn đề tương tự trong khi tôi đang làm việc trên một văn bản để kịch bản lời nói một thời gian trước đây. Kịch bản của tôi sẽ cố gắng chia nhỏ đầu vào văn bản thành các đoạn bằng cách tìm kiếm các dòng mới. Với các tệp PDF, điều này sẽ dẫn đến một mớ hỗn độn vì cách mỗi dòng kết thúc bằng một dòng mới.

Vì vậy, những gì tôi đã làm là soạn một số sedtrcác lệnh để chỉ xem xét các dòng mới kết thúc bằng một điểm dừng hoàn toàn khi ngắt dòng thực sự. Nó không đẹp lắm nhưng nó hoạt động.

Sử dụng đoạn mã này tôi đã viết một kịch bản nhỏ cho bạn mà tôi hy vọng sẽ giúp:

#!/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

Việc sử dụng kịch bản xselđể phân tích các văn bản hiện nổi bật và sau đó sẽ thay đổi nó bằng sedtrdòng lệnh tôi đã đề cập ở trên. Văn bản được xử lý sau đó được chuyển trở lại vào bảng tạm thông qua xsel -bi.

Đây là cách bạn có thể sử dụng tập lệnh trong kịch bản của mình:

  1. Đảm bảo bạn đã xselcài đặt ( sudo apt-get install xseltrên (K) Ubuntu)
  2. lưu tập lệnh dưới dạng copy_without_linebreakshoặc một cái gì đó tương tự và làm cho nó có thể thực thi được
  3. gán tập lệnh cho một phím nóng bạn chọn trong tùy chọn WM của bạn
  4. đánh dấu một số văn bản và nhấn phím nóng
  5. Bảng tạm sẽ tự động được điền vào văn bản đã sửa đổi

3

Điều này đã làm tôi khó chịu trong nhiều năm, vì vậy tôi đã tìm ra một giải pháp chung (Windows) bằng Autohotkey . Autohotkey là một phần mềm kịch bản mã nguồn mở, nhẹ, miễn phí dành cho Windows để tạo các phím nóng cho hầu hết mọi thứ có thể tưởng tượng được.

Khi nhấn Ctrl+ c, mã chỉ kích hoạt nếu cửa sổ hoạt động là trình đọc PDF, nếu không, nó chỉ đơn giản là sao chép lựa chọn đã cho như bình thường. Trong trường hợp trình đọc PDF, nó sao chép vùng chọn, xóa dấu ngắt dòng và dấu cách kép và đặt kết quả vào bảng tạm. Nếu không có gì được chọn, clipboard thực tế không bị ảnh hưởng.

#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

Nhiệm vụ duy nhất trước khi áp dụng mã này là tên lớp cửa sổ ( ahk_class) của trình đọc của bạn. Tôi sử dụng một trình đọc PDF duy nhất cho tất cả các trường hợp (và tôi cho rằng hầu hết mọi người làm điều đó), FoxitReader, và đó ahk_classclassFoxitReader. Bạn có thể tìm ra lớp cho phần mềm của riêng bạn một cách dễ dàng bằng WinGetClasslệnh (ví dụ: AcrobatSDIWindowAcrobat Reader).

Nếu bạn thích đọc PDF trong trình duyệt của mình, đây không phải là giải pháp của bạn. Hoặc bạn có thể chỉ cần loại bỏ #IfWinActive ahk_class classFoxitReaderdòng để mã luôn luôn kích hoạt, nhưng trong trường hợp này, kết quả sẽ luôn bị tước bỏ các dấu ngắt dòng và dấu cách kép.


Cái này trước đây hoạt động với tôi, nhưng bây giờ nó dường như phá vỡ hoàn toàn Ctrl + C. Windows 10.
mic

@MiCl Nó vẫn hoạt động ở cuối của tôi. Bạn sử dụng máy đọc / HĐH / PDF nào? Bạn có thay đổi gì không? Thích cập nhật độc giả của bạn? Mặt khác, ai biết được những gì đã được cập nhật bởi Win 10 ...
István Zachar

1

Một điều khác phù hợp với tôi là lưu tệp pdf dưới dạng html. Các đoạn trong html vẫn còn nguyên, sẵn sàng để sao chép và dán. Các định dạng tệp khác cũng hoạt động, chẳng hạn như txt hoặc rtf ... Điều này cũng sẽ hoạt động trên các hệ thống Linux.


Làm thế nào để bạn lưu một tệp PDF dưới dạng HTML?
Simon East

1

Cách tiếp cận thứ ba sử dụng macro được hiển thị ở đây , nhưng tôi chưa thử. Tôi đã dán các macro ở đây để tham khảo trong tương lai, macro 2 là của tác giả của nguồn - "Deborah Savadra" - và macro 1 bởi độc giả của cô "Benjamin":

vĩ mô 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

vĩ mô 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

Có một giải pháp Windows được hiển thị ở đây . Người ta phải tải xuống tệp "PDF Copy-Paster.exe" và chạy nó trước khi sao chép & dán hành động. Tôi đã thử nó và nó hoạt động tốt, ngoại trừ việc nó loại bỏ tất cả các ngắt dòng. Vì vậy, nếu bạn sao chép nhiều đoạn, sau này bạn chỉ có một đoạn.

Có một câu hỏi liên quan về SU với một lời giải thích nhỏ, nó có thể được quan tâm cho một ai đó ...


xem xét chia ba cách tiếp cận của bạn thành ba câu trả lời. Sẽ dễ dàng hơn để bỏ phiếu cá nhân theo cách đó. (và, chào mừng bạn đến với Superuser :-))
nik

Ok tôi sẽ làm điều đó. (và cảm ơn bạn đã chào đón)
Quasimodo

Dường như không loại bỏ ngắt dòng đối với tôi, sao chép từ Foxit Reader trên Windows 10
mic

1

Tôi biết đây là một câu hỏi cũ, tuy nhiên tôi cảm thấy nó sẽ hữu ích khi trả lời nó bởi vì không có giải pháp nào khác dễ sử dụng như câu hỏi này.

Sử dụng ứng dụng linux có tên Okular để mở tệp pdf của bạn. Sau đó Công cụ-> Công cụ chọn bảng. Sau đó chọn văn bản của bạn như ở dạng bảng. Sau đó Ctrl + C và bạn đã sẵn sàng để đi.


Điều này hoạt động rất tốt bằng cách dán không được định dạng vào LibreScript (ctrl + shift + V) để nó không tạo bảng. Câu trả lời này sẽ làm cho nó gần với đầu hơn, vì nó liên quan đến câu hỏi hơn các câu trả lời khác (tức là một giải pháp Linux + Okular đơn giản).
stragu

Chỉ cần thử điều này và tôi vẫn có kết thúc dòng khi tôi dán văn bản không được định dạng đặc biệt và được chọn. Có lẽ mọi thứ đã thay đổi. Okular là phiên bản 0.24.2 LibreOffice là phiên bản 5.1.6.2
frederickjh

1

Câu hỏi thực tế: https://askubfox.com/questions/1167026/detect-clipboard-copy-paste-event-and-modify-clipboard-contents

Tín dụng đến với Kenn .

Dựa trên kịch bản của Glutanimate.

Nguồn: https://github.com/SidMan2001/Scripts/tree/master/PDF-Copy-without-Linebreaks-Linux

Xóa ngắt dòng khi sao chép văn bản từ PDF (Linux):

Tập lệnh bash này loại bỏ ngắt dòng khi sao chép văn bản từ PDF. Nó hoạt động cho cả Lựa chọn chính và Clipboard của 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

Phụ thuộc:

  1. xsel
    sudo apt-get install xsel
  2. clipnotify ( https://github.com/cdown/clipnotify )
    Bạn có thể sử dụng clipnotify được biên dịch sẵn được cung cấp trong kho lưu trữ hoặc tự biên dịch.

Để biên dịch clipnotify mình:
sudo apt install git build-essential libx11-dev libxtst-dev
git clone https://github.com/cdown/clipnotify.git
cd clipnotify
sudo make

SỬ DỤNG:

  1. Tải xuống kho lưu trữ này dưới dạng zip hoặc sao chép và dán tập lệnh vào trình soạn thảo văn bản và lưu nó dưới dạng copy_without_linebreaks.sh.
  2. Đảm bảo rằng tập lệnh và clipnotify (đã tải xuống hoặc được biên dịch trước) nằm trong cùng một thư mục.
  3. Mở terminal trong thư mục script và đặt quyền
    chmod +x "copy_without_linebreaks.sh"
  4. Nhấp đúp vào tập lệnh hoặc chạy bằng cách nhập vào thiết bị đầu cuối:
    .\copy_without_linebreaks.sh
  5. Sao chép văn bản trong pdf và dán nó ở bất cứ đâu. Các dòng ngắt sẽ được gỡ bỏ.

0

Nếu bạn có Acrobat, hãy nhấp vào con trỏ của bạn để con trỏ nhấp nháy trong văn bản. (Sẽ không hoạt động nếu bạn không làm điều đó.) Chuyển đến Nâng cao, Trợ năng, Thêm thẻ. Sẽ mất vài phút nếu bạn có một tài liệu lớn, nhưng nhanh hơn nhiều so với xóa thủ công. Voila!


-1

Giải pháp dễ dàng từ trang này; http://www.iom3.org/news/how-instantly-remove-unwocate-line-breaks-when-copying-pdf

  1. sao chép văn bản bạn muốn từ PDF
  2. dán vào tài liệu Word mới
  3. nhấp vào chỉnh sửa và sau đó thay thế
  4. hãy chắc chắn rằng bạn đang ở trong khu vực tìm thấy những gì
  5. nhấp vào nhiều hơn nữa
  6. chọn đánh dấu đoạn văn bản khác (đầu danh sách)
  7. nhấp vào thay thế trên mạng với trường
  8. nhấn phím cách một lần
  9. nhấp vào thay thế tất cả
  10. nhấp vào ok ok, sau đó đóng hộp tìm kiếm và thay thế hộp.

Hơi khó chịu một chút nhưng một khi bạn nhận được các phím tắt dưới ngón tay thì sẽ nhanh hơn nhiều


1
Sao chép và dán không đáng tin cậy, đó là toàn bộ điểm của câu hỏi. Nếu một người muốn dọn dẹp bằng cách tìm kiếm và thay thế, trước tiên, họ sẽ chuyển đổi thành văn bản pdftotextvà sau đó sử dụng bất kỳ trình soạn thảo văn bản nào họ muốn (với regex tiêu chuẩn).
Nemo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.