python - 如何使用 Python 提取 PDF 文件中 table 单元格的背景颜色?

我一直在使用 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)

就目前而言,此类不跟踪笔触/填充颜色。但是您可以轻松地对其进行子类化,并对其进行修改。

为此,我将从https://github.com/jorisschellekens/borb/blob/f426f54f1b42e673ecb34a5c3c7ba2c28a505f9b/borb/toolkit/table/table_detection_by_lines.py#L83开始。

相似文章

php - while 循环只在 FPDF 中打印 1 个结果

我想根据“where$bulan”调用数据,在数据库中$bulan有一些相同的数据,但如果我调用只显示第一个输入。我已经使用了while但它不起作用你们能帮忙吗?我有这样的代码<?phprequire...