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