這個頁面的程式碼沒跑起來。 直接從資料夾裡開啟 index.html,瀏覽器會攔下 JavaScript 模組,於是你選好一份 PDF之後,頁面不會有任何反應。改用 http 把這個資料夾提供出去:
powershell -ExecutionPolicy Bypass -File serve.ps1 然後開啟 http://localhost:8080/。
1 選一份 PDF 把 PDF 拖到這裡 或者點選選擇,一次一份 PDF 試個例子
在你自己的機器上把密碼取下來 銀行常常用你的出生日期或者帳號的後幾位給對帳單上鎖。下面幾條路都能給你一份沒有密碼的副本;拿回這裡來,文字還在,而文字正是這個工具要的東西。
本站的 PDF 解鎖工具 ,在那邊輸入密碼,密碼就在這個瀏覽器裡被取下來,什麼都不會上傳。這幾條裡只有它不改寫頁面上的任何東西,字還留在你的銀行放的那個位置上。 Windows ,用 Chrome 或者 Edge 開啟這份 PDF,輸入密碼,然後列印 ,印表機選另存為 PDF 。 macOS ,用「預覽」開啟它,輸入密碼,然後檔案 → 匯出為 PDF 。 不要用別的 那些說能替你解鎖的網站。那意味著把對帳單傳上去,而這正是這一頁存在的意義所要擋住的事。上面連結的那一頁不屬於它們:它沒有伺服器可以傳,拔掉網線也照樣能用。
這一份是照片,以及可以怎麼辦 檔案裡沒有文字,它的每一頁都是圖片,來自掃描器或者手機。從圖裡認字,跟從文字裡讀出一張表是兩回事,這個工具不假裝能做。按大致的效果排序:
問銀行要資料,而不是要那張紙。 幾乎每一家網上銀行都可以直接給你同一份對帳單的 CSV、OFX 或者 QIF。那把這一頁整個跳過了,而且比任何一張圖的任何轉換都更準確。 向發給你的人要原始 PDF ,而不是列印件的掃描版。 或者在你自己的機器上讀這張圖。 Windows 的截圖工具、 macOS 內建的「實況文字」、Acrobat 的識別文字 ,都能在不上傳任何東西的情況下做到。然後把每一筆金額用眼睛核一遍:讀錯的數字看起來不像錯誤,看著就是個數字。 2 核對它讀出來的內容 PDF 看起來像裝著表格,其實沒有:它裝的是落在紙面各個位置上的文字,那幾道欄是沒人印過的空白。所以下面每一張表都是推出來的,不是讀出來的。要是其中一張帶著餘額,表格上面那一行就是工具在核對自己的結果,每一行都拿上一行來證明。
哪一張表
日期的寫法是 日 / 月 / 年 月 / 日 / 年
這不是 PDF。這個工具從 PDF 裡讀出表格。 這份 PDF 帶著密碼。把密碼取掉跟從裡面讀出表格是兩回事,這個工具不會揹著你去做。 這一頁上有東西不工作了({detail})。重新整理之後再試一次。 這個檔案沒能作為 PDF 開啟({detail})。 它開啟了,但是裡面找不到任何頁面。 這份 PDF 裡沒有文字:它的每一頁都是一張圖片。 這幾頁上沒有排成表格的內容——沒有哪兩行對得成欄——所以這裡沒有東西可以變成一行一行。 一張表,{rows},讀自 {pages}。 {tables},一共 {rows},讀自 {pages}。 第 {n} 張表 · 第 {page} 頁 · {rows} · {columns} 全部 {tables},一張接一張 第 {n} 張表:{verdict} {rows},{columns} {tables},一共 {rows},一張接一張 {n} 行 {n} 行 {n} 欄 {n} 欄 {n} 張表 {n} 張表 餘額在每一行上都對得上,所以金額讀對了,沒有哪一行被漏掉或者算了兩遍。 餘額在 {links} 行裡對上了 {held} 行。用之前先拿 PDF 核一下 {where}。 第 {n} 行 第 {list} 行 是從這份檔案裡一個大於 12 的日子推出來的,所以這是它自己寫的,不是猜的。 這份檔案裡每一個日期都在 12 號或者更早,所以它裡面沒有任何東西說明順序是哪一種。要是下面的日期看起來不對,就改這裡。 這張表這裡只顯示前 {shown} 行。下載的檔案裡是全部的行。 {name}.csv 帶年份的日期寫成 YYYY-MM-DD 金額是帶正負號的普通數字 UTF-8,按 RFC 4180 加引號 {n} 頁 {n} 頁 {n} 位元組 {n} KB {n} MB 一個 Flate 流解不開({detail}) 這個瀏覽器沒有 CompressionStream 一個 LZW 流以未定義的編碼開頭 這個流是加密的 一個未知的過濾器,/{name} 巢狀太深 讀到了末尾之外 在 {at} 處遇到意外的 {found} 在 {at} 處遇到意外的位元組 0x{hex} 一個沒有 endstream 的流 {at} 處沒有 obj 關鍵字 沒有 startxref 不是一個 xref 區段 一個沒有 /W 的 xref 流 一個欄位寬度為零的 xref 流 它的開頭不像 PDF:沒有 %PDF- 頭。 這份 PDF 是加密的。 這個檔案沒有文件目錄。它要麼不是 PDF,要麼損壞得超出了這裡能修復的程度。
複製給 LLM 以 Markdown 檢視
# PDF 轉 CSV 裡面的每一張表,對帳單也算在內
把 PDF 裡的每一張表都找出來,變成表格軟體打得開的一行一行。
> 把 PDF 裡的表格變成 CSV:銀行和信用卡對帳單、發票、價目表、報告。每一頁上的每一張表都按文字落在紙上的位置找出來,帶餘額的表還會一行一行核對。什麼都不上傳。
本頁是一個完全在你的瀏覽器裡執行的互動式工具,地址是 https://abox.tools/zh-TW/pdf-to-csv/。你交給它的任何內容都不會被上傳。下面是這個頁面用文字對該工具的全部說明;要使用它,請開啟這個地址。
## 你的檔案**不會上傳**。這裡根本沒有伺服器。
你選的那份 PDF,是在這臺機器的記憶體裡開啟、讀取的,用的是從這個地址發來的程式碼,CSV 也是這樣寫出來的。這裡根本沒有能做上傳的東西,這一頁的另一頭也沒有伺服器可以接收。表格裡寫的東西,不管是帳號、餘額、一串收款方還是客戶的報價,都留在這個分頁裡。
- ✗ 不上傳
- ✗ 不註冊
- ✓ 斷網可用
- ✓ 開源
- ✓ 檔案留在你的裝置上
## 怎麼把 PDF 裡的表格轉成 CSV
1. **選一份 PDF。** 一次一份。瀏覽器直接從你的硬碟上把它讀進來,而且是整份都讀完再決定任何事,因為這份檔案寫的是 1.240,00 還是 1,240.00、日期是哪一種順序,都是關於這份檔案的事實,不是關於某一頁的。
2. **看看它找出來的那些表。** 每一頁上的每一張表,各有各的欄位,頁面上印了表頭的地方就用它自己的表頭。跨兩個小節或者兩頁、表頭相同的一張表算一張,中間不會重複表頭。折到第二行的單元格會並回它那一行。合計、小計和標籤,都按它們在頁面上的樣子作為行出來。
3. **挑一張,或者全要。** 表不止一張的時候,表格上方那個選項決定哪些進 CSV:全部一張接一張,或者只要你來找的那一張。要是某張錶帶著餘額,表格上方那一行會說每一行是不是都對上了。帶年份的日期寫成 YYYY-MM-DD,金額是帶正負號的普通數字;沒有年份的日期原樣保留,因為它屬於哪一年只能靠猜。
4. **把 CSV 拿走。** 它按 RFC 4180 寫,該加的引號都加,行尾是 CRLF,編碼是帶位元組序標記的 UTF-8,這樣 Excel 開啟它的時候貨幣符號還是貨幣符號,而不會變成一串字母。所有表放在一個檔案裡的時候,每張表保留自己的表頭行,表與表之間空一行。做出它來沒有上傳過任何東西。
## 說得更細的版本
[Is it safe to upload a bank statement?](https://abox.tools/zh-TW/guides/is-it-safe-to-upload-a-bank-statement/): A statement is every payee, every amount and your balance in one file. Here is what a converter receives, what the careful ones do with it, and how to tell whether the upload needed to happen at all.
## 工具箱裡還有
- [圖片轉 PDF](https://abox.tools/zh-TW/images-to-pdf/): 把你的圖片裝進一個文件。
- [文件掃描](https://abox.tools/zh-TW/document-scanner/): 把紙拍下來,回來的是一份看起來像掃描的東西。
- [從影片裡提取音訊](https://abox.tools/zh-TW/extract-audio-from-video/): 把影片拖進來,聲音就取出來了。畫面從不解碼,也不上傳任何東西。
- [音訊剪輯](https://abox.tools/zh-TW/trim-audio/): 邊聽邊標出值得留的段落。它們會合成一個檔案回來,就切在你說的位置。
## 常見問題
### PDF 裡根本沒有表格,它怎麼找出表格來?
從文字落在哪裡看出來。一頁紙先在旁邊有一欄小字的地方被分開;這一欄小字跟表格裡的一欄分得開,是因為表格的單元格恰好落在同一條基線上,而小字只是碰巧挨在旁邊。然後每一塊從上往下走,在標題和空白處切成一段一段,每一段的欄位,就是好幾行都認同一個單元格在那裡開始或者結束的位置。欄位相同的幾段會重新拼成一張表。這裡沒有按銀行或者按表單分的模板,所以也不存在哪種版式它沒學過。
### 它只能處理對帳單嗎?
不是。它一開始是個對帳單轉換工具,後來改成找出一份檔案裡的每一張表,因為頭一份真正拿來試的對帳單隻有兩筆交易,卻有另外五張表,一個只要交易的工具在上面什麼都沒找到。發票、價目表、時刻表、成績和報告,同樣都是表格。對帳單多出來的是餘額,只要有,工具就拿它核對每一行。
### 摘要太長、一欄放不下的時候會怎麼樣?
它會被並回它那一行,而這正是大多數 PDF 轉 CSV 的結果沒法用的原因。只有一格文字、緊挨著某一行的一行,就是那一行的單元格的延續;如果它離下面那一行更近,就併到下面那一行裡,一段放在數值上方、太長而折行的標籤就是這麼印的。帶著不止一格、或者帶著數字的一行,是它自己的一行。
### 它到底怎麼可能知道我的對帳單讀對了沒有?
因為大多數對帳單都帶著餘額,而餘額是一次證明,不是裝飾。如果每一行上印著的餘額,確實等於上一行的餘額加上這一行的金額,那麼金額就讀對了、行就分對了,而且沒有哪一行被漏掉或者算了兩遍,因為上面任何一種錯誤,都會正好在出錯的那一行把鏈子打斷。工具在每一行上做這道減法,然後把結果告訴你。它找餘額那一欄用的也是同一道算術,而不是去讀表頭,所以一張能透過的表,必然意味著欄位也認對了。沒有餘額的表格沒法這樣核對,頁面也不會假裝核對過。
### 日期出錯了。03/04 是 3 月 4 日,不是 4 月 3 日。
改表格上方那個選項,全部立刻重算。純數字的日期確實有歧義,而工具是從這份檔案本身來定它,不是從你所在的地區:只要這份檔案裡任何一處的日期有大於 12 的那一位,僅這一行就把所有日期的順序定下來了,頁面也會說明這一點。當每一個日期都落在 12 號或者更早的時候,檔案裡沒有任何東西能把兩種順序分開,所以它會說的正是*這件事*,並且先按日在前來算,直到你另行指定。像信用卡對帳單那樣不帶年份印出來的日期,原樣保留。
### 掃描出來的 PDF 能用嗎?
不能,而且它會直說,而不是丟給你一個空檔案。掃描檔是一張照片:那些行是畫素,沒有可以對齊的文字。頁面接著會告訴你可以怎麼辦;如果是對帳單,頭一條建議正是大多數人會忽略的那條,幾乎每一家網上銀行都可以直接給你同一份對帳單的 CSV、OFX 或者 QIF,那既不用轉換,也比從任何一張圖裡讀出來更準確。
### 帶密碼的 PDF 它能開啟嗎?
不能,而且這是故意的。銀行會給很多對帳單上鎖,通常用出生日期或者帳號的後幾位。把這層保護取掉,跟讀出一張表是兩回事,所以工具會拒絕,並且指給你幾條不用把檔案交出去的路。最好的一條是本站的 [PDF 解鎖工具](https://abox.tools/zh-TW/unlock-pdf/):它在你自己的瀏覽器裡把密碼取下來,頁面上一個字都不改寫,所以文字會原樣落在它當初被印上去的位置。用 Chrome 或者 Edge 輸入密碼開啟再列印回 PDF,或者在 Mac 上用「預覽」匯出,也一樣可以。不要用別的那些說能替你解鎖的網站,那正是把這一頁存在的意義所要擋住的那份檔案傳上去。
### 我的 PDF 會被上傳到什麼地方嗎?
不會。檔案是你自己的瀏覽器在你自己的硬體上讀的,CSV 也是這樣寫出來的。這個工具沒有伺服器那一端,頁面的 `Content-Security-Policy` 列出了它可以聯絡的每一個地址,其中沒有一個屬於本站。最簡單的證明,是斷開網路,照樣轉一份 PDF。
### CSV 開頭那個奇怪的字元是什麼?
那是位元組序標記,是故意留的。Windows 上的 Excel 讀一個沒有它的 CSV 時,會按系統的舊內碼表來解,於是一張以英鎊或者歐元記帳的表格,貨幣符號會變成一個字母。這個標記告訴它這是 UTF-8。所有要緊的讀取程式都會悄悄跳過它;嚴格到會把它顯示出來的解析器,會給你一個開頭帶著不可見字元的首列表頭,這就是這個取捨的代價。
### 有大小限制嗎?要錢嗎?
工具裡沒有寫死任何限制。限制是你自己的機器:檔案在讀的時候是放在記憶體裡的,幾百頁的量,一臺筆記本處理起來不會有怨言。它是免費的,不註冊、不登入,也沒有試用期。本站帶廣告,那是養活它的東西;廣告拿不到任何關於你檔案的內容。
### 斷網能用嗎?
能。把頁面載入一次,然後斷開網路,它照樣能用。這也是證明什麼都沒被上傳的最簡單的辦法:一個把你的檔案發出去轉換的工具,你一拔網線它就停了。
## 這條隱私承諾怎麼核實
- **人們拿來轉換的 PDF,恰恰是最經不起上傳的那些。** 沒有人會為一張自己能重新敲一遍的表去找轉換工具。來到這裡的是對帳單、發票、工資條和報告:一份你付給了誰、付完還剩多少的名單,一位客戶的報價,一家公司的數字。把這些交給陌生人的伺服器去換一張表格,意味著他們拿到了、留下了,並且因此成了一個值得攻擊的目標。這一頁沒有另一頭:根本沒有可以發過去的地方。
- **表格帶著餘額的時候,每一行都會拿它核對。** 在 PDF 裡找出一張表是推斷,不是閱讀:哪幾行屬於一起、一欄在哪裡結束、一行是新的一行還是上一行的延續,都是推斷。碰上這裡沒見過的排版,任何一步都可能推錯。對帳單上的餘額就是對付這件事的證明:這一行的餘額,必須等於上一行的餘額加上這一行的金額,任何一個數字讀錯、任何一行漏掉或者重複,都會正好在出問題的那一行把這條鏈子打斷。頁面會說有多少行對上了。大多數表格沒有餘額,這時頁面什麼都不說:這些行是頁面上寫的內容,這裡不會聲稱比這更多。
- **表格是從紙面上看出來的,不是靠每家銀行、每種表單一套模板。** 這個工具裡沒有銀行列表,也沒有版式列表,也就不存在「你的版式不在裡面」。一頁紙會在旁邊有一欄小字的地方被分開,然後在每一塊裡找那些單元格對得齊的連續幾行。所以它在一家沒人聽說過的銀行的對帳單上、在一份沒人見過的報告上也能用,而碰上欄與欄真的擠在一起的那種表,它也真的會失敗。
- **密碼不由它來取,頁面會告訴你去哪裡取。** 帶密碼的 PDF 會被拒絕,而不是被開啟。把一份檔案的保護取掉,跟讀出裡面的表格是兩回事,一聲不響地替你做掉,是一個工具不該有的舉動。頁面做的是另一件事:把那些不用把檔案交出去的辦法列給你。頭一條是本站的 [PDF 解鎖工具](https://abox.tools/zh-TW/unlock-pdf/),它在你自己的瀏覽器裡把密碼取下來,頁面上什麼都不改寫;也可以用瀏覽器或者「預覽」把它列印、匯出成一份新的 PDF。它仍然明明白白地說,不要把這份檔案交給別的任何一個說能替你解鎖的網站,那正是這一頁要擋住的那一次上傳。
- **它讀不了一頁紙的照片,也不假裝能讀。** 掃描檔是一張圖:那些行是畫素,檔案裡根本沒有可以對齊成欄的文字。這一點會被如實報告,同時給出不用上傳任何東西的幾條路;如果那是一份對帳單,頭一條是大多數人都有、卻想不起來的那條,銀行幾乎一定可以直接給你同一份對帳單的 CSV。從圖裡認字叫 OCR,那是另一個工具,不是這一個。
- **Google 載入了什麼,又沒拿到什麼。** 廣告和統計指令碼來自 Google。這兩個都沒有拿到關於你檔案的任何東西:不是檔案,不是某張表、某一行,不是某個數字、檔名或者頁數。每一行讀 PDF 或者寫 CSV 的程式碼都由這個源站發出,並且列在程式碼儲存庫裡。
- **打賞按鈕載入了什麼,又沒拿到什麼。** 頁首上那個「Buy me a coffee」按鈕,是由 cdnjs.buymeacoffee.com 的一段指令碼畫出來的,字型取自 Google Fonts。它就是一個連結,僅此而已:它不上報訪問,也拿不到任何關於你或者你檔案的東西。你不點它就什麼都不會發生,而點下去要去的是別人的網站。
- **斷網也能用。** 把網路斷掉,這一頁上的所有功能照常。這是最簡單的一個證明:一個把你的檔案發出去轉換的工具,這時候就停了。
**你可以自己核對。**上面這些不用你信。這個頁面是儲存庫裡的模板和配置產生出來的,構建指令碼你能讀,也能自己跑一遍,跑出來的結果就提交在 `dist` 分支上。拿實際發給你的內容,跟你自己從原始碼構建出來的結果對一遍就知道了: https://github.com/A-Box-of-Tools/website
最值得先讀的幾個檔案:`config/site.toml` 裡是 Content-Security-Policy,一頁紙在沒有任何表格線可依的情況下是怎麼分成幾塊的,看 `src/layout.js`;表格和它們的欄位是怎麼找出來的,看 `src/tables.js`;一行一行是怎麼排出來的,看 `src/rows.js`;證明一份對帳單的那段算術在 `src/check.js`。這幾個都夠不著網路,它們底下負責讀 PDF 的部分也一樣。
怎麼把 PDF 裡的表格轉成 CSV 選一份 PDF。 一次一份。瀏覽器直接從你的硬碟上把它讀進來,而且是整份都讀完再決定任何事,因為這份檔案寫的是 1.240,00 還是 1,240.00、日期是哪一種順序,都是關於這份檔案的事實,不是關於某一頁的。 看看它找出來的那些表。 每一頁上的每一張表,各有各的欄位,頁面上印了表頭的地方就用它自己的表頭。跨兩個小節或者兩頁、表頭相同的一張表算一張,中間不會重複表頭。折到第二行的單元格會並回它那一行。合計、小計和標籤,都按它們在頁面上的樣子作為行出來。 挑一張,或者全要。 表不止一張的時候,表格上方那個選項決定哪些進 CSV:全部一張接一張,或者只要你來找的那一張。要是某張錶帶著餘額,表格上方那一行會說每一行是不是都對上了。帶年份的日期寫成 YYYY-MM-DD,金額是帶正負號的普通數字;沒有年份的日期原樣保留,因為它屬於哪一年只能靠猜。 把 CSV 拿走。 它按 RFC 4180 寫,該加的引號都加,行尾是 CRLF,編碼是帶位元組序標記的 UTF-8,這樣 Excel 開啟它的時候貨幣符號還是貨幣符號,而不會變成一串字母。所有表放在一個檔案裡的時候,每張表保留自己的表頭行,表與表之間空一行。做出它來沒有上傳過任何東西。 說得更細的版本 Is it safe to upload a bank statement? A statement is every payee, every amount and your balance in one file. Here is what a converter receives, what the careful ones do with it, and how to tell whether the upload needed to happen at all.