页面代码没有启动。

直接从文件夹打开 index.html 会阻止 JavaScript 模块加载,所以选择一份 PDF后不会有任何反应。 请改用 http 方式提供此目录:

powershell -ExecutionPolicy Bypass -File serve.ps1

Then open http://localhost:8080/.

PDF 转 CSV

将检测到的 PDF 文本表格转换成电子表格可打开的行。

查看源码
你的文件在你自己的浏览器里处理,不做任何上传。

你选的那份 PDF,是在这台机器的内存里打开、读取的,用的是从这个地址发来的代码,CSV 也是这样写出来的。这里根本没有能做上传的东西,这一页的另一头也没有服务器可以接收。表格里写的东西,不管是账号、余额、一串收款方还是客户的报价,都留在这个标签页里。

实时检查: 核对中…

离线: 核对中…

别听我们说。打开开发者工具,盯着网络面板,然后转一份 PDF。没有任何一条请求带着某一页、某一行、某个数字或者文件名。或者干脆断网,照样能转。

1 选一份 PDF

2 核对它读出来的内容

PDF 看着像装着表格,其实没有:它装的是落在纸面各个位置上的文字,那几道栏是没人印过的空白。所以下面每一张表都是推出来的,不是读出来的。要是其中一张带着余额,表格上面会说明哪些余额比较相符、哪些行无法核对。余额相符只说明净变动对得上,互相抵消的错误仍可能通过。

3 把 CSV 拿走

以 Markdown 查看

怎么把 PDF 里的表格转成 CSV

  1. 选一份 PDF。一次一份。浏览器直接从你的硬盘上把它读进来,而且是整份都读完再决定任何事,因为这份文件写的是 1.240,00 还是 1,240.00、日期是哪一种顺序,都是关于这份文件的事实,不是关于某一页的。
  2. 看看它找出来的那些表。检查每个检测到的表格、列和可恢复的标题。跨页表格可能被连接,换行单元格会归并到其所属行。保存 CSV 前,请对照原文检查是否遗漏表格、错误合并行或出现布局错误。
  3. 挑一张,或者全要。表不止一张的时候,表格上方那个选项决定哪些进 CSV:全部一张接一张,或者只要你来找的那一张。要是某张表带着余额,表格上方那一行会说明哪些余额比较相符、哪些行无法核对。带年份的日期写成 YYYY-MM-DD,金额是带正负号的普通数字;没有年份的日期原样保留,因为它属于哪一年只能靠猜。
  4. 把 CSV 拿走。它按 RFC 4180 写,该加的引号都加,行尾是 CRLF,编码是带字节序标记的 UTF-8,这样 Excel 打开它的时候货币符号还是货币符号,而不会变成一串字母。所有表放在一个文件里的时候,每张表保留自己的表头行,表与表之间空一行。做出它来没有上传过任何东西。

更完整的说明

上传银行账单安全吗? 账单把收款人、金额和余额放在一个文件中。了解转换器得到什么,谨慎服务如何处理,以及如何分辨上传是否必要。

有疑问?

PDF 里根本没有表格,它怎么找出表格来?

从文字落在哪里看出来。一页纸先在旁边有一栏小字的地方被分开;这一栏小字跟表格里的一栏分得开,是因为表格的单元格恰好落在同一条基线上,而小字只是碰巧挨在旁边。然后每一块从上往下走,在标题和空白处切成一段一段,每一段的栏位,就是好几行都认同一个单元格在那里开始或者结束的位置。栏位相同的几段会重新拼成一张表。这里没有按银行或者按表单分的模板,所以也不存在哪种版式它没学过。

它只能处理对账单吗?

不是。它一开始是个对账单转换工具,后来改成找出一份文件里的每一张表,因为头一份真正拿来试的对账单只有两笔交易,却有另外五张表,一个只要交易的工具在上面什么都没找到。发票、价目表、时刻表、成绩和报告,同样都是表格。对账单多出来的是余额,只要有,工具就比较可读余额之间的净变动。

