我目前正在尝试创建PDF文件表解析器,用户可以在其中定义PDF文件中的表状列,然后在“列坐标”中提取PDF文本。
要提取整个PDF文件的文本,我使用 pdftotext ,例如:(示例 invoice.pdf 文件)
pdftotext -f 1 -l 1 invoice.pdf -layout -l
生成:
Invoice #100
Document Date: 26/05 - 2019
www.domain.com
要提取页面的特定部分(根据我的列坐标),我使用:
pdftotext -f 1 -l 1 -x 0 -y 100 -W 200 -H 300 invoice.pdf -layout -
以下所有内容的坐标是什么
Invoice #100
Document Date:
因此上述命令将生成:
26/05 - 2019
www.domain.com
如您所见,上面的作品。它成功地从我的pdf文件中提取了文本(以及坐标中的文本)。
如果我运行pdftotext
命令而没有 -x -y -W -H
坐标,则会保留格式,但是如果使用坐标,它不会保留整个文档格式(这会使,因为它只查看页面的特定部分。
但是,我试图为文本输出创建文本解析器,为此,我需要保留格式。
正如您在我的原始PDF文件中看到的那样,26/05 - 2019
行实际上从第2行开始-但是当我使用坐标提取文本时,输出将在第一行显示它。
我想知道是否有解决办法?
我正在考虑将原始文本输出与具有坐标的输出进行比较,然后仅从原始文本输出中获取格式设置属性(换行符)并将其添加到第二个文本输出。
当前,这是在我的Python脚本中生成输出的代码:
column = defaultdict(list)
COLUMNS = [...]
for i, col in enumerate(COLUMNS):
cmd = ['pdftotext', ...]
proc = subprocess.Popen(
cmd, stdout=subprocess.PIPE, bufsize=0, text=True)
out, err = proc.communicate()
for line in out.splitlines():
column[0].append({"row": str(line)})
基本上只是将每一行添加到列表中。