Inkscape
Inkscape est un logiciel de dessin vectoriel.
Généralité
Site officiel :
Page de téléchargement :
Extension
Il est possible de créer ses propres extension, notamment avec Python et ImageMagic.
- http://www.imagemagick.org/Usage/formats/#png
- http://im.snibgo.com/index.htm
- http://www.fmwconcepts.com/imagemagick/
Icon Export
Cette extension crée un fichier icone dont l'extension est .ico
et dont les caractéristiques sont les tailles suivantes : 256x256, 128x128, 64x64, 48x48, 32x32, 24x24 et 16x16
Site :
Pour l'installation de l'extension :
- télécharger l'archive icon-export-main_eGEB7zn.zip depuis le site ;
- depuis Inkscape, menu Extensions > Gérer les extensions... :
- onglet "Install Packages",
- bouton de sélection de paquet,
- sélectionner l'archive précédemment téléchargée,
- bouton "Ouvrir",
- redémarrer Inkscape.
Une fois l'installation terminée, les fichiers correspondants à l'extension sont dans le dossier suivants :
- C:\Users\compteutilisateur\AppData\Roaming\inkscape\extensions\inklinea.icon_export\
Après redémarrage d'Inkscape, la création d'icone se fait par :
- Extensions > Exporter > Icon Export...
- une fenêtre d'options est proposée.
Exemple de génération PDF et quadricouleur CMJN
Exporter en PDF et quadricouleur CMJN (CMYK) :
L'utilisation de cette extension de fait par l'option d'enregistrement : menu Fichier > Enregistrer sous... et type de fichier PDF CMYK (*.pdf)
Descriptif du fichier descriptif
Fichier : export-pdf-cmyk.inx
<?xml version="1.0" encoding="UTF-8"?> <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">> <_name>Export PDF CMYK</_name> <id>jonata.export-pdf-cmyk</id> <dependency type="executable" location="extensions">export-pdf-cmyk.py</dependency> <dependency type="executable" >inkscape</dependency> <param name="specialeffects" type="boolean" _gui-text="Rasterize filter effects">true</param> <param name="specialeffects_exclusively" type="boolean" _gui-text="Hide all except selected">true</param> <param name="resolution" type="int" min="1" max="3600" _gui-text="Resolution for rasterization (dpi)">300</param> <param name="set_overprint_black" type="boolean" _gui-text="Preserve black">true</param> <param name="icc_profile" type="boolean" _gui-text="ICC Profile">true</param> <output> <extension>.pdf</extension> <mimetype>application/x-pdf</mimetype> <_filetypename>PDF CMYK (*.pdf)</_filetypename> <_filetypetooltip>PDF CMYK (*.pdf)</_filetypetooltip> <dataloss>true</dataloss> </output> <script> <command reldir="extensions" interpreter="python">export-pdf-cmyk.py</command> </script> </inkscape-extension>
Descriptif du programme
Fichier : export-pdf-cmyk.py
# -*- coding: utf-8 -*- #!/usr/bin/env python # Copyright (C) 2010, 2011 Jonatã Bolzan <jonata@jonata.org> # Copyright (C) 2011 Anton Katsarov <anton@katsarov.org> # # This file is part of Export-PDF-CMYK. # # Export-PDF-CMYK is free software: you # can redistribute it and/or modify it under the terms of the GNU # General Public License (GNU GPL) as published by the Free Software # Foundation, either version 3 of the License, or (at your option) # any later version. The code is distributed WITHOUT ANY WARRANTY # without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. # # As additional permission under GNU GPL version 3 section 7, you # may distribute non-source (e.g., minimized or compacted) forms of # that code without the copy of the GNU GPL normally required by # section 4, provided you include this license notice and a URL # through which recipients can access the Corresponding Source. # # END OF LICENSE HEADER # These two lines are only needed if you don't put the script directly into # the installation directory import sys reload(sys) sys.setdefaultencoding("utf-8") sys.path.append('/usr/share/inkscape/extensions') import inkex, simplestyle, tempfile, os, re, subprocess from lxml import etree class ExportTIFF(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option("-c", "--specialeffects", action="store", type="inkbool", dest="specialeffects", default=True, help="Rasterize filter effects") self.OptionParser.add_option("-e", "--specialeffects_exclusively", action="store", type="inkbool", dest="specialeffects_exclusively", default=True, help="Hide all except selected") self.OptionParser.add_option("-r", "--resolution", action="store", type="int", dest="resolution", default=300, help="Resolution for rasterization (dpi)") self.OptionParser.add_option("-k", "--set_overprint_black", action="store", type="inkbool", dest="set_overprint_black", default=True, help="Preserve black") self.OptionParser.add_option("-i", "--icc_profile", action="store", type="inkbool", dest="icc_profile", default=True, help="ICC Profile") def output(self): out = open(tempfile.gettempdir() + os.sep + 'final.pdf','rb') if os.name == 'nt': try: import msvcrt msvcrt.setmode(1, os.O_BINARY) except: pass sys.stdout.write(out.read()) out.close() def effect(self): svg = open(self.svg_file, 'r').read() def rename_svg_colors(): #colortypes = ['fill', 'stop-color', 'flood-color', 'lighting-color', 'stroke'] #for i in range(len(colortypes)): origin = svg for i in range(len(simplestyle.svgcolors.keys())): origin = str(origin).replace(':' + simplestyle.svgcolors.keys()[i] + ';', ':' + simplestyle.svgcolors[simplestyle.svgcolors.keys()[i]] + ';') return origin def what_export(): doc = etree.parse(tempfile.gettempdir() + os.sep + 'final.svg') export_area = [] list_of_effects = ["opacity:0", "filter", "Gradient", "image"] for i in range(len(list_of_effects)): for node in doc.getroot(): if not "<defs" in etree.tostring(node): for child in node: #open("/tmp/teste.txt", "w+").write(etree.tostring(child)) if list_of_effects[i] in etree.tostring(child): #if 'style' in child.attrib and list_of_effects[i] in child.attrib['style']: export_area.append(child.attrib['id']) return list(set(export_area)) def calculateCMYK(red, green, blue): C = float() M = float() Y = float() K = float() if 1.00 - red < 1.00 - green: K = 1.00 - red else: K = 1.00 - green if 1.00 - blue < K: K = 1.00 - blue if K != 1.00: C = ( 1.00 - red - K ) / ( 1.00 - K ) M = ( 1.00 - green - K ) / ( 1.00 - K ) Y = ( 1.00 - blue - K ) / ( 1.00 - K ) return [C, M, Y, K] def convert_elements_to_images(): areas_to_export = what_export() file_svg_C = rename_svg_colors() file_svg_M = rename_svg_colors() file_svg_Y = rename_svg_colors() file_svg_K = rename_svg_colors() def removeK(origem): def zerar_opacidade(valor): return str(valor.group()).split('opacity:')[0] + "opacity:0;" return re.sub("#000000;fill-opacity:[0-9.]+;", zerar_opacidade, re.sub("#000000;stop-opacity:[0-9.]+;", zerar_opacidade, re.sub("#000000;stroke-opacity:[0-9.]+;", zerar_opacidade, re.sub("#000000;flood-opacity:[0-9.]+;", zerar_opacidade, re.sub("#000000;lighting-opacity:[0-9.]+;", zerar_opacidade, origem))))) def representC(value): # returns CMS color if available if ( re.search("icc-color", value.group()) ): return simplestyle.formatColor3f(float(1.00 - float(re.split('[,\)\s]+',value.group())[2])), float(1.00), float(1.00)) red = float(simplestyle.parseColor(str(value.group()))[0]/255.00) green = float(simplestyle.parseColor(str(value.group()))[1]/255.00) blue = float(simplestyle.parseColor(str(value.group()))[2]/255.00) return simplestyle.formatColor3f(float(1.00 - calculateCMYK(red, green, blue)[0]), float(1.00), float(1.00)) def representM(value): # returns CMS color if available if ( re.search("icc-color", value.group()) ): return simplestyle.formatColor3f(float(1.00), float(1.00 - float(re.split('[,\)\s]+',value.group())[3])), float(1.00)) red = float(simplestyle.parseColor(str(value.group()))[0]/255.00) green = float(simplestyle.parseColor(str(value.group()))[1]/255.00) blue = float(simplestyle.parseColor(str(value.group()))[2]/255.00) return simplestyle.formatColor3f(float(1.00), float(1.00 - calculateCMYK(red, green, blue)[1]), float(1.00)) def representY(value): # returns CMS color if available if ( re.search("icc-color", value.group()) ): return simplestyle.formatColor3f(float(1.00), float(1.00), float(1.00 - float(re.split('[,\)\s]+',value.group())[4]))) red = float(simplestyle.parseColor(str(value.group()))[0]/255.00) green = float(simplestyle.parseColor(str(value.group()))[1]/255.00) blue = float(simplestyle.parseColor(str(value.group()))[2]/255.00) return simplestyle.formatColor3f(float(1.00), float(1.00), float(1.00 - calculateCMYK(red, green, blue)[2])) def representK(value): # returns CMS color if available if ( re.search("icc-color", value.group()) ): return simplestyle.formatColor3f(float(1.00 - float(re.split('[,\)\s]+',value.group())[5])), float(1.00 - float(re.split('[,\)\s]+',value.group())[5])), float(1.00 - float(re.split('[,\)\s]+',value.group())[5]))) red = float(simplestyle.parseColor(str(value.group()))[0]/255.00) green = float(simplestyle.parseColor(str(value.group()))[1]/255.00) blue = float(simplestyle.parseColor(str(value.group()))[2]/255.00) return simplestyle.formatColor3f(float(1.00 - calculateCMYK(red, green, blue)[3]), float(1.00 - calculateCMYK(red, green, blue)[3]), float(1.00 - calculateCMYK(red, green, blue)[3])) if (self.options.set_overprint_black): open(tempfile.gettempdir() + os.sep + "separationC.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representC, removeK(file_svg_C))) open(tempfile.gettempdir() + os.sep + "separationM.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representM, removeK(file_svg_M))) open(tempfile.gettempdir() + os.sep + "separationY.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representY, removeK(file_svg_Y))) open(tempfile.gettempdir() + os.sep + "separationK.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representK, file_svg_K)) else: open(tempfile.gettempdir() + os.sep + "separationC.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representC, file_svg_C)) open(tempfile.gettempdir() + os.sep + "separationM.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representM, file_svg_M)) open(tempfile.gettempdir() + os.sep + "separationY.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representY, file_svg_Y)) open(tempfile.gettempdir() + os.sep + "separationK.svg","w").write(re.sub("#[a-fA-F0-9]{6}( icc-color\(.*?\))?", representK, file_svg_K)) resolution = str(int(self.options.resolution)) #if self.options.specialeffects_exclusively: # areas_to_export_only = '--export-id-only' #else: areas_to_export_only = '' alpha = " --export-background=white " color_space = "CMYK" #area_a_exportar_tamanho = " -C " area_a_exportar_tamanho = " " def generate_pngs(): string_inkscape_exec = '' for i in range(len(areas_to_export)): string_inkscape_exec = string_inkscape_exec + tempfile.gettempdir() + os.sep + "separationC.svg" + " " + "--export-id=" + areas_to_export[i] + " " + areas_to_export_only + area_a_exportar_tamanho + alpha + " " + '--export-png=' + tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "C.png" + ' --export-dpi=' + resolution + "\n" string_inkscape_exec = string_inkscape_exec + tempfile.gettempdir() + os.sep + "separationM.svg" + " " + "--export-id=" + areas_to_export[i] + " " + areas_to_export_only + area_a_exportar_tamanho + alpha + " " + '--export-png=' + tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "M.png" + ' --export-dpi=' + resolution + "\n" string_inkscape_exec = string_inkscape_exec + tempfile.gettempdir() + os.sep + "separationY.svg" + " " + "--export-id=" + areas_to_export[i] + " " + areas_to_export_only + area_a_exportar_tamanho + alpha + " " + '--export-png=' + tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "Y.png" + ' --export-dpi=' + resolution + "\n" string_inkscape_exec = string_inkscape_exec + tempfile.gettempdir() + os.sep + "separationK.svg" + " " + "--export-id=" + areas_to_export[i] + " " + areas_to_export_only + area_a_exportar_tamanho + alpha + " " + '--export-png=' + tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "K.png" + ' --export-dpi=' + resolution + "\n" return string_inkscape_exec inkscape_exec = subprocess.Popen(['inkscape -z --shell'], shell=True, stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'), stdin=subprocess.PIPE)# + ['>', '/dev/null']) inkscape_exec.communicate(input=generate_pngs()) for i in range(len(areas_to_export)): subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "C.png", '-colorspace', 'CMYK', '-channel', 'C', '-separate', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "C.png"]).wait() subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "M.png", '-colorspace', 'CMYK', '-channel', 'M', '-separate', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "M.png"]).wait() subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "Y.png", '-colorspace', 'CMYK', '-channel', 'Y', '-separate', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "Y.png"]).wait() subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "K.png", '-colorspace', 'CMYK', '-channel', 'K', '-separate', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "K.png"]).wait() subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "C.png", tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "M.png", tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "Y.png", tempfile.gettempdir() + os.sep + "separated" + areas_to_export[i] + "K.png", '-set', 'colorspace', 'CMYK', '-combine', tempfile.gettempdir() + os.sep + areas_to_export[i] + ".jpg"]).wait() if (self.options.icc_profile): cmyk_profile = open(os.getenv("HOME") + '/.config/inkscape/preferences.xml', 'r').read().split('id="softproof"')[1].split('uri="')[1].split('" />')[0] subprocess.Popen(['convert', tempfile.gettempdir() + os.sep + areas_to_export[i] + ".jpg", '-profile', cmyk_profile, tempfile.gettempdir() + os.sep + areas_to_export[i] + ".jpg"]).wait() def prepare_svg_to_pdf(): def replace_for_device(): origem = rename_svg_colors() def represent(value): red = float(simplestyle.parseColor(str(value.group()))[0]/255.00) green = float(simplestyle.parseColor(str(value.group()))[1]/255.00) blue = float(simplestyle.parseColor(str(value.group()))[2]/255.00) return str(str(simplestyle.formatColor3f(red,green,blue)) + ' device-cmyk(' + str(calculateCMYK(red, green, blue)[0]) + ' ' + str(calculateCMYK(red, green, blue)[1]) + ' ' + str(calculateCMYK(red, green, blue)[2]) + ' ' + str(calculateCMYK(red, green, blue)[3]) + ')') return re.sub("#[a-fA-F0-9]{6}", represent, origem) final = replace_for_device() if self.options.specialeffects: open(tempfile.gettempdir() + os.sep + 'final.svg', 'w').write(final) doc = etree.parse(tempfile.gettempdir() + os.sep + 'final.svg') areas_de_bitmaps = what_export() if len(areas_de_bitmaps) > 0: convert_elements_to_images() objects_info = os.popen('inkscape -S "' + tempfile.gettempdir() + os.sep + 'final.svg' + '"') objects_info_list = objects_info.read().split("\n") for node in doc.getroot(): for child in node: for j in range(len(areas_de_bitmaps)): if 'id' in child.attrib and areas_de_bitmaps[j] in child.attrib['id']: newNode=etree.Element('image') for i in range(len(objects_info_list)): if child.attrib['id'] in objects_info_list[i].split(',')[0]: newNode.set('x', objects_info_list[i].split(',')[1]) newNode.set('y', objects_info_list[i].split(',')[2]) newNode.set('id', "image" + child.attrib['id']) newNode.set('width' , objects_info_list[i].split(',')[3]) newNode.set('height' , objects_info_list[i].split(',')[4]) newNode.set('xlink_href', "file:///tmp/" + child.attrib['id'] + '.jpg') node.replace(child, newNode) parsed = open(tempfile.gettempdir() + os.sep + 'finalPDF.svg', 'w') origem = doc.write(parsed) else: open(tempfile.gettempdir() + os.sep + 'finalPDF.svg', 'w').write(final) prepare_svg_to_pdf() replace_xlink = open(tempfile.gettempdir() + os.sep + 'finalPDF.svg', 'r').read() replace_xlink = replace_xlink.replace('xlink_href', 'xlink:href') if "<text " in replace_xlink: replace_xlink = '' subprocess.Popen(['inkscape', '--verb=EditSelectAllInAllLayers','--verb=ObjectToPath','--verb=FileSave','--verb=FileClose', tempfile.gettempdir() + os.sep + 'finalPDF.svg']).wait() replace_xlink = open(tempfile.gettempdir() + os.sep + 'finalPDF.svg', 'r').read() replace_xlink = replace_xlink.replace('medium;', '12;') replace_spot = '' for i in range(len(replace_xlink.split('\n'))): #eu seu que essa solução é "feia", mas por enquanto é a que soube fazer. Pelo menos está funcionando :) if 'id="crop' in replace_xlink.split('\n')[i] or 'id="bleed' in replace_xlink.split('\n')[i]: replace_spot = replace_spot + replace_xlink.split('\n')[i].replace('device-cmyk(0.0 0.0 0.0 1.0);', 'device-cmyk(1.0 1.0 1.0 1.0);') + '\n' else: replace_spot = replace_spot + replace_xlink.split('\n')[i] + '\n' open(tempfile.gettempdir() + os.sep + 'finalPDF.svg', 'w').write(replace_spot) subprocess.Popen(['uniconvertor', tempfile.gettempdir() + os.sep + 'finalPDF.svg', tempfile.gettempdir() + os.sep + 'final.pdf']).wait() if __name__ == '__main__': effect = ExportTIFF() effect.affect()
Extension
Inkscape Isometric Projection 2.1 :
- https://inkscape.org/~jdhoek/%E2%98%85inkscape-isometric-projection-21
- https://github.com/jdhoek/inkscape-isometric-projection
Inkporter : pour l'export en formats divers (SVG, JPG, PDF, Multiple PDF Page, WEBP, and EPS) :
Svg2ico :
Inkscape - Save As :