我需要將數千個文字片段從 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
解析當前突出顯示的文本,然後使用我上面提到的sed
和tr
命令行對其進行修改。然後,處理後的文字會透過 傳回剪貼簿xsel -bi
。
以下是在您的場景中使用該腳本的方法:
- 確保您已
xsel
安裝(sudo apt-get install xsel
在 (K)Ubuntu 上) - 將腳本另存為
copy_without_linebreaks
或類似的內容並使其可執行 - 將腳本指派給您在 WM 首選項中選擇的熱鍵
- 突出顯示一些文字並按熱鍵
- 剪貼簿應自動填入修改後的文本
答案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_class
的classFoxitReader
.您可以透過以下方式輕鬆找出您自己的軟體的類WinGetClass
指令(AcrobatSDIWindow
例如 Acrobat Reader)。
如果您喜歡在瀏覽器中閱讀 PDF,這不是您的解決方案。或者您可以簡單地刪除該#IfWinActive ahk_class classFoxitReader
行,以便程式碼始終觸發,但在這種情況下,結果將始終刪除換行符和雙空格。
答案3
另一件對我有用的事情是將 pdf 檔案儲存為 html。 html 中的段落保持完整,可供複製和貼上。其他檔案格式也可以工作,例如 txt 或 rtf...這應該也可以在 Linux 系統上運作。