教學 · PDF → Markdown
PDF 轉 Markdown,為什麼結構是猜的
這裡別的轉換器讀的都是檔案裡真有的結構。這一個讀不到,因為 PDF 裡沒有結構。
PDF 存的是帶字級的字元和它們的座標。「這是個標題」這句話不在檔案裡。所以結構是推斷出來的 —— 知道它是怎麼推的,就知道它什麼時候會推錯。
PDF 裡沒有結構
PDF 是個列印格式。它的活兒是把對的字形放到紙上對的位置,辦法是存一段段帶位置和字型的文字。檔案裡沒有任何一處說哪一段是標題、哪裡是段落結尾、這六行是個項目清單。
所以 Word 文件是「轉換」,PDF 是「重建」。下面寫的每一條都是啟發式規則,每條規則都有它判錯的情況。這就是為什麼無論看起來正不正常,每次轉 PDF 都會在輸出上方給出一條提示。
手上有原始的 .docx 就用它。那個能正經轉,因為結構真在裡面。
標題是怎麼找出來的
先算內文字級:把每行的字級按它含多少字元加權統計一遍,最常見的那個勝出。按字元數而不是按行數加權是有講究的 —— 一行長內文對「內文字級是多少」的說服力,比一行短標題大得多。
然後:明顯比內文大、而且短的行算標題。字級比例定級別:1.6 倍以上是 #,1.35 倍是 ##,1.15 倍是 ###。原來的標題層級已經沒了,所以留下來的只是相對關係 —— 這幾個標題彼此是同一級。
長度上限是 120 個字元,它擋的是一種具體的判錯:一份文件開頭那段內文用大字排,那不是標題,而單看字級分不出來。長度能分出來。
這條也是最常猜漏的一條。用字重而不是字級做標題的文件 —— 粗體但和內文一樣大 —— 完全沒有字級訊號,那些標題出來就是段落。
頁首頁尾、分段和清單
頁首頁尾在兩個條件同時成立時被丟掉:比內文小,而且落在離上下邊緣 9% 頁高以內。用比例而不是固定值,所以 A4 和 Letter 表現一致。不然一個頁碼或者一個「機密」水印會在內文裡打斷你四十次。
分段看的是行間垂直空隙有沒有超過這行自己字級的 1.8 倍。PDF 就是這麼表達一次分段的,因為裡面沒有段落標記可讀。
清單看行首字元:一個項目符號字形(•、·、▪、◦、‣、∙),或者最多三位數字後面跟一個點或者右括號。用別的方式畫出來的清單,在轉換器眼裡不是清單。
被行尾斷開的詞
PDF 會在行尾用連字號斷詞,直接拼起來你會拿到「re- port」。規則是:一行以連字號結尾、下一行以小寫字母開頭,就把這兩行拼回一個詞 —— 這個組合幾乎每次都是斷行連字號。
下一行是大寫字母的時候連字號留著。「state-of-the-art」在「state-」後面斷開,連字號會保留,這是對的,因為那一個是詞的一部分。
中文、日文、韓文的行之間不加空格。這些文字本來不用空格分詞,每次斷行插一個空格就是往句子中間塞一個縫。
The quarterly re-
port is attached.The quarterly report is attached.掃描檔什麼都出不來
如果一頁是文字的圖片 —— 掃描、拍照、傳真 —— 檔案裡沒有字元可讀,只有一張點陣圖。轉換器會明說然後停下,而不是回一個空文件讓你以為是 bug。
從那種頁面裡取文字要靠 OCR,這個工具沒有這個能力。一份有些頁是掃描、有些不是的 PDF,能轉的頁會轉,出來是空的那些會列出頁碼,最多列六個。
兩個上限:25 MB 和 500 頁。都是為了不讓瀏覽器分頁卡死 —— PDF 是在你的瀏覽器裡算繪的,沒有伺服器參與。
多欄版面怎麼辦
雙欄是最難的一種,只能盡力。文字按檔案裡存的順序讀,做得規矩的雙欄 PDF 是一欄讀完再讀下一欄,做得不規矩的是兩欄一行一行交替。讀之前沒有可靠的辦法知道你手上是哪一種。
表格和公式是同一個故事:PDF 裡的表格是幾根線加擺在座標上的文字,沒有任何東西標明它是個表格。預期是拿到幾行分開的文字,而不是一張直線表格。
準備手工修的話把頁標記打開。它會在每頁前面插一個 HTML 註解,這樣你能找到出問題那段來自第幾頁,回去對照原文。
…第一頁結束。…第一頁結束。
<!-- page 2 -->
## Method把 PDF 拖進來,然後讀一下輸出上方的提示 —— 它會說哪些頁跳過了,也會提醒你結構是推斷出來的。全程在你的瀏覽器裡讀,檔案不上傳。
PDF → MD