Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PDFMiner从pdf中提取表格?_Python_Parsing_Pdf_Pdfminer - Fatal编程技术网

Python 如何使用PDFMiner从pdf中提取表格?

Python 如何使用PDFMiner从pdf中提取表格?,python,parsing,pdf,pdfminer,Python,Parsing,Pdf,Pdfminer,我试图从pdf文档中的一些表中提取信息。考虑输入: 标题1 一些文本一些文本一些文本一些文本一些文本一些文本 一些文本一些文本一些文本一些文本一些文本一些文本 表名 |Col1 | Col2 | Col3| |--------|-----|-----| |瓦尔11 |瓦尔12 |瓦尔13| |瓦尔21 |瓦尔22 |瓦尔23| |val31 | val32 | val33| 标题2 更多文本更多文本更多文本更多文本更多文本更多文本 更多的文字 更多文本更多文本更多文本更多文本更多文本更多文本 我

我试图从pdf文档中的一些表中提取信息。考虑输入:

标题1 一些文本一些文本一些文本一些文本一些文本一些文本 一些文本一些文本一些文本一些文本一些文本一些文本 表名 |Col1 | Col2 | Col3| |--------|-----|-----| |瓦尔11 |瓦尔12 |瓦尔13| |瓦尔21 |瓦尔22 |瓦尔23| |val31 | val32 | val33| 标题2 更多文本更多文本更多文本更多文本更多文本更多文本 更多的文字 更多文本更多文本更多文本更多文本更多文本更多文本 我可以获得以下提纲/标题:

path='myFile.pdf'
# Open a PDF file.
fp = open(path, 'rb')
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)
# Create a PDF document object that stores the document structure.
# Supply the password for initialization.
document = PDFDocument(parser, '')
outlines = document.get_outlines()
for (level,title,dest,a,se) in outlines:
    print (level, title)
这给了我:

1,u‘标题1’ 2、u形桌标题 1,u‘标题2’ 这是完美的,因为级别与文本层次结构对齐。现在我可以按如下方式提取文本:

if not document.is_extractable:
    raise PDFTextExtractionNotAllowed
# Create a PDF resource manager object that stores shared resources.
rsrcmgr = PDFResourceManager()
# Create a PDF device object.
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
# Create a PDF interpreter object.
interpreter = PDFPageInterpreter(rsrcmgr, device)
# Process each page contained in the document.
text_from_pdf = open('textFromPdf.txt','w')
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    layout = device.get_result()
    for element in layout:
        if isinstance(element, LTTextBox):
            text_from_pdf.write(''.join([i if ord(i) < 128 else ' '
                                            for i in element.get_text()]))

这有点奇怪,因为表是以列方式提取的。我可以把桌子一行一行地拿出来吗?此外,我如何识别表格的开始和结束位置?

如果您只想从PDF文档中提取表格,请查看以下答案:


从这个答案中,我尝试了一种对我有用的方法,即在多页PDF上分布数字表。tabla py正确跳过了所有页眉和页脚。之前,我曾在同一类型的文档上尝试过PDFMiner,但我遇到了与您提到的相同的问题,有时甚至更糟。

如果您只想从PDF文档中提取表格,请查看以下答案:


从这个答案中,我尝试了一种对我有用的方法,即在多页PDF上分布数字表。tabla py正确跳过了所有页眉和页脚。之前,我曾在同一类型的文档上尝试过PDFMiner,但我遇到了与您提到的相同的问题,有时甚至更糟。

使用camelot从PDF中提取表格

如果您可以逐列提取表格并将其存储到2D列表中,请使用camelot从PDF中提取表格

,然后,您应该能够将其转换为一行一行的格式。这通常是通过内置函数完成的。至于查找表的结尾,您需要查看是否可以检测到格式的某些更改。谢谢,但问题是我不知道表从哪里开始。我文档中的任何标题都可以表示一个表。我怎么知道呢?若pdf文档只有一个来源,那个么表的构造可能有一种模式。如果你能找出你的代码并注意它。不幸的是,我不认为pdf文件有任何形式的表元素,所以这样做可能是你唯一的办法…谢谢,有意义。我必须根据我的数据设计一个策略。如果你能逐列提取表格,并将其存储到一个2D列表中,那么你应该能够将其转换为逐行格式。这通常是通过内置函数完成的。至于查找表的结尾,您需要查看是否可以检测到格式的某些更改。谢谢,但问题是我不知道表从哪里开始。我文档中的任何标题都可以表示一个表。我怎么知道呢?若pdf文档只有一个来源,那个么表的构造可能有一种模式。如果你能找出你的代码并注意它。不幸的是,我不认为pdf文件有任何形式的表元素,所以这样做可能是你唯一的办法…谢谢,有意义。我必须根据我的数据制定一个策略。