银行账单为何全是负数?
Why are all the amounts values negative?

几天前,一位客户发邮件抱怨转换后的银行账单金额全变成了负数。我检查了原始 PDF,发现列标题末尾确实带有减号。通过 PDFSnake 深入分析,我揭开了真相:对于正数金额,减号字符被编码在 PDF 中,但其灰度值被设置为与背景色一致,导致肉眼不可见,但文本提取代码却能读取到。这种设计初衷是为了在保持数字右对齐的同时处理尾随减号,却给数据提取带来了麻烦。面对这一难题,我考虑了两种方案:一是使用 OCR 技术将 PDF 转为图片再识别,虽然准确但速度慢;二是修改代码以过滤非黑色文本,这需要额外开发。
这个字符确实存在,只是不可见,这就是为什么我的代码在处理这个 PDF 时会把它提取出来。
- rmunn
我原本以为会看到关于复式记账法的内容,以及为什么在标记某笔分录是借方(-100)还是贷方(+100)时,起初会让人感到反直觉,尤其是针对负债类科目(当你在账本中录入信用卡还款时,如果你还没完全搞懂这套系统,符号往往和你直觉预期的不一样)。
结果却是一篇不错的博客,讲的是一个因为有人滥用语义化标记来做样式而引发的棘手小问题。这说明 HTML 并不是唯一有这种问题的格式。PDF 作为提取数据的格式本来就已经够糟糕了,我们不需要再在上面叠加这些愚蠢的、受 HTML 启发的把戏。
OP 干得漂亮,找到了问题并解释得很清楚。感谢这篇有趣的文章。
- deepsun
为什么不直接跳过所有的负号,除非它们紧挨着数字前面?我看所有的负号都在数字后面,而不是前面,所以只要不在前面就跳过。最好在包含该数字的同一个 BT/ET 块内处理。
- happymellon
这篇文章是开放式结局吗?
他们尝试过某种方法吗?反馈如何?