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~~