我一直在使用 tabula-py、PyPDF2 和 tika 模块,但它们似乎都没有检测到 table 单元格的背景颜色,该单元格位于 PDF 文件中。
这些彩色单元格在我的问题中表示重要信息。例如,我知道 tabula-py 是 tabula-java 的包装器,而这个包装器不提供彩色单元格信息。 Python 中有一些易于遵循的解决方案吗?
提前致谢。
回答1
免责声明:我是此答案中使用的库 borb
的作者
关于 PDF: PDF 与其说是“所见即所得”的格式,不如说它是一个渲染指令的容器。这意味着 table 实际上只是绘制指令的集合,它绘制了我们人类解释为 table 的东西。就像是:
- 前往位置 x, y
- 将当前笔触颜色设置为黑色
- 将当前填充颜色设置为蓝色
- 将字体设置为 Helvetica,大小 12
- 画一条线到 x, y
- 向上移动笔
- 去 x, y
- 渲染字符串“Hello World”
每当 PDF 库从 PDF 中提取 tables 时,请务必记住这是一种启发式方法。它基于一些假设。例如“tables 往往有大量以 90 度角相交的线”。
我建议你看看 borb
中的 TableDetectionByLines
。它是一个收集上述渲染指令并在 PDF 文档中输出 tables 位置的类。
你会这样使用它:
from borb.pdf.canvas.layout.table.table import Table, TableCell
from borb.pdf.document.document import Document
from borb.pdf.page.page import Page
from borb.pdf.pdf import PDF
from borb.toolkit.table.table_detection_by_lines import TableDetectionByLines
doc: typing.Optional[Document] = None
with open(input_file, "rb") as input_pdf_handle:
l: TableDetectionByLines = TableDetectionByLines()
doc = PDF.loads(input_pdf_handle, [l])
assert doc is not None
tables: typing.List[Table] = l.get_tables_for_page(0)
就目前而言,此类不跟踪笔触/填充颜色。但是您可以轻松地对其进行子类化,并对其进行修改。