import datetime
import os
from datetime import datetime
import keyboard
import pygetwindow
import pyautogui
from PIL import Image
from azure.ai.formrecognizer import DocumentAnalysisClient
from azure.core.credentials import AzureKeyCredential
import pyperclip
import mss
# import yaml
#
# def read_credentials(file_path):
# with open(file_path, 'r') as file:
# credentials = yaml.safe_load(file)
# return credentials
#
# # Path to your credentials file
# credentials_file = 'credentials.yaml'
#
# # Read credentials
# credentials = read_credentials(credentials_file)
# key = credentials.get('azure_key', '')
# endpoint = credentials.get('azure_endpoint', '')
key = "xxxxxxxxxxxxxxxxxxxxxe0"
endpoint = "https://xxxxxxxxxxxxxxxxxxxxxe.cognitiveservices.azure.com/"
def screenshot(path):
window = pygetwindow.getActiveWindow()
#left, top = window.topleft
#right, bottom = window.bottomright
bbox = {
"top": window.top,
"left": window.left+10,
"width": window.width-20,
"height": window.height-10
}
current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
title = str(window.title).replace("\\", "").replace(":", "").replace(" ", "")
image_path = path + f"screen_{title}_{current_time}.png"
#pyautogui.screenshot(image_path)
#im = Image.open(image_path)
#im = im.crop((left+10, top, right-10, bottom-10))
#im.save(image_path)
with mss.mss() as sct:
# Capture the screen within the bounding box
sct_img = sct.grab(bbox)
# Save to the picture file
mss.tools.to_png(sct_img.rgb, sct_img.size, output=image_path)
return image_path
# formatting function
def format_polygon(polygon):
if not polygon:
return "N/A"
return ", ".join(["[{}, {}]".format(p.x, p.y) for p in polygon])
def find_screenshot_type(content):
'''
Looks for certain keywords to detect document type
'''
if 'AWD - History' in content:
return 'AWD - History'
return None
def generate_table(table):
'''
Convert result table to a 2D list considering column_index, column_span, row_index, and row_span for each cell.
'''
column_count = table.column_count
row_count = table.row_count
cells = table.cells
# Initialize the 2-dimensional list with None to represent empty cells initially
table1 = [[None for _ in range(column_count)] for _ in range(row_count)]
for cell in cells:
# Use the cell's row_index and column_index to position it correctly
row_idx = cell.row_index
col_idx = cell.column_index
# Fill the cell content into the table, considering column_span and row_span
# Here, we only fill the top-left cell of a spanned area with content,
# and leave the rest as None or some placeholder to indicate it's part of a span
# This can be adjusted based on how you want to handle spans
if table1[row_idx][col_idx] is None: # Check if cell is not already filled (useful for spans)
table1[row_idx][col_idx] = cell.content
# If there's a span, you might want to mark the spanned cells in some way
# For simplicity, this code does not populate all spanned cells with content
# but you could modify it to suit your needs (e.g., fill all spanned cells with the same content)
return table1
def find_processed_and_related_rows(table):
# Find rows with 'PROCESSED' in column 6 and capture the value of column 3
processed_ids = set()
for row in table:
if 'PROCESSED' in row:
processed_ids.add(row[2])
# Find all rows with the captured column 3 values or the next row has an empty string or None for column 3
related_rows = []
for i, row in enumerate(table):
# Check if the current row's column 3 matches any captured user ID
if row[2] in processed_ids:
related_rows.append(row)
# Check the next row for an empty string or None in column 3
if i + 1 < len(table) and (table[i + 1][2] == '' or table[i + 1][2] is None):
related_rows.append(table[i + 1])
return processed_ids, related_rows
def find_qpassed_and_related_rows(table):
# Find rows with 'PROCESSED' in column 6 and capture the value of column 3
qpassed_ids = set()
for row in table:
if ('QCPASSED' in row):
qpassed_ids.add(row[2])
# Find all rows with the captured column 3 values or the next row has an empty string or None for column 3
related_rows = []
for i, row in enumerate(table):
# Check if the current row's column 3 matches any captured user ID
if row[2] in qpassed_ids:
related_rows.append(row)
return qpassed_ids, related_rows
def find_qwpassed_and_related_rows(table):
# Find rows with 'PROCESSED' in column 6 and capture the value of column 3
qpassed_ids = set()
for row in table:
if ('QWPASSED' in row):
qpassed_ids.add(row[2])
# Find all rows with the captured column 3 values or the next row has an empty string or None for column 3
related_rows = []
for i, row in enumerate(table):
# Check if the current row's column 3 matches any captured user ID
if row[2] in qpassed_ids:
related_rows.append(row)
return qpassed_ids, related_rows
def find_qcreworked_and_related_rows(table):
# Find rows with 'PROCESSED' in column 6 and capture the value of column 3
qpassed_ids = set()
for row in table:
if ('QCREWORKED' in row):
qpassed_ids.add(row[2])
# Find all rows with the captured column 3 values or the next row has an empty string or None for column 3
related_rows = []
for i, row in enumerate(table):
# Check if the current row's column 3 matches any captured user ID
if row[2] in qpassed_ids:
related_rows.append(row)
return qpassed_ids, related_rows
def format_table_for_printing(table):
# Determine the maximum width of each column
col_widths = [max(len(str(cell)) for cell in column) for column in zip(*table)]
# Create a formatted string for printing
table_str = ""
for row in table:
row_str = " | ".join(str(cell).ljust(col_widths[i]) for i, cell in enumerate(row))
table_str += row_str + "\n" + "-" * (sum(col_widths) + len(col_widths) * 3 - 1) + "\n"
return table_str
def analyze_read(path):
# sample document
print(f"----\nAnalyzing {path} ...\n----")
document = open(path, "rb")
document_analysis_client = DocumentAnalysisClient(
endpoint=endpoint, credential=AzureKeyCredential(key)
)
poller = document_analysis_client.begin_analyze_document(
#"prebuilt-read", document
"prebuilt-document", document
)
result = poller.result()
doc_type = find_screenshot_type(result.content)
if doc_type == "AWD - History":
content = "Document type: awd-history\n"
try:
table = generate_table(result.tables[0])
ids, rows = find_processed_and_related_rows(table)
if ids and rows:
content += "----------------------------------------\n"
content += "PROCESSED OK\n"
content += f"ids: {ids}\n"
for r in rows:
if r[len(r) - 1]:
content += f"{r[len(r) - 1]}\n"
content += "----------------------------------------\n"
ids, rows = find_qpassed_and_related_rows(table)
if ids and rows:
content += "----------------------------------------\n"
content += "QCPASSED OK\n"
content += f"ids: {ids}\n"
for r in rows:
if r[len(r) - 1]:
content += f"{r[len(r) - 1]}\n"
content += "----------------------------------------\n"
ids, rows = find_qwpassed_and_related_rows(table)
if ids and rows:
content += "----------------------------------------\n"
content += "QWPASSED OK\n"
content += f"ids: {ids}\n"
for r in rows:
if r[len(r) - 1]:
content += f"{r[len(r) - 1]}\n"
content += "----------------------------------------\n"
ids, rows = find_qcreworked_and_related_rows(table)
if ids and rows:
content += "----------------------------------------\n"
content += "QCREWORKED OK\n"
content += f"ids: {ids}\n"
for r in rows:
if r[len(r) - 1]:
content += f"{r[len(r) - 1]}\n"
content += "----------------------------------------\n"
content += format_table_for_printing(table)
except:
print("Cannot find table in awd-history switching to regular output")
content = result.content
else:
content = result.content
# Copying the text to the clipboard
pyperclip.copy(content)
print("Document contains content: \n", content)
print("----------------------------------------")
def create_folder():
folder = "C:\\Temp\\"
# Check if the folder exists
if not os.path.exists(folder):
# If it doesn't exist, create it
os.makedirs(folder)
print(f"Folder '{folder}' was created.")
else:
print(f"Folder '{folder}' already exists.")
return folder
# Function to be called when Ctrl+Shift+S is pressed
def on_triggered():
path = create_folder()
print(path)
print("Taking screenshot...")
screenshot_path = screenshot(path)
if screenshot_path:
print(f"Screenshot saved at {screenshot_path}")
analyze_read(screenshot_path)
else:
print("Failed to take screenshot.")
# Listen for the Ctrl+Shift+X combination
keyboard.add_hotkey('ctrl+shift+x', on_triggered)
print("Press Ctrl+Shift+X to take a screenshot of the active window.")
print("Screenshot goes to C:\\Temp")
print("Captured text goes in clipboard. Use CTRL+V to paste.")
print("Press ESC to exit.")
keyboard.wait('esc') # Use 'esc' key to stop the program

No comments:
Post a Comment