有沒有一種有效的方法可以從 PDF 複製文字而不換行?

有沒有一種有效的方法可以從 PDF 複製文字而不換行?

我需要將數千個文字片段從 PDF 提取到電子表格中。它們很短,很少超過 2-3 行,但每次換行都會建立一個新單元格,我必須手動修復它,這會花費大量時間。

因為我有很多這樣的東西,所以使用「貼在 Word 中並進行尋找和替換」的解決方法對我來說太浪費時間了。有沒有辦法讓換行符在副本上消失?也許有一個檢視器為此提供了特殊的複製模式,或者有一個插件?

這些文件就是科學文章。文字排列非常線性。您可以假設我要複製的文字不在表格或浮動中,也沒有旋轉或任何其他內容。 (如果發生這樣的事情,我想我會手動處理)。文字通常設定為兩列,但我可以輕鬆地從其列中標記我需要的文字。我不需要保留任何特殊格式。例如,我願意嘗試一種刪除所有不可列印字元的解決方案。文字為英文,如果解決方案僅適用於 ASCII/刪除複製文字的所有非字母數字 ASCII,則可以。

我非常偏愛能夠在 Linux 上運行的解決方案,可能是某種 Okular 插件。但如果剛好有一個僅限 Windows 的解決方案,我也想聽聽看。我有 Windows 電腦上最新的 Acrobat Pro 的授權。

答案1

不久前我在編寫文字轉語音腳本時遇到了類似的問題。我的腳本會嘗試透過尋找換行符號將文字輸入分解為區塊。對於 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解析當前突出顯示的文本,然後使用我上面提到的sedtr命令行對其進行修改。然後,處理後的文字會透過 傳回剪貼簿xsel -bi

以下是在您的場景中使用該腳本的方法:

  1. 確保您已xsel安裝(sudo apt-get install xsel在 (K)Ubuntu 上)
  2. 將腳本另存為copy_without_linebreaks或類似的內容並使其可執行
  3. 將腳本指派給您在 WM 首選項中選擇的熱鍵
  4. 突出顯示一些文字並按熱鍵
  5. 剪貼簿應自動填入修改後的文本

答案2

這多年來一直困擾著我,所以我想出了一個通用的(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_classclassFoxitReader.您可以透過以下方式輕鬆找出您自己的軟體的類WinGetClass指令(AcrobatSDIWindow例如 Acrobat Reader)。

如果您喜歡在瀏覽器中閱讀 PDF,這不是您的解決方案。或者您可以簡單地刪除該#IfWinActive ahk_class classFoxitReader行,以便程式碼始終觸發,但在這種情況下,結果將始終刪除換行符和雙空格。

答案3

另一件對我有用的事情是將 pdf 檔案儲存為 html。 html 中的段落保持完整,可供複製和貼上。其他檔案格式也可以工作,例如 txt 或 rtf...這應該也可以在 Linux 系統上運作。

答案4

顯示了 Windows 解決方案這裡。必須下載檔案“PDF Copy-Paster.exe”並在複製和貼上操作之前運行它。我嘗試了一下,它工作得很好,除了它刪除了所有換行符。因此,如果您複製多個段落,那麼您最終只會得到一個段落。

有一個相關問題在 SU 上有一點解釋,可能有人會感興趣...

相關內容