Extract_ePUAP - narzędzie zgodne do szybkiej ekstrakcji z pobranych (całych) dokumentów załączników. Nie wpływa na treść. Przydatny zwłaszcza przy wielu załącznikach. KISS. ====== Użycie ====== $ extract_epuap --help usage: extract_epuap [-h] file [file ...] Extract files from ePUAP docs positional arguments: file optional arguments: -h, --help show this help message and exit $ extract_epuap koperta* koperta_2.xml --> KW_398768_DKSiW-WSWiA_plik2.DOC as KW_398768_DKSiW-WSWiA_plik2_1.DOC (0/2) koperta_2.xml --> KW_398768_DKSiW-WSWiA_plik2.DOC.XAdES as KW_398768_DKSiW-WSWiA_plik2.DOC_1.XAdES (1/2) koperta.xml --> KW_398768_DKSiW-WSWiA_plik2.DOC as KW_398768_DKSiW-WSWiA_plik2_2.DOC (0/2) koperta.xml --> KW_398768_DKSiW-WSWiA_plik2.DOC.XAdES as KW_398768_DKSiW-WSWiA_plik2.DOC_2.XAdES (1/2) ====== Kod ====== #!/usr/bin/python import os import sys import argparse from xml.etree import ElementTree from base64 import b64decode from urllib2 import unquote ATTACH_LIST_PATH = './/{http://crd.gov.pl/xml/schematy/struktura/2009/11/16/}Zalacznik' DATA_PATH = '{http://crd.gov.pl/xml/schematy/struktura/2009/11/16/}DaneZalacznika' def unique_file(filename): counter = 1 filename_parts = os.path.splitext(filename) # returns ('/path/file', '.ext') while 1: try: fd = os.open(filename, os.O_CREAT | os.O_EXCL | os.O_RDWR) return os.fdopen(fd,'w'), filename except OSError: pass filename = filename_parts[0] + '_' + str(counter) + filename_parts[1] counter += 1 parser = argparse.ArgumentParser(description='Extract files from ePUAP docs') parser.add_argument('file', nargs='+', type=argparse.FileType('r'), default=sys.stdin) args = parser.parse_args() for fd in args.file: document = ElementTree.parse(fd) root = document.getroot() attachment_list = root.findall(ATTACH_LIST_PATH) for i, att in enumerate(attachment_list): data = att.find(DATA_PATH).text if att.attrib['kodowanie'] == 'base64': data = b64decode(data) else: data = unquote(urllib2) filename = att.attrib.get('nazwaPliku') or 'unknown.bin' fp, filename_new = unique_file(filename) fp.write(data) fp.close() print "%s --> %s as %s (%s/%s)" % (fd.name, filename, filename_new, i, len(attachment_list)) ~~DISCUSSION~~