为什么所有金额值都是负数?
摘要
作者解释了为什么客户的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 中提取文本时,我不会存储文本的颜色。所以我需要添加代码来实现这一点。不过这应该不会太难。
相似文章
@VikParuchuri:PDF 常常会对文件内部文字和字符的位置给出错误信息或直接遗漏。以下来看看出现这种情况的 5 种方式。
Vik Paruchuri 阐述了 PDF 漏报或错报文字和字符位置的 5 种方式,指出了文档解析和 OCR 流程中的一项关键挑战。
如何从印度银行对账单PDF中提取交易表格?寻找开源/本地部署方案
作者正在开发一个信用承保AI代理,并寻求开源本地部署方法,从多样化的印度银行对账单PDF中提取结构化交易表格,面临布局变化的挑战,需要可靠的提取方法。
如果你的PDF提取器返回的是空字符串,那文件可能并没有损坏。
一位开发者描述了构建PDF分类工具的过程,该工具通过检查PDF结构来判断其包含文本层还是由扫描图像组成,从而避免静默的空提取失败,并分享了关于虚假文本检测和幻影表格的陷阱。
@VikParuchuri:如果你是盲人,大多数PDF都是一团糟——修复一个可能要花费超过100美元。我们的API现在让它们变得可用,只需几分钱。
发布了一个API,能够修复PDF中的乱码内容,使其对盲人用户可用,并将成本从100多美元大幅降低到几分钱。
我们的AI智能体向客户开具了0.00美元的发票,而我们的日志却未发现异常。以下是我们如何发现的。
一位工程师描述了他们的AI销售智能体如何自信地开具0.00美元的发票,原因是它将空值折扣字段误解为100%折扣,这凸显了调试智能体工作流的难度以及全面执行追踪的必要性。