1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
#!/usr/bin/env python
'''
Copyright (C) 2005 Aaron Spike, aaron@ekips.org
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
'''
# standard library
import base64
import os
# local library
import inkex
class MyEffect(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
self.OptionParser.add_option("--desc")
self.OptionParser.add_option("-s", "--selectedonly",
action="store", type="inkbool",
dest="selectedonly", default=True,
help="extract only selected images")
self.OptionParser.add_option("--filepath",
action="store", type="string",
dest="filepath", default=None,
help="")
def effect(self):
# if slectedonly is enabled and there is a selection only extractselected
# images. otherwise extract all images
if (self.options.selectedonly):
self.extractSelected(self.document, self.selected)
else:
self.extractAll(self.document)
def extractSelected(self, document, selected):
self.document=document
self.selected=selected
if (self.options.ids):
for id, node in selected.iteritems():
if node.tag == inkex.addNS('image','svg'):
self.extractImage(node)
def extractAll(self, document):
self.document=document #not that nice... oh well
path = '//svg:image'
for node in self.document.getroot().xpath(path, namespaces=inkex.NSS):
self.extractImage(node)
def extractImage(self, node):
mimesubext={
'png' : '.png',
'svg+xml' : '.svg',
'bmp' : '.bmp',
'jpeg' : '.jpg',
'jpg' : '.jpg', #bogus mime
'icon' : '.ico',
'gif' : '.gif'
}
# exbed the first embedded image
path = self.options.filepath
if (path != ''):
if node.tag == inkex.addNS('image','svg'):
xlink = node.get(inkex.addNS('href','xlink'))
if (xlink[:4]=='data'):
comma = xlink.find(',')
if comma>0:
#get extension
fileext=''
semicolon = xlink.find(';')
if semicolon>0:
for sub in mimesubext.keys():
if sub in xlink[5:semicolon].lower():
fileext=mimesubext[sub]
pathwext=path+fileext
if os.path.isfile(pathwext):
pathwext=path + "_" + node.get("id") +fileext
if (not os.path.isabs(pathwext)):
if os.name == 'nt':
pathwext = os.path.join(os.environ['USERPROFILE'],pathwext)
else:
pathwext = os.path.join(os.path.expanduser("~"),pathwext)
inkex.errormsg(_('Image extracted to: %s') % pathwext)
break
#save
data = base64.decodestring(xlink[comma:])
open(pathwext,'wb').write(data)
node.set(inkex.addNS('href','xlink'),os.path.realpath(pathwext)) #absolute for making in-mem cycles work
else:
inkex.errormsg(_('Unable to find image data.'))
if __name__ == '__main__':
e = MyEffect()
e.affect()
# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
|