Skip to content
Snippets Groups Projects
Commit 7f67736f authored by Ute Becker's avatar Ute Becker :relaxed:
Browse files

Die Werte aus dem Messprogramm TL1 werden in das cal-dokument übertragen

parent 8f420487
No related branches found
No related tags found
No related merge requests found
# -*- coding: utf-8 -*-
"""
Created on Fri Jul 1 12:12:37 2022
@author: becker07
"""
import sys
import numpy as np
import couchdb
import pandas as pd
import json
import csv
import re
from matplotlib import pyplot as plt
import pathlib
try:
from configparser import ConfigParser
except ImportError:
from ConfigParser import ConfigParser # ver. < 3.0
configtl = ConfigParser()
ini_values = ConfigParser()
# parse existing file
configtl.read('tl.ini')
ini_values.read('inputs.ini')
server=configtl.get('couch', 'couch')
db_vl=configtl.get('couch', 'db')
couch = couchdb.Server(server)
db = couch[db_vl] # existing
## Eingabe von:
# - Kalibrierscheinnummer
# - Jahr der Kalibrierung
# - laufende Nummer der Kalibrierung
path=configtl.get('path', 'path_files')
cal_cert = ini_values.get('input_cer', 'cal_cert')
year = ini_values.get('input_gen', 'year')
no = ini_values.get('input_gen', 'no')
QMS="ja" ######### ja beim Scan
kk_ik_pn= "kk" ######## kk,ik oder pn
json_file = "cal-" + year + "-fm1-kk-" + cal_cert + "_" + no
doc = db.get(json_file)
print(json_file)
#path='C:\\Users\\becker07\\python\\TL1\\'
dateiTab = path + cal_cert + "_" + no
#dateiTab='C:\\Users\\becker07\\python\\TL1\\75561'
print(dateiTab)
dateiTab=pd.read_csv(dateiTab, sep="\t", decimal = ',' )
L_ar=dateiTab["C "]
print('Leitwert j= 1, nein = 0 :: ', L_ar)
L=L_ar[0]
print('Leitwert : ',L)
gauge = float(doc["Calibration"]["CustomerObject"]["Setup"]["CDG"])
print(gauge)
fileQMS = path + "QMS" + cal_cert + "_" + no + ".txt"
dateiQMS =fileQMS
ScanQMS= path + "Scan"+ cal_cert + "_" + no+ ".txt"
ScanOffsQMS= path + "ScanOffs"+cal_cert + "_" + no+ ".txt"
print(ScanQMS)
# Die Daten aus dem File mit der entsprechenden Kalibrierscheinnummer werden eingelesen:
# datum, time, p_up und alle Temperaturen,
#datei = "N:\Abt_7\Fb75\Vakuum\Messplaetze\TL1\Kalibrierungen\\22\\TP7464.txt"
if L == 1 :
m1=dateiTab["m1"]
m2=dateiTab["m2"]
m3=dateiTab["m3"]
m4=dateiTab["m4"]
t1=dateiTab["t1"]
t2=dateiTab["t2"]
t3=dateiTab["t3"]
t4=dateiTab["t4"]
time1=dateiTab["time1"]
time2=dateiTab["time2"]
time3=dateiTab["time3"]
pmean=dateiTab["p-mean"]*100
pmin=dateiTab["p-min"]*100
pmax=dateiTab["p-max"]*100
h=dateiTab["distance"]
print("Constantes Volumen",h)
else:
print("Constanter Leitwert")
datum=dateiTab["Datum"]
time=dateiTab["Zeit"]
gas=dateiTab["Gasart"]
if gauge== 0.01 :
p_offs_01=dateiTab["p-offset"]*100
p_fill_01=dateiTab["p-fill "]*100
p_fill_srg=dateiTab["p-max"]
p_offs_srg=dateiTab["p-min"]
else :
p_offs=dateiTab["p-offset"]*100
p_fill=dateiTab["p-fill "]*100
#p_fill=np.genfromtxt(dateiTab,skip_header=1,delimiter='\t',usecols=(5))
p_ig=dateiTab["Kommentar"]
T_room=dateiTab["T-Raum"]
T_fm=dateiTab["T-FM"]
T_tl1=dateiTab["T-TL1"]
T_tl2=dateiTab["T-TL2"]
T_tl3=dateiTab["T-TL3"]
T_tl4=dateiTab["T-TL4"]
#print(T_fm,T_room,T_tl1, T_tl2,T_tl3,T_tl4)
I_TL_time=dateiTab["Time-TL"]
I_Offs_time=dateiTab["Time-offset"]
I_FM_time=dateiTab["Time-FM"]
#print(I_TL_time,I_Offs_time,I_FM_time)
Valve=dateiTab["Ventil"]
if QMS == "ja" :
I_TL_time=dateiTab["Time-TL"]
I_Offs_time=dateiTab["Time-offset"]
I_FM_time=dateiTab["Time-FM"]
#print(I_TL_time,I_Offs_time,I_FM_time)
####################### Der Scan des QMS ##############################################################################
############## die leeren Zeilen und Überschriften werden gelöscht ###################
with open(ScanQMS, "r") as fp:
tab=fp.read()
with open('ScanQMS.txt', 'w') as fp:
fp.write(tab)
with open(ScanOffsQMS, "r") as fp:
tab=fp.read()
with open('ScanOffsQMS.txt', 'w') as fp:
fp.write(tab)
del_def = []
with open('ScanQMS.txt', "r") as fp:
del_def = fp.readlines()
with open('ScanQMS.txt', "w") as fp:
for number, line in enumerate(del_def):
if number not in [0, 1,6,7,22,23,24,25,47,48]:
fp.write(line)
del_def = []
with open('ScanOffsQMS.txt', "r") as fp:
del_def = fp.readlines()
with open('ScanOffsQMS.txt', "w") as fp:
for number, line in enumerate(del_def):
if number not in [0, 1,6,7,22,23,24,25,47,48]:
fp.write(line)
########### Scan #####################
with open('ScanQMS.txt','r') as file:
tab=file.read()
lstdef=tab.rfind("Channel count")+16
lsttab=tab.rfind("Scan Data (Pressures in mbar)")+32
filetab=tab[lsttab:] ### Das File wird getrennt und die Tabelle mit den Messwerten in das filetab übergeben
filedef=tab[:lstdef] ### Das File wird getrennt und die Einstellungen und Infos in filedef übergeben
with open('QMS-Def.txt', 'w') as f:
f.write(filedef)
df_tab = pd.read_csv("QMS-Def.txt",
sep="\t",
#usecols=["Time"]
header=None,
)
def_key=np.array(df_tab[0])
l=len(def_key)
print(l)
#def_key=np.delete(def_key, l-1)
def_value=np.array(df_tab[1], dtype=str)
#def_value=np.delete(def_value, l-1)
with open('QMS-Scan.txt', 'w') as f:
f.write(filetab)
df = pd.read_csv("QMS-Scan.txt",
sep="\t",
#usecols=["Time"]
header=None,
)
df=df.replace(np.nan, 0)
l=len(df)
print(l)
mass_no=np.array(df[0:1])
mass_unit=mass_no[0]
if l == 3:
mass_value=np.array(df[1:2])
mass_value=mass_value[0]
print(mass_value())
else:
mass_value=np.array(df[l-2:l-1])
mass_value=mass_value[0]
#############################################################################################################
########### Scan Offset #####################
with open('ScanOffsQMS.txt','r') as file:
tab_offs=file.read()
lstdef_offs=tab_offs.rfind("Channel count")+16
lsttab_offs=tab_offs.rfind("Scan Data (Pressures in mbar)")+32
filetab_offs=tab_offs[lsttab_offs:] ### Das File wird getrennt und die Tabelle mit den Messwerten in das filetab übergeben
filedef_offs=tab_offs[:lstdef_offs] ### Das File wird getrennt und die Einstellungen und Infos in filedef übergeben
with open('QMS_Offs-Def.txt', 'w') as f:
f.write(filedef_offs)
df_tab_offs = pd.read_csv("QMS_Offs-Def.txt",
sep="\t",
#usecols=["Time"]
header=None,
)
def_key_offs=np.array(df_tab_offs[0])
l=len(def_key_offs)
def_value_offs=np.array(df_tab_offs[1], dtype=str)
#def_value=np.delete(def_value, l-1)
with open('QMS_Offs-Scan.txt', 'w') as f:
f.write(filetab_offs)
df_offs = pd.read_csv("QMS_Offs-Scan.txt",
sep="\t",
#usecols=["Time"]
header=None,
)
df_offs=df_offs.replace(np.nan, 0)
l=len(df_offs)
print(l)
if l == 3:
mass_value_offs=np.array(df_offs[1:2])
mass_value_off=mass_value_offs[0]
print(mass_value_offs())
else:
mass_value_offs=np.array(df_offs[l-2:l-1])
mass_value_off=mass_value_offs[0]
#############################################################################################################
###################### Plot der Scans werden abgebildet und den json-dokument hinzugefügt #####################
I_Scan=np.float64(mass_value[2:-2])
I_Scan_Offs=np.float64(mass_value_off[2:-2])
Mass_Scan=mass_no[0]
Mass_Scan=Mass_Scan[2:-2]
for i in range(len(Mass_Scan)):
Mass_Scan[i] = re.sub(r"Mass ", "", Mass_Scan[i]).strip()
Mass_Scan=np.float64(Mass_Scan)
fig=plt.figure()
ax=fig.add_axes([0,0,4,2])
ax.set_xlabel('Masse')
ax.set_ylabel('QMS-Signal')
ax.set_yscale('log')
#plt.plot(1010,4.65e-10, 'bo')
plt.plot(Mass_Scan,I_Scan, label=r'Floww')
plt.plot(Mass_Scan,I_Scan_Offs,label=r'Offset' )
plt.legend()
plt.grid()
fig.savefig("Scan.pdf", bbox_inches='tight')
#############################################################################################################
from collections import OrderedDict
def getMassAverage(filename, tbegin = None, tend = None, trange = None):
def error_exit(x):
print('ERROR: ', str(x), file=sys.stderr)
sys.exit(1)
if not trange and (not tbegin or not tend):
error_exit('Missing time range')
try:
d = {}
with open(filename, 'r') as f:
line = f.readline()
dataValid = False
while line:
if dataValid:
# Ende der Daten
if line.startswith('"[Annotations/User Records'):
dataValid = False
else:
l = line.strip()
a = l.split('\t')# An Tabulatoren trennen
# a[0] = "Time", a[1] = "Scan", a[2] = "Mass 4", a[3] = "Sum Scanned Masses"
if a[0]:
key = a[0].strip('"')
# Timestamp als key für Dictionary
d[key] = a[2]
else:
# Beginn der Daten
if line.startswith('"Time"'):
dataValid = True
line = f.readline()
except:
error_exit("Can't read file: " + filename)
finally:
f.close()
# Sortieren bei neueren Python-Versionen unnötig?
data = OrderedDict(sorted(d.items()))
def doAverage(beg, end):
sum = 0.0
cnt = 0
for key in data:
if key >= beg and key < end:
#print(key, '-->', data[key])
cnt += 1
sum += float(data[key])
return sum / cnt
tb = []
te = []
res = []
if trange:
if not isinstance(trange,list):
trange = [trange]# Einzelwert zu Array machen
for x in trange:
a = x.split(' -')
tb.append(a[0].strip())
te.append(a[1].strip())
else:
if not isinstance(tbegin,list):
tb = [tbegin]# Einzelwert zu Array machen
if not isinstance(tend,list):
te = [tend]# Einzelwert zu Array machen
i = 0
while i < len(tb):
s = doAverage(tb[i], te[i])
res.append(s)
i += 1
if len(res) == 1:
return res[0]# Bei nur einem Wert: kein Array
else:
return res
trangeArrayTL=list(I_TL_time)
trangeArrayFM=list(I_FM_time)
trangeArrayOff=list(I_Offs_time)
xtrangeArray = [
'28.07.2022 09:19:19 -28.07.2022 09:21:18 '
]
#trangeArray = I_TL_time
x1 = getMassAverage(filename=dateiQMS,trange=trangeArrayTL )
i = 0
while i < len(x1):
print(i, 'Mass Avarage: ', x1[i])
i += 1
print(x1)
x2 = getMassAverage(filename=dateiQMS,trange=trangeArrayFM )
i = 0
while i < len(x2):
print(i, 'Mass Avarage: ', x2[i])
i += 1
print(x2)
x3 = getMassAverage(filename=dateiQMS,trange=trangeArrayOff)
i = 0
while i < len(x3):
print(i, 'Mass Avarage: ', x3[i])
i += 1
print(x3)
I_TL=np.array(x1)
I_FM=np.array(x2)
I_Offs=np.array(x3)
########################################################################################################################################
# Temperatur
lis_T_fm = T_fm.tolist()
lis_T_room = T_room.tolist()
lis_T_tl1 = T_tl1.tolist()
lis_T_tl2 = T_tl2.tolist()
lis_T_tl3 = T_tl3.tolist()
lis_T_tl4 = T_tl4.tolist()
# Druck
if gauge == 0.01 :
lis_p_offs_01 = p_offs_01.tolist()
lis_p_fill_01 = p_fill_01.tolist()
lis_p_offs_srg = p_offs_srg.tolist()
lis_p_fill_srg = p_fill_srg.tolist()
else:
lis_p_offs = p_offs.tolist()
lis_p_fill = p_fill.tolist()
lis_p_ig = p_ig.tolist()
# I-QMS
lis_I_TL_time = I_TL_time.tolist()
lis_I_Offs_time = I_Offs_time.tolist()
lis_I_FM_time = I_FM_time.tolist()
# I-QMS
lis_I_TL = I_TL.tolist()
lis_I_Offs = I_Offs.tolist()
lis_I_FM = I_FM.tolist()
# Datum
# Datum
lis_datum = datum.tolist()
lis_time = time.tolist()
# Ventil
lis_valve = Valve.tolist()
datum_meas = lis_datum[0:1]
if L == 1 :
#Leitwert
lis_c = L_ar.tolist()
# Steigung SZ
lis_m1 = m1.tolist()
lis_m2 = m2.tolist()
lis_m3 = m3.tolist()
lis_m4 = m4.tolist()
# Zeitpunkte
lis_t1 = t1.tolist()
lis_t2 = t2.tolist()
lis_t3 = t3.tolist()
lis_t4 = t4.tolist()
# Zeit pro SZ
lis_time1 = time1.tolist()
lis_time2 = time2.tolist()
lis_time3 = time3.tolist()
# Druck der SZ
lis_pmean = pmean.tolist()
lis_pmin = pmin.tolist()
lis_pmax= pmax.tolist()
# Druck der SZ
lis_h = h.tolist()
doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM","Comment":"Temperatur T ","Value": lis_T_fm},
{"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room},
{"Unit": "C","Type": "T-TL1","Comment":"Temperatur T","Value": lis_T_tl1},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl2},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl3},
{"Unit": "C","Type": "T-TL3","Comment":"Temperatur T","Value": lis_T_tl4}],
"Pressure": [{"Unit": "Pa","Type": "Offset pressure","Value":lis_p_offs},
{"Unit": "Pa","Type": "pressure mean","Value":lis_p_fill},
{"Unit": "bar","Type": "TL1 pressure ","Value":lis_p_ig}],
"Date": [{"Unit": "year-month-day","Type": "Datum","Value":lis_datum},
{"Unit": "hh:mm:ss","Type": "Messzeit","Value":lis_time}],
"Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}],
"Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL},
{"Unit": "mbar","Type": "I-FM","Value": lis_I_FM},
{"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}],
"CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}]
}
doc["Calibration"]["Measurement"]["Date"]=[{"Type": "measurement","Value": datum_meas}]
doc["Calibration"]["Measurement"]["Values"]["Conductance"]={"t": [{"Unit": "s","Type": "t1","Comment":"Zeitpunkt t1 des 1.SZ","Value": lis_t1},
{"Unit": "s","Type": "t2","Comment":"Zeitpunkt t2 des 2.SZ","Value": lis_t2},
{"Unit": "s","Type": "t3","Comment":"Zeitpunkt t3 des 3.SZ","Value": lis_t3},
{"Unit": "s","Type": "t4","Comment":"Zeitpunkt t4 des 4.SZ","Value": lis_t4}],
"time": [{"Unit": "s","Type": "time1","Comment":"Zeit t2-t1 von SZ","Value": lis_time1},
{"Unit": "s","Type": "time2","Comment":"Zeit t3-t2 von SZ","Value": lis_time2},
{"Unit": "s","Type": "time3","Comment":"Zeit t4-t3 von SZ","Value": lis_time3}],
"m": [{"Unit": "Pa/s","Type": "m1","Comment":"Steigung m1 des 1.SZ","Value": lis_m1},
{"Unit": "Pa/s","Type": "m2","Comment":"Steigung m1 des 2.SZ","Value": lis_m2},
{"Unit": "Pa/s","Type": "m3","Comment":"Steigung m1 des 3.SZ","Value": lis_m3},
{"Unit": "Pa/s","Type": "m3","Comment":"Steigung m1 des 4.SZ","Value": lis_m3}],
"pressure": [{"Unit": "Pa","Type": "pmean","Comment":"Mittelwert von p","Value": lis_pmean},
{"Unit": "Pa","Type": "pmin","Comment":"p_min des SZ","Value": lis_pmin},
{"Unit": "Pa","Type": "pmax","Comment":"p_max des SZ","Value": lis_pmax}],
"l": [{"Unit": "mm","Type": "l","Comment":"Hub des Verdrängers","Value": lis_h}],
"C": [{"Unit": "m^3/s","Type": "Constanter Leitwert ","Value": lis_c}]
}
print("Constantes Volumen")
else:
lis_c = L_ar.tolist()
if gauge == 0.01 :
doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM ","Comment":"Temperatur T ","Value": lis_T_fm},
{"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room},
{"Unit": "C","Type": "T-TL1","Comment":"Temperatur T","Value": lis_T_tl1},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl2},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl3},
{"Unit": "C","Type": "T-TL3","Comment":"Temperatur T","Value": lis_T_tl4}],
"Pressure": [{"Unit": "DCR","Type": "Offset pressure SRG","Value":lis_p_offs_srg},
{"Unit": "DCR","Type": "Fill pressure SRG ","Value":lis_p_fill_srg},
{"Unit": "Pa","Type": "Offset pressure 01Torr","Value":lis_p_offs_01},
{"Unit": "Pa","Type": "Fill pressure 01Torr","Value":lis_p_fill_01},
{"Unit": "mbar","Type": "TL1 pressure ","Value":lis_p_ig}],
"Date": [{"Unit": "year-month-day","Type": "Datum","Value":lis_datum},
{"Unit": "hh:mm:ss","Type": "Messzeit","Value":lis_time}],
"Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}],
"Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL},
{"Unit": "mbar","Type": "I-FM","Value": lis_I_FM},
{"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}],
"CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}]
}
print("SRG")
else:
doc["Calibration"]["Measurement"]["Values"]={"Temperature": [{"Unit": "C","Type": "T-FM","Comment":"Temperatur T ","Value": lis_T_fm},
{"Unit": "C","Type": "T-Room","Comment":"Temperatur T","Value": lis_T_room},
{"Unit": "C","Type": "T-TL1","Comment":"Temperatur T","Value": lis_T_tl1},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl2},
{"Unit": "C","Type": "T-TL2","Comment":"Temperatur T","Value":lis_T_tl3},
{"Unit": "C","Type": "T-TL3","Comment":"Temperatur T","Value": lis_T_tl4}],
"Pressure": [{"Unit": "Pa","Type": "Offset pressure","Value":lis_p_offs},
{"Unit": "Pa","Type": " pressure fill","Value":lis_p_fill},
{"Unit": "mbar","Type": "TL1 pressure","Value":lis_p_ig}],
"Date": [{"Unit": "year-month-day","Type": "Datum","Value":lis_datum},
{"Unit": "hh:mm:ss","Type": "Messzeit","Value":lis_time}],
"Valve": [{"Unit": "1","Type": "Connection", "Comment":"Connection of the leak" ,"Value":lis_valve}],
"Current": [{"Unit": "mbar","Type": "I-TL","Value": lis_I_TL},
{"Unit": "mbar","Type": "I-FM","Value": lis_I_FM},
{"Unit": "mbar","Type": "I-Offs","Value": lis_I_Offs}],
"CurrentTime": [{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-TL","Value": lis_I_TL_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-FM","Value": lis_I_FM_time},
{"Unit": "dd.mm.yy hh:mm:ss -dd.mm.yy hh:mm:ss","Type": "I-Offs","Value": lis_I_Offs_time}]
}
doc["Calibration"]["Measurement"]["Values"]["Conductance"]={ "C": [{"Unit": "m^3/s","Type": "Constanter Leitwert","Value": lis_c}]}
print("Constanter Leitwert")
doc["Calibration"]["Measurement"]["Date"]=[{"Type": "measurement","Value": datum_meas}]
lis_mass_no = mass_no.tolist()[0]
lis_mass_value = mass_value.tolist()
lis_mass_value_offs = mass_value_offs.tolist()[0]
key_value=dict(zip(def_key, def_value))
key_value_offs=dict(zip(def_key_offs, def_value_offs))
doc["Calibration"]["Measurement"]["AuxValues"]={"ScanQMS": [{"Unit": "Mass","Type": "QMS","Comment":"Masse ","Value":lis_mass_no},
{"Unit": "mbar","Type": "Current","Comment":"Wert / Masse","Value": lis_mass_value},
{"Unit": "mbar","Type": "Current Offset","Comment":"Wert / Masse","Value": lis_mass_value_offs}],
"DefQMS": [{"Type": "Scan QMS","Value":key_value},
{"Type": "Scan Offset QMS","Value": key_value_offs}]}
#doc["Calibration"]["Measurement"]["AuxValues"]={"ScanQMS": [{"Unit": "Mass","Type": "QMS ","Comment":"Masse ","Value":lis_mass_no},
# {"Unit": "mbar","Type": "Current","Comment":"Wert / Masse","Value": lis_mass_value},
## {"Unit": "mbar","Type": "Current Offset","Comment":"Wert / Masse","Value": lis_mass_value_offs}],
# "DefQMS": [{"Type": "Scan QMS ","Value":key_value},
# {"Type": "Scan Offset QMS","Value": key_value_offs}]}
#db.save(doc)
content=pathlib.Path('Scan.pdf').read_bytes()
db.put_attachment(doc, content, "Scan.pdf" , content_type="'application/pdf")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment