Command Palette

Search for a command to run...

換行決定你得到什麼

換行決定你得到什麼

T
Toolz Team
|Oct 23, 2026|17 閱讀
在 Google 上首選 Toolz。dev

PDF 工具 系列的一部分

PDF to Text

Pull the text out of a PDF and save it as a .txt file, in your browser. Keep the page layout or reflow it into paragraphs, with or without page markers.

使用PDF to Text

PDF 不包含文字行。 它在座標處包含字形,您可以看到的線條是您的眼睛組裝的東西。 任何提取器也必須從三個數字和幾個閾值組裝它們,提取的文字中幾乎每個奇怪的東西都可以追溯到其中一個閾值,這恰好是一個恰好是錯誤的呼叫。 我在寫這篇文章時修復的那個姓氏,“Osei-”然後“Mensah”變成“Osei-Mensah”:連字符保留,如預期,在它後面有一個不屬於那裡的空間。

TL;DR: 提取是線重組裝,重要的設定是不可見的。 運行在彼此的半個字體高度內是一條線;垂直間隙超過頁面通常的間隙的 1.45 倍以上。 挑選 回流 貼到編輯器中 保全 對於表格和代碼。 平均每頁 12 個字元以下的 PDF 是掃描,需要 OCR,工具是這樣說的,而不是遞給你一個空文件。 pdf 到文字 在瀏覽器中運行。

為什麼 PDF 完全需要「提取」?

因為其中的文字是寫成繪圖說明,而讀回去,與寫它們並不相反。

內容流說“將此字體設置為此大小,請移動到此,顯示這些字形”。 規範 描述一個繪畫模型,文字運算子坐在旁邊,用於繪製線條和填充形狀。 沒有物件意義行、段落或列。 曷 pdf。js Hands Back 是定位運行的平面列表,每個都有一個字串、一個 x、一個 y、一個寬度和一個字體高度,按照頁面的繪製順序。 在測試頁面上,順序不是讀取順序,單次運行可以是一個字元。

其他一切都是重建。 三個閾值幾乎可以做到這一切,它們值得知道,因為它們解釋了失敗。

閾值 價值 它決定了什麼?
線路容忍度 0.5 倍字體高度 兩輪是否在同一條線上
段落 1.45 x 頁面的中位數間隙 垂直間隙是否開始新的段落
空間比 0.25 x 字體高度 水平間隙是否為詞空間

每個都是文字自身大小的一小部分,而不是固定的點數,因此同一頁上的腳註和標題得到不同的容忍度,9 點中的文件集體的行為類似於 14 中的一組。

為什麼需要字空間閾值?

因為沒有它,每一個字都會分開。

PDF 解析器經常在多個運行中拆分一個單字,它們之間沒有間隙,用於字元或字體更改中間字。 加入空間無條件轉彎 filename 進入 f i l e n a m e。 完全不加入將單獨的單字放在一起。

所以這個規則是一個寬度,超過四分之一的字體高度算是空格,這大約是大多數字體中真實文字空間的寬度。 在此之下,運行是一個字的一部分。

這是您永遠不會注意到工作的閾值,並且會立即注意到失敗,通常是在字母間距寬廣的標題上,每個字母的距離都足夠遠,看起來像一個單字。

回流和保護有什麼區別?

回流給你散文。 保護區為您提供頁面。

這是一段在三行中列出的一段,然後是另一段,貫穿這兩種模式:

--- preserve ---
The committee reviewed the figures and agreed that the
revised protocol should be circulated before the end of
the month.
A second paragraph begins here after a larger gap.

--- reflow ---
The committee reviewed the figures and agreed that the revised protocol should be circulated before the end of the month.

A second paragraph begins here after a larger gap.

reflow 將這三行連接成一句話,並在段落之間放置一條空白行。 保留了頁面佈置的每一行中斷,包括句子中間的。

使用回流 使用保護
貼到文件或編輯器 一個表,其中列是內容
引用一段話 代碼列表,其中換行符是語法
將文字輸入腳本或模型 地址塊或表格
無論如何你都會重新格式化 任何佈局都有意義的東西

大多數時候,回流是預設的,也是正確的。 人們犯的錯誤是在桌子上使用它,將行連接成散文破壞了桌子唯一的結構。

它如何決定段落的結尾?

透過將每個垂直間隙與頁面本身的典型間隙進行比較。

測量連續線之間的每個間隙,取中位數,並且任何間隙超過中位數的 1.45 倍開始新段落。 所以單行距頁面不會以每行一段的形式回來,雙倍行距的頁面也不會以單一區塊的形式回來。

使用中位數而不是固定數字是跨具有不同前導的文件的工作。 這也是它失敗的地方:行數很少的頁面沒有可靠的中位數。 扉頁、簡短的註釋或封面紙通常以一個連續的段落回來,這是同樣的弱點 轉換這個詞 出於同樣的原因。

修復是手動和快速的。 段落中斷對讀者來說是顯而易見的,他們不是達到門檻。

跨界的文字被打破了怎麼了?

他們被重新加入,而放棄連字號的規則往往是正確的。

當一行以連字符結尾時,問題是排版員是否把它放在那裡打破一個單字,或者它是否屬於這個詞。 這裡使用的規則是:如果下一行從小寫開始,連字號是排版員,然後是;如果它以大寫或數字開頭,連字號是文字的一部分,並且保持不變。

跨界線 結果 對?
self- + contained selfcontained 是
re- + encode reencode 是
client- + Side client-Side 是
Osei- + Mensah Osei-Mensah 是
COVID- + 19 COVID-19 是
2026- + 03 2026-03 是
well- + known wellknown 不

最後一行不受任何規則固定。 「眾所周知」在自己的連字號上被打破,「被正當地打破會產生相同的一對線,將它們分開需要字典而不是閾值。 這同樣適用於「re-quot; 和「encode」,上面恰好是正確的,只是因為「reencode」不是一個任何人寫的單字。

中間的行是編寫本指南時更改的行。 用於添加空間的非斷裂情況以及保留的連字號,產生 Osei- Mensah 和 2026- 03。 連字符都屬於這個字,所以它之後的空格是永遠不正確的,而斷言舊輸出的測試與行為一起被更正。

它怎麼知道 PDF 是掃描?

透過計算每頁的字元,閾值足夠低,只有真正的掃描會跳閘。

掃描文件是充滿圖像的 PDF。 沒有文字圖層,所以提取沒有回傳任何東西,有用的回應是這樣說,而不是交出一個空文件。

  0 chars over 3 pages   treated as a scan
 30 chars over 3 pages   treated as a scan
 36 chars over 3 pages   has a text layer
 11 chars over 1 page    treated as a scan
 12 chars over 1 page    has a text layer

這行是每頁十二個字元。 目的不是零:掃描的頁面通常帶有來自掃描器的一點附帶文字、軟體蓋章的頁碼或浮水印。 零的閾值將使這些文件可提取並返回三個頁碼。

如果您的 PDF 是掃描,下一步是 OCR,並且 什麼破壞了 OCR 的測量說明 有測量版本:傾斜超過 3 度的成本遠遠超過低解析度。

列呢?

他們交錯了,這是值得您相信任何提取之前了解的極限。

行首先按基線分組,因此兩列位於相同垂直位置的文字被讀取而不是向下讀取。 在對兩列報告頁面的測試中,結果是左列的每一行,其次是旁邊的行:

Revenue rose in the third Headcount grew by four, quarter on the back of
two all in support. The hiring large renewals signed in plan for the fourth

每一個字都存在。 順序無用,輸出讀成流暢的無意義,而不是錯誤。

學術論文和報紙經常倖存下來,因為列之間的排水溝很寬且規則,足以找到頁面細分步驟。 帶有側邊欄、拉引報或兩列表的報告經常不這樣做。

列文件的可靠方法是檢查每一頁的第一段。 如果句子被拼接,一次用裁剪提取一列,或接受你得到的是單字包而不是散文。

你能從 PDF 中得到一張桌子嗎?

價值觀,是的。 表格,不,原因是 PDF 幾乎肯定也不包含表格。

PDF 中的表格通常是在座標上繪製的文字,周圍繪製了一些線條。 這些行是圖形操作,文件中沒有任何內容將它們連接到它們所附帶的文字,而單元格不是單元格;它們是碰巧排列的運行。 因此,提取器會看到一排文字並將它們讀取:

