为什么所有金额值都是负数?

Hacker News Top 新闻

摘要

作者解释了为什么客户的PDF银行对账单上所有金额都显示为负数:PDF在与背景相同的灰度级别中编码了不可见的尾随负号,提取代码将其当作可见文本读取。他们讨论了OCR或剥离非黑色文本等解决方案。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/07 23:13

# 为什么所有金额都是负数? 来源:https://bankstatementconverter.com/blog/posts/2026-08-02-why-are-all-amounts-negative/ 几天前,我收到一位客户的邮件,说所有金额都变成了负数。我转换了他们的 PDF。 ### PDF 示例 ### 转换后的示例 客户说得对,所有金额都变成了负数。这很奇怪。有趣的是,列标题以减号字符结尾。随后我在 PDFSnake (https://pdfsnake.app/) 中打开了这个 PDF,查看文本是如何编码的。让我们看看“$110.00-”和“$1,527.57”是如何编码的。 ### $110.00- PDF 由一系列命令组成。我们来看一下这一段中出现的命令。 BT:Begin Text(开始文本)。通知 PDF 渲染器进入文本渲染模式,并保存之前的图形状态。在 Begin Text 和 End Text 块内,只允许使用文本操作符。 ET:End Text(结束文本)。通知 PDF 退出文本渲染模式,并将图形状态恢复到 BT 命令之前的状态。 Tf:设置文本字体和字号。 Td:移动文本位置。 Tj:显示文本。 g:设置非描边操作(填充)的灰度值。 G:设置描边操作的灰度值。 上述 PDF 命令可以概括为:“绘制文本($110.00)。将灰度值设置为 0。绘制文本(-)” ### $1,527.57- 这些命令我们都见过,结构也类似。但有一个关键区别:绘制减号字符时,灰度值被设置为 0.878。这个减号的灰度值与背景色的灰度值相同,因此减号不可见。字符是存在的,但不可见,这就是我的代码在处理这个 PDF 时会提取到它的原因。 ### 他们为什么这样编码这个 PDF? 我不知道,但我可以猜测一下。 他们在这个 PDF 中使用了尾随减号。尾随减号会让右对齐变得有点困难,因为他们不只是想要基本的右对齐,而是希望数字元素在忽略减号的情况下右对齐。实现这一点的方法之一是始终为减号留出空间。但减号有多宽呢?这取决于字体大小,也许很难预测。因此,他们转而为正值添加了不可见的减号。 这样 PDF 看起来是很好,但从中提取数据却非常麻烦。如果他们使用前导减号,就可以避免所有这些问题,但出于某种原因,他们想要的是尾随减号。好了,现在我们知道这个问题的原因了,那么如何让这个 PDF 正确转换呢?我看到了两种解决方案。 ### 解决方案 #1 - 对 PDF 进行 OCR 识别 我可以不读取 PDF 中的文本元素,而是将 PDF 转换为一组 PNG 文件,然后在 PNG 文件上运行 OCR 软件。这应该可行,但也有一些缺点。OCR 识别并非 100% 准确。它效果相当好,但总有可能出现字符识别错误。而且 OCR 识别速度会慢得多。 ### 解决方案 #2 - 去除非黑色文本 对于这种对账单类型,只有黑色文本是有效的。设置为其他颜色的文本元素都可以被视为不可见。这应该可行,但有一个问题:在 Bank Statement Converter 中提取文本时,我不会存储文本的颜色。所以我需要添加代码来实现这一点。不过这应该不会太难。

相似文章