ranajoy98 commited on
Commit
a8a0476
·
1 Parent(s): cd91256

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +182 -0
app.py ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import time
3
+ from pathlib import Path
4
+ import contextlib
5
+
6
+ logging.basicConfig(
7
+ level=logging.INFO,
8
+ format="%(asctime)s - %(levelname)s - %(message)s",
9
+ )
10
+
11
+
12
+ import gradio as gr
13
+ import nltk
14
+ import torch
15
+
16
+ from pdf2text import *
17
+
18
+ _here = Path(__file__).parent
19
+
20
+ nltk.download("stopwords") # TODO=find where this requirement originates from
21
+
22
+
23
+ def load_uploaded_file(file_obj, temp_dir: Path = None):
24
+ """
25
+ load_uploaded_file - process an uploaded file
26
+
27
+ Args:
28
+ file_obj (POTENTIALLY list): Gradio file object inside a list
29
+
30
+ Returns:
31
+ str, the uploaded file contents
32
+ """
33
+
34
+ # check if mysterious file object is a list
35
+ if isinstance(file_obj, list):
36
+ file_obj = file_obj[0]
37
+ file_path = Path(file_obj.name)
38
+
39
+ if temp_dir is None:
40
+ _temp_dir = _here / "temp"
41
+ _temp_dir.mkdir(exist_ok=True)
42
+
43
+ try:
44
+ pdf_bytes_obj = open(file_path, "rb").read()
45
+ temp_path = temp_dir / file_path.name if temp_dir else file_path
46
+ # save to PDF file
47
+ with open(temp_path, "wb") as f:
48
+ f.write(pdf_bytes_obj)
49
+ logging.info(f"Saved uploaded file to {temp_path}")
50
+ return str(temp_path.resolve())
51
+
52
+ except Exception as e:
53
+ logging.error(f"Trying to load file with path {file_path}, error: {e}")
54
+ print(f"Trying to load file with path {file_path}, error: {e}")
55
+ return None
56
+
57
+
58
+ def convert_PDF(
59
+ pdf_obj,
60
+ language: str = "en",
61
+ max_pages=10,
62
+ ):
63
+ """
64
+ convert_PDF - convert a PDF file to text
65
+
66
+ Args:
67
+ pdf_bytes_obj (bytes): PDF file contents
68
+ language (str, optional): Language to use for OCR. Defaults to "en".
69
+
70
+ Returns:
71
+ str, the PDF file contents as text
72
+ """
73
+ # clear local text cache
74
+ rm_local_text_files()
75
+ global ocr_model
76
+ st = time.perf_counter()
77
+ if isinstance(pdf_obj, list):
78
+ pdf_obj = pdf_obj[0]
79
+ file_path = Path(pdf_obj.name)
80
+ if not file_path.suffix == ".pdf":
81
+ logging.error(f"File {file_path} is not a PDF file")
82
+
83
+ html_error = f"""
84
+ <div style="color: red; font-size: 20px; font-weight: bold;">
85
+ File {file_path} is not a PDF file. Please upload a PDF file.
86
+ </div>
87
+ """
88
+ return "File is not a PDF file", html_error, None
89
+
90
+ conversion_stats = convert_PDF_to_Text(
91
+ file_path,
92
+ ocr_model=ocr_model,
93
+ max_pages=max_pages,
94
+ )
95
+ converted_txt = conversion_stats["converted_text"]
96
+ num_pages = conversion_stats["num_pages"]
97
+ was_truncated = conversion_stats["truncated"]
98
+ # if alt_lang: # TODO: fix this
99
+
100
+ rt = round((time.perf_counter() - st) / 60, 2)
101
+ print(f"Runtime: {rt} minutes")
102
+ html = ""
103
+ if was_truncated:
104
+ html += f"<p>WARNING - PDF was truncated to {max_pages} pages</p>"
105
+ html += f"<p>Runtime: {rt} minutes on CPU for {num_pages} pages</p>"
106
+
107
+ _output_name = f"RESULT_{file_path.stem}_OCR.txt"
108
+ with open(_output_name, "w", encoding="utf-8", errors="ignore") as f:
109
+ f.write(converted_txt)
110
+
111
+ return converted_txt, html, _output_name
112
+
113
+
114
+ if __name__ == "__main__":
115
+ logging.info("Starting app")
116
+
117
+ use_GPU = torch.cuda.is_available()
118
+ logging.info(f"Using GPU status: {use_GPU}")
119
+ logging.info("Loading OCR model")
120
+ with contextlib.redirect_stdout(None):
121
+ ocr_model = ocr_predictor(
122
+ "db_resnet50",
123
+ "crnn_mobilenet_v3_large",
124
+ pretrained=True,
125
+ assume_straight_pages=True,
126
+ )
127
+
128
+ # define pdf bytes as None
129
+ pdf_obj = _here / "example_file.pdf"
130
+ pdf_obj = str(pdf_obj.resolve())
131
+ _temp_dir = _here / "temp"
132
+ _temp_dir.mkdir(exist_ok=True)
133
+
134
+ logging.info("starting demo")
135
+ demo = gr.Blocks()
136
+
137
+ with demo:
138
+
139
+ gr.Markdown("# Scanned PDF to Text using DOCTR : Demo")
140
+ gr.Markdown(
141
+ "A basic demo of pdf-to-text conversion using OCR from the [doctr](https://mindee.github.io/doctr/index.html) package"
142
+ )
143
+ gr.Markdown("---")
144
+
145
+ with gr.Column():
146
+
147
+ gr.Markdown("## Load Inputs")
148
+ gr.Markdown("Upload your own file & replace the default. Files should be < 10MB to avoid upload issues.")
149
+ gr.Markdown(
150
+ "_If no file is uploaded, a sample PDF will be used. PDFs are truncated to 10 pages._"
151
+ )
152
+
153
+ uploaded_file = gr.File(
154
+ label="Upload a PDF file",
155
+ file_count="single",
156
+ type="file",
157
+ value=_here / "scanned_example_1.pdf",
158
+ )
159
+
160
+ gr.Markdown("---")
161
+
162
+ with gr.Column():
163
+ gr.Markdown("## Convert PDF contents to text")
164
+ convert_button = gr.Button("Click to convert PDF!", variant="primary")
165
+ out_placeholder = gr.HTML("<p><em>Output will appear below:</em></p>")
166
+ gr.Markdown("### Output")
167
+ OCR_text = gr.Textbox(
168
+ label="OCR Result", placeholder="The OCR text will appear here"
169
+ )
170
+ text_file = gr.File(
171
+ label="Download Text File",
172
+ file_count="single",
173
+ type="file",
174
+ interactive=False,
175
+ )
176
+
177
+ convert_button.click(
178
+ fn=convert_PDF,
179
+ inputs=[uploaded_file],
180
+ outputs=[OCR_text, out_placeholder, text_file],
181
+ )
182
+ demo.launch(enable_queue=True)