Region Q2 Q3 EMEA 412 455 AMER 388 401 APAC 120 166

每個身影都活了下來。 在不計算位置並了解原始形狀的形狀的情況下,您無法從該行判斷哪個四分之一 412 屬於。

保留模式有一點幫助,因為它在換行時保持行結構,這至少告訴你每一行的結尾。 它仍然沒有給你列邊界。

有兩件事確實有效。 一 標記為 pdf,從 Word 或 InDesign 中精心出口,具有可訪問性結構,帶有真正的表格標記並正確轉換;這些是少數,您通常可以說是因為文件是由關心的人製作的。 對於重要的未標記表格,用手複製到電子表格中比與任何工具作鬥爭更快,這是一個令人不滿意的答案,它在每次改進它的嘗試中都倖存下來。

頁面標記有什麼作用?

他們保留頁碼,這比您引用或引用的任何內容聽起來更重要。

打開標記,每個頁面都被標記,空頁仍然被計算:

--- Page 1 ---

First page text.

--- Page 2 ---

--- Page 3 ---

Third page text.

第 2 頁沒有可提取的文字,但仍然出現。 這是故意的:兩個文字頁面之間的掃描表將消失,每個以後的頁碼都會錯誤。

關閉標記後,空白頁面沒有留下痕跡,兩頁文字簡單地連接。 當您要將文字貼到某個地方時,這是正確的選擇,而分頁是 PDF 的產物,而不是文件的一部分。

提取的文字和原文一樣嗎?

字符是。 其他一切都消失了,在您依賴輸出之前,該列表值得一讀。

粗體、斜體、字體、大小、顏色、表格、圖像、頁首和頁尾與正文不同,腳註與它們註釋的句子不同,連結作為連結,以及任何複雜佈局的閱讀順序。 你得到的是字符和段落中斷。

對於大多數用途,這是完全正確的。 搜尋、引用、數數、餵食腳本、貼到編輯器中:所有這些都想要這些單字,而別無所求。

它咬的地方是一份文件,其意義部分存在於其格式中。 定義的術語為粗體的合約,一個規範樣本以其字體區分的規範,一個腳註改變句子聲稱的內容的報告。 提取的文字使所有內容變平,輸出中沒有任何內容顯示。

您應該提取文字還是轉換為 Word?

文字 如果機器會讀取它,請說如果有人會編輯它。

兩者都進行相同的重新組裝,因此單字的品質相同。 區別只是最後寫的: .txt 文件,或 XML 的 zip 中的相同段落。

你想 使用
grep、搜尋或輸入腳本 pdf 到文字
數字或分析內容 pdf 到文字
編輯散文並發送 pdf 到字
完全保持佈局 都不是;取得原始文件

最後一行是人們想要的,沒有提取給你。 轉換指南 詳細介紹為什麼,表格可以作為單一值線返回。

它可以處理多大的 PDF?

大,限制是選項卡而不是格式。

整個文件被讀入頁面記憶體並在那裡解析,並且提取的文字與它一起保存。 幾百頁的普通文字並不引人注目;高解析度的一千頁掃描是不同的提議,因為這些圖像是隨附的,儘管它們都不會產生文字。

如果文件足夠大,可以擔心,訊號是解析而不是提取。 從已經解析的頁面中提取文字很便宜;將檔案放入解析器中需要時間和記憶體。

為什麼它在瀏覽器中運行?

因為解析不需要伺服器,而且人們提取的 PDF 很少是公開的。

檔案從磁碟讀入標籤,並使用為 Web 編譯的 PDF.js 解析,重新組合成文字並傳回。 沒有請求攜帶文件,沒有儲存任何內容,並且根據您未閱讀的條款,在任何地方都沒有保留副本。

有問題的文件是合約、聲明、醫療信函、法庭文件、禁運文件、內部報告。 傳統的替代方案將整個檔案上傳到服務,以換取對座標進行解析和一些算術的操作。

成本是非常大文件的 Tab 記憶體,掃描沒有 OCR。 兩者在開始之前都是可見的,而不是在之後發現。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!