我试图从这个PDF中的表格中获取数据。我已经尝试使用pdfminer和pypdf,但是我无法从表格中获得数据。
以下是其中一个表格的样子: 如您所见,某些列用“x”标记。我试图将此表格转换为对象列表。
这是到目前为止的代码,我现在正在使用pdfminer。
那会生成一个文本文件并获取所有文本,但是x的间距不会被保留。输出结果如下: 文本文档中的x只有单个空格。
现在,我只是产生文本输出,但我的目标是使用表格数据生成html文档。我一直在寻找OCR示例,但大多数似乎令人困惑或不完整。我可以使用C#或任何其他可能产生我需要的结果的语言。
编辑:将有多个类似于此的pdf,我需要从中获取表格数据。标题对于所有pdf都将相同(据我所知)。
以下是其中一个表格的样子: 如您所见,某些列用“x”标记。我试图将此表格转换为对象列表。
这是到目前为止的代码,我现在正在使用pdfminer。
# pdfminer test
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice, TagExtractor
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, PDFPageAggregator
from pdfminer.cmapdb import CMapDB
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage
from pdfminer.image import ImageWriter
from cStringIO import StringIO
import sys
import os
def pdfToText(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ''
maxpages = 0
caching = True
pagenos = set()
records = []
i = 1
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,
caching=caching, check_extractable=True):
# process page
interpreter.process_page(page)
# only select lines from the line containing 'Tool' to the line containing "1 The 'All'"
lines = retstr.getvalue().splitlines()
idx = containsSubString(lines, 'Tool')
lines = lines[idx+1:]
idx = containsSubString(lines, "1 The 'All'")
lines = lines[:idx]
for line in lines:
records.append(line)
i += 1
fp.close()
device.close()
retstr.close()
return records
def containsSubString(list, substring):
# find a substring in a list item
for i, s in enumerate(list):
if substring in s:
return i
return -1
# process pdf
fn = '../test1.pdf'
ft = 'test.txt'
text = pdfToText(fn)
outFile = open(ft, 'w')
for i in range(0, len(text)):
outFile.write(text[i])
outFile.close()
那会生成一个文本文件并获取所有文本,但是x的间距不会被保留。输出结果如下: 文本文档中的x只有单个空格。
现在,我只是产生文本输出,但我的目标是使用表格数据生成html文档。我一直在寻找OCR示例,但大多数似乎令人困惑或不完整。我可以使用C#或任何其他可能产生我需要的结果的语言。
编辑:将有多个类似于此的pdf,我需要从中获取表格数据。标题对于所有pdf都将相同(据我所知)。