Code: Alles auswählen
from keyword import kwlist
import os,sys
from docxtpl import DocxTemplate, InlineImage
import docx
from docx.shared import Cm, Inches, Pt
from openpyxl.styles import Alignment
from docx import Document
#import math
from datetime import date
from PIL import Image
#import PIL
from docx.enum.table import WD_TABLE_ALIGNMENT
import os
import getpass
#import pandas as pd
from openpyxl import Workbook, load_workbook
from pathlib import Path
import subprocess
#from pyfiglet import figlet_format
def main():
def clearConsole():
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)
user=(getpass.getuser())
path=os.getcwd()
path_doc=path+'\\main.docx'
datum=date.today()
datum_today=datum.strftime("%d.%m.%Y")
year=datum_today[8:]
month=datum_today[3:]
month=month[:2]
day=datum_today[:2]
print("SampleLog 1.0")
print("developed by X.XXXXXXX")
print("Feature: Das Programm erleichtert die Erstellung des Materialprobenberzeichnisses.")
print("_________")
anleitung=input("Hallo "+str(user)+", möchtest Du dir erstmal die Anleitung anschauen ?\n\n[y] - Zeig her... \n\nHinweis: Beliebige andere Eingabe führt dich weiter...\n\nEingabe: ")
if anleitung=='y':
clearConsole()
print("Anleitung")
print("_________")
print("<Schritt 1> Sicherstellen, dass sich ausschließlich horizontal orientierte Fotos im Programm-Ordner befinden, welche für das Materialprobenverzeichnis (MPV) verwendet werden sollen.\n\nSehr sehr (!) wichtiger Hinweis:\n\nSämtliche Bilder sollten gem. ihres Aufnahmezeitpunktes sortiert sein, wobei der Zeitstempel kongruent der Probennennung ist. Dies kann beispielsweise mit dem Programm PicMan realisiert werden. Die Bilddateien erhalten dann automatisch einen Zeitstempel, sodass Windows die Bilder in der notwendigen Reihenfolge zeitlich automatisch ordnet.\nSolltest du in der Probenahme von einer aufsteigenden Probenbenennung abgewichen sein, so musst du entweder aufwändig editieren, oder erstellst das MPV manuell.\nSolltest du das Programm in diesem ungünstigen Fall dennoch nutzen, wird die Zuordnung mit großer Wahrscheinlichkeit falsch sein !")
print("\n<Schritt 2> Achte bitte derzeit noch darauf Eingaben sauber anzugeben. Leerzeichen können aktuell noch zum Absturz führen (z.B. (falsch) 'y ' an Stelle von (richtig) 'y') ;)...\n\nHinweis: Ich werde dem Programm generell noch einem Feinschliff verpassen, sodass falsche Übergaben, welche zu Abstürzen führen würden, vermieden werden.")
weiter=input("\nBereit ? Dann weiter mit <enter>")
clearConsole()
test=0
abfrage_arbeiter='-'
firma=''
titel=''
image=''
if test==0:
doc=DocxTemplate(path_doc)
print("Fragerunde")
print("__________")
projektnummer=str(input("\nProjektnummer: "))
clearConsole()
postal=str(input("Anschrift des Untersuchungsobjektes in der Form 'Straße Nummer, PLZ Ort': "))
while len(postal)==0 or len(postal.lstrip().rstrip())==0:
print("Die Angabe einer Anschrift ist obligatorisch. Alternativ kann als Platzhalter ein Buchstabe oder eine Zahl angegeben werden. Eine 'leere' Eingabe ist nicht zulässig.")
postal=str(input("Anschrift des Untersuchungsobjektes in der Form 'Straße Nummer, PLZ Ort': "))
if len(postal)>0:
clearConsole()
class_main=input("Handelt es sich um ein Materialprobenverzeichnis für einen orientierenden Schadstoffbericht ?\n\n[n] - Nein\n\nHinweis: Gibst du nichts oder etwas anderes als 'n' an, so ist es ein MPV für einen orientierenden Schadstoffbericht..\n\nEingabe: ")
if class_main=='n':# or ' n' or 'n ':
class_main=input("\nWas soll an Stelle von 'Bericht orientierende Schadstoffuntersuchung' in der Kopfzeile auftauchen ?\n\nEingabe: ")
else:
class_main='Bericht orientierende Schadstoffuntersuchung'
print("\n<Ausgewählt: MPV für orientierenden Schadstoffbericht>")
#clearConsole()
if len(class_main)>0:
class_detail=input("\nDie Kurzbezeichnung für das Objekt (z.B. 'Amtsgericht Wesel') lautet ?\n\nHinweis: Diese Angabe taucht ebenfalls in der Kopfzeile auf\n\nEingabe: ")
class_main=class_main.lstrip().rstrip()
clearConsole()
id=input("Das Verzeichnis beginnt bei Verdachtsbauteilnummer 1 ?\n\n[y] - Ja\n\nHinweis: Falls nicht, bei welcher Zahl ?\n\nEingabe: ")
id=id.lstrip().rstrip()
id_add=0
if id=='y' or len(id)==0:
id_add=-1
else:
id_add=int(id)-1
#o=id
id=id.lstrip().rstrip()
clearConsole()
anlage=input("\nDie Anlagennummer ist Dir bereits bekannt ?\n\n[n] - nicht bekannt (in dem Fall wird der Dateiname 'MPV' tragen)\n[y] - Ja\n\nEingabe: ")
if anlage=='y' or 'y ' or ' y' or ' y ':
anlage=input("\nWelche Anlage soll es sein (Zahl reicht als Nennung aus) ?\n\nEingabe: ")
anlage=" Anlage "+anlage
anlage=anlage.rstrip()
#print(anlage)
else:
anlage=''
print("<Anlagenzahl wird im Dateinamen nicht berücksichtigt>")
clearConsole()
insert_image_folder=input("\nNochmal: Bitte sicherstellen, dass sich Zeitstempel-sortierte Bilder im Hauptverzeichnis der Programm.exe befinden.\n\nAchtung:\nDies ist ein äußerst wichtiger Schritt, da sonst die Zuordnungen aller Wahrscheinlichkeit durcheinander kommen werden.\nBilder sollten im Gelände zeitlich auffolgend mich sukzessiv zunehmender Probenbezeichnung aufgenommen wurden sein (M1..M2...M3... etc.).\nBilder, welche im Materialprobenverzeichnis nichts zu suchen haben, also etwa Fernaufnahmen, sollten nicht im Ordner der Programm-.exe auftauchen.\nSollten diese Voraussetzungen nicht gegeben sein, rate ich von der Verwendung des Programmes dringend ab !\n\n<enter> - weiter ")
n_pictures=0
if insert_image_folder=='':
PICTURES=[]
ID=[]
Area=[]
Local=[]
Substance=[]
Pics=[]
Color=[]
Com=[]
Method=[]
Name=[]
Result=[]
Width_new=[]
Height_new=[]
Datasize=[]
counter=0
for file in os.listdir():
if file.endswith('.jpg') or file.endswith('JPG'):
n_pictures+=1
size=os.stat(file)
size=size.st_size
Datasize.append(size)
print("Im Root-Ordner wurden "+str(n_pictures)+" .jpg-Bilder gefunden.\n")
counter_i=0
for file in os.listdir():
if file.endswith('.jpg') or file.endswith('JPG'):
#print(file)
PICTURES.append(file)
if n_pictures>0:
print("")
counter_i+=1
id="{{id_"+str(counter_i+id_add)+"}}"
area="{{area_"+str(counter_i+id_add)+"}}"
local="{{local_"+str(counter_i+id_add)+"}}"
substance="{{substance_"+str(counter_i+id_add)+"}}"
color="{{color_"+str(counter_i+id_add)+"}}"
com="{{com_"+str(counter_i+id_add)+"}}"
method="{{method_"+str(counter_i+id_add)+"}}"
name="{{name_"+str(counter_i+id_add)+"}}"
result="{{result_"+str(counter_i+id_add)+"}}"
pics="{{image_"+str(counter_i+id_add)+"}}"
ID.append(id)
Area.append(area)
Local.append(local)
Substance.append(substance)
Color.append(color)
Com.append(com)
Method.append(method)
Name.append(name)
Result.append(result)
Pics.append(pics)
img=Image.open(file)
width=img.width
Width_new.append(width)
height=img.height
Height_new.append(height)
resize_factor=float(width/168)
height_new=int(height/resize_factor)
print("file detected: "+str(file)+" width: "+str(width)+"px , height: "+str(height)+" px")
print("______________________________")
size_bytes=sum(Datasize)
size_mb=size_bytes/(1024*1024)
clearConsole()
print("Die kumulative Datengröße der Bilddateien (.jpg) im Ordner beträgt ca. "+str(round(size_mb,2))+" Mb ("+str(size_bytes)+" Bytes).\nDie Daten werden nun auf das Dokument eingepasst. Das kann je nach Umfang und Dimension der Daten einen Moment dauern; je größer die Bilddateien, je länger dauert das jetzt....")
print("\n")
docname="["+str(year)+str(month)+str(day)+"] "+str(projektnummer)+str(anlage)+" MPV.docx"
context={
'pnx': docname,
'class_main': class_main,
'class_detail': class_detail,
'id': "{{id}}",
'area': "{{area}}",
'image': "{{image}}",
'postal': postal,
'local':"{{local}}",
'color':"{{color}}",
'method':"{{method}}",
'name':"{{name}}",
'result':"{{result}}",
'com':"{{com}}",
'substance':"{{substance}}"
}
doc.render(context)
doc.save('render_one.docx')
k=1
if k==1:
doc = docx.Document('render_one.docx')
Table=doc.tables[0]
for row in Table.rows:
for cell in row.cells:
paragraphs = cell.paragraphs
for paragraph in paragraphs:
for run in paragraph.runs:
font = run.font
font.size= Pt(10)
font.name="Arial"
for i in range(((len(PICTURES)-1))):
#print(i)
Table.add_row().cells
#id=int(id)-1
[i+id for i in ID]
for i in range(len(PICTURES)):
if int(i)==0:
print("...*holt Klebestift und Schere, damit man die Bilder richtig einpassen kann...*")
print("Kaffeezeit ? Sollten es größere und v.a. viele Bilder sein, könnte das etwas dauern...")
print("...*schnip, schnap..*")
#ID
Table.cell(i+1,0).text=ID[i]
Table.cell(i+1,0).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,0).paragraphs[0].runs[0].font.bold = True
#Area
Table.cell(i+1,1).text=Area[i]
Table.cell(i+1,1).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,1).paragraphs[0].runs[0].font.bold = True
#Local
Table.cell(i+1,2).text=Local[i]
Table.cell(i+1,2).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,2).paragraphs[0].runs[0].font.bold = True
#substance
Table.cell(i+1,3).text=Substance[i]
Table.cell(i+1,3).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,3).paragraphs[0].runs[0].font.bold = True
#image
Table.cell(i+1,4).text=Pics[i]
Table.cell(i+1,4).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,4).paragraphs[0].runs[0].font.bold = True
#color
Table.cell(i+1,5).text=Color[i]
Table.cell(i+1,5).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,5).paragraphs[0].runs[0].font.bold = True
#com
Table.cell(i+1,6).text=Com[i]
Table.cell(i+1,6).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,6).paragraphs[0].runs[0].font.bold = True
#method
Table.cell(i+1,7).text=Method[i]
Table.cell(i+1,7).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,7).paragraphs[0].runs[0].font.bold = True
#name
Table.cell(i+1,8).text=Name[i]
Table.cell(i+1,8).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,8).paragraphs[0].runs[0].font.bold = True
#result
Table.cell(i+1,9).text=Result[i]
Table.cell(i+1,9).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER
Table.cell(i+1,9).paragraphs[0].runs[0].font.bold = True
percentage=round((i/len(PICTURES)*100),1)
print("...schneidet das Bildchen "+str(i)+" von "+str(len(PICTURES))+" passend aus und klebt es an die richtige Stelle... ["+str(percentage)+"/100 %]",end='\r')
if int(len(PICTURES))-int(i)==1:
print("...So !.. nun aber das letzte Klebchen.... :-) ! [100/100 %]")
for i in range(len(PICTURES)):
Table.cell(i+1, 4).text = ''
Table.cell(i+1, 4).paragraphs[0].runs[0].add_picture(PICTURES[i],width=Cm(5))
doc.save(docname)
path = Path(
"O:/zielordner/Users/XXXXXXX/IT/templates/stat_mpvz.xlsx")
WorkBook = load_workbook(path, read_only=False)
WorkSheet = WorkBook['Tabelle1']
check=WorkSheet.cell(row=2, column=2).value
counter=0
for i in range(2,19000,1):
if WorkSheet.cell(row=i, column=2).value==None:
WorkSheet.cell(row=i, column=2).value=1
WorkSheet.cell(row=i, column=1).value=projektnummer
break
else:
continue
WorkBook.save(path)
finish=input("\nDas sollte geklappt haben. Du solltest nun eine Datei namens \n\n-----> "+str(docname)+" <-----\n\n..........im Programmordner finden............\n\n<o> - Datei direkt öffnen\n\n<andere Eingabe> - beendet das Programm\n\nEingabe: ")
finish=finish.lstrip().rstrip()
subprocess.Popen('explorer "C:\"')
if finish=='o':
os.popen(docname)
else:
quit()
if __name__ == "__main__":
main()
Fehlermeldung:
Code: Alles auswählen
Die kumulative Datengröße der Bilddateien (.jpg) im Ordner beträgt ca. 11.86 Mb (12439473 Bytes).
Die Daten werden nun auf das Dokument eingepassXXXXXXX Das kann je nach Umfang und Dimension der Daten einen Moment dauern; je größer die Bilddateien, je länger dauert das jetzXXXXXXX...
...*holt Klebestift und Schere, damit man die Bilder richtig einpassen kann...*
Kaffeezeit ? Sollten es größere und v.a. viele Bilder sein, könnte das etwas dauern...
...*schnip, schnap..*
...So !.. nun aber das letzte Klebchen.... :-) ! [100/100 %]
Traceback (most recent call last):
File "C:\Coding\Programmierung\Materialprobenverzeichnis\mpzpy.py", line 318, in <module>
main()
File "C:\Coding\Programmierung\Materialprobenverzeichnis\mpzpy.py", line 289, in main
Table.cell(i+1, 4).paragraphs[0].runs[0].add_picture(PICTURES[i],width=Cm(5))
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\text\run.py", line 62, in add_picture
inline = self.parXXXXXXXnew_pic_inline(image_path_or_stream, width, height)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\parts\story.py", line 56, in new_pic_inline
rId, image = self.get_or_add_image(image_descriptor)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\parts\story.py", line 29, in get_or_add_image
image_part = self._package.get_or_add_image_part(image_descriptor)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\package.py", line 31, in get_or_add_image_part
return self.image_parts.get_or_add_image_part(image_descriptor)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\package.py", line 74, in get_or_add_image_part
image = Image.from_file(image_descriptor)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\image.py", line 55, in from_file
return cls._from_stream(stream, blob, filename)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\image.py", line 176, in _from_stream
image_header = _ImageHeaderFactory(stream)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\image.py", line 198, in _ImageHeaderFactory
return cls.from_stream(stream)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 47, in from_stream
markers = _JfifMarkers.from_stream(stream)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 111, in from_stream
for marker in marker_parser.iter_markers():
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 176, in iter_markers
marker = _MarkerFactory(
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 271, in _MarkerFactory
return marker_cls.from_stream(stream, marker_code, offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 413, in from_stream
tiff = cls._tiff_from_exif_segment(stream, offset, segment_length)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\jpeg.py", line 455, in _tiff_from_exif_segment
return Tiff.from_stream(substream)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 36, in from_stream
parser = _TiffParser.parse(stream)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 63, in parse
ifd_entries = _IfdEntries.from_stream(stream_rdr, ifd0_offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 176, in from_stream
entries = dict((e.tag, e.value) for e in ifd_parser.iter_entries())
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 176, in <genexpr>
entries = dict((e.tag, e.value) for e in ifd_parser.iter_entries())
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 204, in iter_entries
ifd_entry = _IfdEntryFactory(self._stream_rdr, dir_entry_offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 231, in _IfdEntryFactory
return entry_cls.from_stream(stream_rdr, offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 255, in from_stream
value = cls._parse_value(
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\tiff.py", line 294, in _parse_value
return stream_rdr.read_str(value_count-1, value_offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\helpers.py", line 70, in read_str
chars = self._unpack_item(struct, base, offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\helpers.py", line 96, in _unpack_item
bytes_ = self._read_bytes(strucXXXXXXXsize, base, offset)
File "C:\Users\XXXXXXXXXXXXXX\AppData\Local\Programs\Python\Python310\lib\site-packages\docx\image\helpers.py", line 88, in _read_bytes
raise UnexpectedEndOfFileError
docx.image.exceptions.UnexpectedEndOfFileError
PS C:\Coding\Programmierung\Materialprobenverzeichnis> ^N