摘要太长、一栏放不下的时候会怎么样?

它会被并回它那一行,而这正是大多数 PDF 转 CSV 的结果没法用的原因。只有一格文字、紧挨着某一行的一行,就是那一行的单元格的延续;如果它离下面那一行更近,就并到下面那一行里,一段放在数值上方、太长而折行的标签就是这么印的。带着不止一格、或者带着数字的一行,是它自己的一行。

余额核对能说明什么?

工具把两个可读余额之间的金额合计与余额变化比较,说明有多少次比较相符。同一道算术也用来识别可能的余额栏和金额栏,不依赖表头文字。页面会列出无法核对的行:第一个余额之前或最后一个余额之后的金额,以及含有缺失或无法读取金额的区间。借方或贷方没有用到的空白单元格按零算,无法读取的值不会按零算。余额相符不能排除互相抵消的错误,也不能验证描述和日期。使用 CSV 之前仍需对照 PDF 检查。

日期出错了。03/04 是 3 月 4 日,不是 4 月 3 日。

改表格上方那个选项,全部立刻重算。纯数字的日期确实有歧义,而工具是从这份文件本身来定它,不是从你所在的地区:只要这份文件里任何一处的日期有大于 12 的那一位,仅这一行就把所有日期的顺序定下来了,页面也会说明这一点。当每一个日期都落在 12 号或者更早的时候,文件里没有任何东西能把两种顺序分开,所以它会说的正是这件事,并且先按日在前来算,直到你另行指定。像信用卡对账单那样不带年份印出来的日期,原样保留。

扫描出来的 PDF 能用吗?

不能,而且它会直说,而不是丢给你一个空文件。扫描件是一张照片:那些行是像素,没有可以对齐的文字。页面接着会告诉你可以怎么办;如果是对账单,头一条建议正是大多数人会忽略的那条,几乎每一家网上银行都可以直接给你同一份对账单的 CSV、OFX 或者 QIF,那既不用转换,也比从任何一张图里读出来更准确。

带密码的 PDF 它能打开吗?

不能,而且这是故意的。银行会给很多对账单上锁,通常用出生日期或者账号的后几位。把这层保护取掉,跟读出一张表是两回事,所以工具会拒绝,并且指给你几条不用把文件交出去的路。最好的一条是本站的 PDF 解锁工具:它在你自己的浏览器里把密码取下来,页面上一个字都不改写,所以文字会原样落在它当初被印上去的位置。用 Chrome 或者 Edge 输入密码打开再打印回 PDF,或者在 Mac 上用「预览」导出,也一样可以。不要用别的那些说能替你解锁的网站,那正是把这一页存在的意义所要挡住的那份文件传上去。

我的 PDF 会被上传到什么地方吗?

不会。文件是你自己的浏览器在你自己的硬件上读的,CSV 也是这样写出来的。这个工具没有服务器那一端,页面的 Content-Security-Policy 列出了它可以联系的每一个地址,其中没有一个属于本站。最简单的证明,是断开网络,照样转一份 PDF。

CSV 开头那个奇怪的字符是什么?

那是字节序标记,是故意留的。Windows 上的 Excel 读一个没有它的 CSV 时,会按系统的旧代码页来解,于是一张以英镑或者欧元记账的表格,货币符号会变成一个字母。这个标记告诉它这是 UTF-8。所有要紧的读取程序都会悄悄跳过它;严格到会把它显示出来的解析器,会给你一个开头带着不可见字符的首列表头,这就是这个取舍的代价。

有大小限制吗?要钱吗?

工具里没有写死任何限制。限制是你自己的机器:文件在读的时候是放在内存里的,几百页的量,一台笔记本处理起来不会有怨言。它是免费的,不注册、不登录,也没有试用期。本站带广告,那是养活它的东西;广告拿不到任何关于你文件的内容。

断网能用吗?

能。把页面加载一次,然后断开网络,它照样能用。这也是证明什么都没被上传的最简单的办法:一个把你的文件发出去转换的工具,你一拔网线它就停了。