BA-Chatbot/data_service/converter/pdf_converter.py

84 lines
3.6 KiB
Python
Raw Permalink Normal View History

2023-11-15 14:28:48 +01:00
"""
The PDFConverter class is a utility for converting PDF files into various formats for subsequent processing.
It employs libraries like pdfminer and pdfplumber to facilitate these conversions.
The class offers functionality to convert PDFs to text using pdfminer, to HTML format, and to extract tables from PDFs with pdfplumber.
While it currently utilizes specific libraries for these tasks, it's structured to potentially integrate other libraries like Camelot for table extraction, as indicated by the commented-out methods.
This converter acts as a critical pre-processing component in various data processing workflows, preparing PDF content for more detailed analysis or content management systems.
"""
from pathlib import Path
from typing import List
from io import StringIO
from pdfminer.high_level import extract_text_to_fp, extract_text
from pdfminer.layout import LAParams
import pdfplumber
import pandas as pd
# import camelot
class PDFConverter:
def __init__(self, init_haystack=True) -> None:
if init_haystack:
from haystack.nodes import PDFToTextConverter
from haystack import Document
self.haystack_converter = PDFToTextConverter(
remove_numeric_tables=True,
valid_languages=["de", "en"]
)
def convert_pdf_to_text_haystack(self, path: Path) -> List:
if self.haystack_converter:
docs = self.haystack_converter.convert(file_path=path, meta=None)
return docs
def convert_pdf_to_text_pdfminer(self, path: Path):
text = extract_text(path)
return text
def convert_pdf_to_html(self, path: Path):
output_string = StringIO()
with open(path, 'rb') as fin:
extract_text_to_fp(fin, output_string,
laparams=LAParams(), output_type='html', codec=None)
return output_string.getvalue()
# Function to convert extracted tables to HTML
def tables_to_html(self, tables):
html_tables = []
for table in tables:
df = pd.DataFrame(table[1:], columns=table[0])
html_table = df.to_html(index=False, border=1, table_id="table_data")
html_tables.append(html_table)
return html_tables
# Function to extract tables from PDF using pdfplumber
def extract_tables_from_pdf(self, pdf_path):
tables = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
page_tables = page.extract_tables()
for table in page_tables:
tables.append(table)
return tables
def convert_pdf_tables_pdfplumber(self,path:Path):
tables = self.extract_tables_from_pdf(path)
html_tables = self.tables_to_html(tables)
return html_tables
# Function to extract tables from PDF using Camelot
# def extract_tables_from_pdf_camelot(self,pdf_path):
# tables = camelot.read_pdf(pdf_path, flavor='stream', pages='all', split_text=True, strip_text='\n')
# return tables
# Function to convert extracted tables to HTML
# def tables_to_html_camelot(self,tables):
# html_tables = []
# for table in tables:
# df = table.df
# html_table = df.to_html(index=False, border=1, table_id="table_data")
# html_tables.append(html_table)
# return html_tables
# def convert_pdf_tables_camelot(self,path:Path):
# tables = self.extract_tables_from_pdf_camelot(path)
# html_tables = self.tables_to_html_camelot(tables)
# return html_tables