nnyverter.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import os
  2. import random
  3. import re
  4. import csv
  5. import glob
  6. from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
  7. from pdfminer.converter import TextConverter
  8. from pdfminer.layout import LAParams
  9. from pdfminer.pdfpage import PDFPage
  10. from io import StringIO
  11. # Random quotes for the day
  12. lines = [
  13. "Wenn der Hahn kräht auf dem Mist, wird das Wetter besser oder es bleibt, wie es ist.",
  14. "Ich glaub, mein Schwein pfeift!",
  15. "Deine Mutter hat angerufen: Sie sagt, du kanns nix!",
  16. "Schade, dass am Ende des Geldes noch so viel Monat übrig ist!",
  17. "Der frühe Vogel kann mich mal.",
  18. "Wer andern eine Bratwurst brät, der hat ein Bratwurstbratgerät.",
  19. "So! sprach der Floh und setzte sich aufs Klo!",
  20. "Rettet die Bäume! Esst mehr Biber!",
  21. "Am Wochenende bin ich ein Mofa. Halb Mensch, halb Sofa.",
  22. "Früher war ich unentschlossen, jetzt bin ich mir da nicht mehr so sicher...",
  23. "Schon komisch – auf den ältesten Fotos sieht man am jüngsten aus.",
  24. "Ich habe keine Lösung, aber ich bewundere das Problem!",
  25. "Auch ein Traumjob berechtigt nicht zum Schlaf während der Arbeitszeit.",
  26. "Ich bin nicht dumm, die anderen verstehen nur meine Logik nicht.",
  27. "Das einzige, was mich hier noch hält, ist die Erdanziehung!",
  28. "Arbeit hat noch niemanden umgebracht, aber ich will kein Risiko eingehen.",
  29. "Die Eselsbrücke ist die ideale Verbindung zwischen zwei Gedächtnislücken.",
  30. "Tipps für einen flachen Bauch: Nur flache Sachen essen! Zum Beispiel Schokoladentafeln und Pizza.",
  31. "Ich bin froh, dass ich mein Essen nicht selbst jagen muss. Ich wüsste auch gar nicht, wo Pizzen überhaupt leben.",
  32. "Ich faulenze nicht - ich arbeite so schnell, dass ich immer fertig bin.",
  33. "Als Nacktschläfer hat man es nicht leicht im Büro.",
  34. "Heute Nacht von der Arbeit geträumt. Werde dafür fünf Überstunden abrechnen.",
  35. "Kapiervorgang abgebrochen.",
  36. "Mein Job ist so geheim, dass nicht mal ich weiß, was ich hier mache",
  37. "Kuchen im Büro ist wie Raubtierfütterung im Zoo"
  38. ]
  39. # Regular expression to match the required data
  40. regex = r"^Tour Nr:\n\n(\d*)\n\nAbfahrt:.*?(?!(StellPl.|StellPl))\nFahrzeugTyp:\s(.*?)\nR-Tour.*?\nMaut.*?\nEmission.*?^(\d*(,\d*)?|0)\s(?:km|KM)$"
  41. # Function to convert PDF to text
  42. def convert_pdf_to_txt(path):
  43. rsrcmgr = PDFResourceManager()
  44. retstr = StringIO()
  45. laparams = LAParams()
  46. device = TextConverter(rsrcmgr, retstr, laparams=laparams)
  47. with open(path, 'rb') as fp:
  48. interpreter = PDFPageInterpreter(rsrcmgr, device)
  49. for page in PDFPage.get_pages(fp, check_extractable=True):
  50. interpreter.process_page(page)
  51. text = retstr.getvalue()
  52. device.close()
  53. retstr.close()
  54. return text
  55. # Function to handle each match
  56. def handle_match(match, spamwriter):
  57. tour_number = f"=\"{match.group(1)}\""
  58. km = float(match.group(4).replace(",", "."))
  59. vehicle_type = match.group(3).replace(",", ",")
  60. if vehicle_type == "Kran 21 t":
  61. return 0, 0
  62. if vehicle_type in ["LKW 15 t", "LKW 12 t"]:
  63. spamwriter.writerow([tour_number, 0, match.group(4).replace(",", ","), 0, vehicle_type])
  64. return 0, km
  65. if vehicle_type in "LKW 7,49t":
  66. spamwriter.writerow([tour_number, 0, 0, match.group(4).replace(",", ","), vehicle_type])
  67. return km, 0
  68. spamwriter.writerow([tour_number, match.group(4).replace(",", ","), 0, 0, vehicle_type])
  69. return km, 0
  70. # Function to process a single PDF file
  71. def process_pdf(file, spamwriter):
  72. daily = 0.0
  73. daily_15 = 0.0
  74. print(f"Beginne mit {file} alles guddes!")
  75. spamwriter.writerow([file])
  76. out = convert_pdf_to_txt(file)
  77. matches = re.finditer(regex, out, re.MULTILINE | re.DOTALL)
  78. for matchNum, match in enumerate(matches, start=1):
  79. #print(f"Match {matchNum} was found at {match.start()}-{match.end()}: {match.group()}")
  80. km, km_15 = handle_match(match, spamwriter)
  81. daily += km
  82. daily_15 += km_15
  83. print(f"Tour {matchNum}, {match.group(1)}, {match.group(3).replace(',', '.')}")
  84. print(daily)
  85. spamwriter.writerow(["Gesamt (Tag)", f"=\"{round(daily, 2)}\""])
  86. spamwriter.writerow(["Gesamt (12 t + 15 t) (Tag)", f"=\"{round(daily_15, 2)}\""])
  87. spamwriter.writerow([])
  88. return daily, daily_15
  89. # Main script
  90. def main():
  91. total = 0.0
  92. total_15 = 0.0
  93. os.chdir("./")
  94. print(" _ ")
  95. print(" _ __ _ __ _ ___ _____ _ __| |_ ___ _ __ ")
  96. print(" | '_ \\| '_ \\| | | \\ \\ / / _ \\ '__| __/ _ \\ '__|")
  97. print(" | | | | | | | |_| |\\ V / __/ | | || __/ | ")
  98. print(" |_| |_|_| |_|\\__, | \\_/ \\___|_| \\__\\___|_| ")
  99. print(" |___/ ")
  100. print(" Version 2024.2 ")
  101. print(" moin")
  102. print("")
  103. print("Spruch des Tages:")
  104. print(random.choice(lines))
  105. print("")
  106. with open("ergebnis.csv", 'w', newline='') as csvfile:
  107. spamwriter = csv.writer(csvfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_MINIMAL)
  108. for file in glob.glob("*.pdf"):
  109. try:
  110. daily, daily_15 = process_pdf(file, spamwriter)
  111. total += daily
  112. total_15 += daily_15
  113. except Exception as e:
  114. print(f"Error processing {file}: {e}")
  115. spamwriter.writerow(["Gesamt (Monat)", f"=\"{round(total, 2)}\""])
  116. spamwriter.writerow(["Gesamt (12 t + 15 t) (Monat)", f"=\"{round(total_15, 2)}\""])
  117. if __name__ == "__main__":
  118. main()