FlatBin

Get_PDF

import sys import os import threading import logging from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QFileDialog, QProgressBar, QListWidget, QMessageBox) from PyQt5.QtCore import pyqtSlot, QThread, pyqtSignal import win32com.client from pdfminer.high_level import extract_text import re # Konfiguration des Loggings logging.basicConfig(filename=os.path.join(os.environ['USERPROFILE'], 'Desktop', 'pdf_extractor_log.txt'), level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') class DownloadThread(QThread): progress = pyqtSignal(int) finished = pyqtSignal() def __init__(self, path, keywords): super().__init__() self.path = path self.keywords = keywords def run(self): outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) messages = inbox.Items.Restrict("[Unread] = True") total = len(messages) count = 0 for message in messages: try: attachments = message.Attachments for attachment in attachments: if str(attachment).lower().endswith('.pdf'): filename = attachment.FileName temp_save_path = os.path.join(self.path, filename) attachment.SaveAsFile(temp_save_path) text = extract_text(temp_save_path) for keyword, folder in self.keywords.items(): if re.search(keyword, text, re.IGNORECASE): save_folder = os.path.join(self.path, folder) if not os.path.exists(save_folder): os.makedirs(save_folder) final_path = os.path.join(save_folder, filename) os.rename(temp_save_path, final_path) break logging.info(f"PDF gespeichert: {temp_save_path}") except Exception as e: logging.error("Fehler beim Verarbeiten einer E-Mail: " + str(e)) count += 1 self.progress.emit(int((count / total) * 100)) self.finished.emit() class PDFExtractorApp(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PDF Extraktor aus Outlook") self.setGeometry(100, 100, 600, 300) self.initUI() def initUI(self): centralWidget = QWidget() self.setCentralWidget(centralWidget) layout = QVBoxLayout() # Pfadauswahl pathLayout = QHBoxLayout() self.pathEntry = QLineEdit() browseBtn = QPushButton("Durchsuchen") browseBtn.clicked.connect(self.browsePath) pathLayout.addWidget(QLabel("Speicherpfad:")) pathLayout.addWidget(self.pathEntry) pathLayout.addWidget(browseBtn) # Stichwort Eingabe keywordLayout = QHBoxLayout() self.keywordEntry = QLineEdit() self.folderEntry = QLineEdit() addKeywordBtn = QPushButton("Stichwort hinzufügen") addKeywordBtn.clicked.connect(self.addKeyword) keywordLayout.addWidget(QLabel("Stichwort:")) keywordLayout.addWidget(self.keywordEntry) keywordLayout.addWidget(QLabel("Zielordner:")) keywordLayout.addWidget(self.folderEntry) keywordLayout.addWidget(addKeywordBtn) # Stichwort Liste self.keywordList = QListWidget() # Fortschrittsbalken self.progress = QProgressBar() # Startknopf startBtn = QPushButton("Start") startBtn.clicked.connect(self.startDownload) layout.addLayout(pathLayout) layout.addLayout(keywordLayout) layout.addWidget(self.keywordList) layout.addWidget(self.progress) layout.addWidget(startBtn) centralWidget.setLayout(layout) self.keywords = {} def browsePath(self): directory = QFileDialog.getExistingDirectory(self, "Verzeichnis auswählen") if directory: self.pathEntry.setText(directory) def addKeyword(self): keyword = self.keywordEntry.text() folder = self.folderEntry.text() if keyword and folder: self.keywords[keyword] = folder self.keywordList.addItem(f"{keyword} -> {folder}") self.keywordEntry.clear() self.folderEntry.clear() def startDownload(self): path = self.pathEntry.text() if path: self.thread = DownloadThread(path, self.keywords) self.thread.progress.connect(self.progress.setValue) self.thread.finished.connect(self.downloadFinished) self.thread.start() def downloadFinished(self): QMessageBox.information(self, "Vorgang abgeschlossen", "Alle PDFs wurden verarbeitet und gespeichert.") def main(): app = QApplication(sys.argv) ex = PDFExtractorApp() ex.show() sys.exit(app.exec_()) if __name__ == "__main__": main()

Neuen Paste erstellen