如何使用python从PDF文件中仅提取特定文本

时间:2020-09-30 16:55:41

标签: python dataframe tesseract python-tesseract

如何仅使用python从PDF文件中提取某些特定文本,并将输出数据存储到Excel的特定列中。

这是示例输入的PDF文件(File.pdf)

链接到完整的PDF文件File.pdf

enter image description here

我们需要从整个PDF文件中提取 值,发票编号,到期日和应付总额

到目前为止我使用过的脚本:

    from io import StringIO

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('file.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

print(output_string.getvalue())

但无法从PDF文件获取特定的输出值。

2 个答案:

答案 0 :(得分:1)

如果您想以自己的方式查找数据(pdfminer),则可以搜索一种模式以提取数据,如下所示(根据给定的数据,新的是正则表达式):

from io import StringIO
import re

from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser

output_string = StringIO()
with open('testfile.pdf', 'rb') as in_file:
    parser = PDFParser(in_file)
    doc = PDFDocument(parser)
    rsrcmgr = PDFResourceManager()
    device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)

finding = re.search(r"INV-\d+\n\d+\n.+\n.+\n\$\d+\.\d+", output_string.getvalue())

invoice_no, order_no, _, due_date, total_due = finding.group(0).split("\n")

print(invoice_no, order_no, due_date, total_due)

如果要在excel中存储数据,则可能必须更具体(或打开一个新问题)或查看以下页面:

Writing to an Excel spreadsheet

https://www.geeksforgeeks.org/writing-excel-sheet-using-python/

https://xlsxwriter.readthedocs.io/

PS:另一个答案似乎是一个很好的解决方案,您只需要过滤数据

编辑: 第二个解决方案。在这里,我使用另一个包PyPDF2,因为在那里您可以以其他顺序获取数据(也许使用PDFMiner也可以)。如果值之前的文本始终相同,则可以找到以下数据:

import re
import PyPDF2

def parse_pdf() -> list:
    with open("testfile.pdf", "rb") as file:
        fr = PyPDF2.PdfFileReader(file)
        data = fr.getPage(0).extractText()

    regex_invoice_no = re.compile(r"Invoice Number\s*(INV-\d+)")
    regex_order_no = re.compile(r"Order Number(\d+)")
    regex_invoice_date = re.compile(r"Invoice Date(\S+ \d{1,2}, \d{4})")
    regex_due_date = re.compile(r"Due Date(\S+ \d{1,2}, \d{4})")
    regex_total_due = re.compile(r"Total Due(\$\d+\.\d{1,2})")

    invoice_no = re.search(regex_invoice_no, data).group(1)
    order_no = re.search(regex_order_no, data).group(1)
    invoice_date = re.search(regex_invoice_date, data).group(1)
    due_date = re.search(regex_due_date, data).group(1)
    total_due = re.search(regex_total_due, data).group(1)

    return [invoice_no, due_date, total_due]


if __name__ == '__main__':
    print(parse_pdf())

也许您必须更改正则表达式,因为它们仅基于给定的示例。正则表达式只有在找到正则表达式时才起作用,因此每个正则表达式必须使用try: except;)
如果这样不能回答您的问题,则必须提供更多信息/示例pdf。

答案 1 :(得分:0)

您可以使用表格提取数据,并使用python创建一个Excel文件:

df = ("./Downloads/folder/myfile.pdf")
output = "./Downloads/folder/test.csv"
tabula.convert_into(df, output, output_format="csv", stream=True) 

excel文件创建: https://www.geeksforgeeks.org/python-create-and-write-on-excel-file-using-xlsxwriter-module/