Inkscape扩展开发:批量导出各图层为SVG无输出问题求助
Inkscape图层批量导出SVG扩展修复方案
- 缩进错误:原有代码中
proc.wait(timeout=300)没有缩进在with subprocess.Popen(...)的代码块内,会触发语法错误,导致代码执行中断。 - 参数弃用问题:
--without-gui是Inkscape 0.9x版本的无GUI启动参数,1.0及以上版本已替换为--headless,参数不匹配会导致导出命令执行失败。 - 文件名缺少后缀:导出路径拼接时仅使用了图层标签,未添加
.svg后缀,Inkscape无法识别输出格式,会跳过导出操作。 - 缺少错误日志输出:原有subprocess调用仅捕获了程序未安装的异常,没有读取命令执行的错误输出,无法定位命令执行失败的具体原因。
- 路径拼接不规范:直接拼接字符串生成路径在特殊字符场景下容易出错,建议使用
os.path.join处理路径拼接。
import inkex import subprocess import os class MyExportExtension(inkex.EffectExtension): #add_arguments is currently not being used def add_arguments(self, pars): pars.add_argument("--my_option", type=inkex.Boolean, help="An example option, put your options here") def run_command(self, args): try: with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) as proc: stdout, stderr = proc.communicate(timeout=300) if proc.returncode != 0: inkex.errormsg(f"命令执行失败,错误信息:{stderr}") except OSError: inkex.errormsg(f'Program "{args[0]}" is not installed!') exit() def svg_export(self, layer_id, file_path): self.run_command([ 'inkscape', '--headless', f'--export-filename={file_path}', '--export-area-page', f'--export-id={layer_id}', '--export-id-only', '--export-plain-svg' ]) def effect(self): export_folder_path = 'C:/Users/UserName/Desktop/test_folder/test_export_location/' # 导出目录不存在则自动创建 if not os.path.exists(export_folder_path): os.makedirs(export_folder_path) for layer in self.document.xpath('//svg:g[@inkscape:groupmode="layer"]', namespaces=inkex.NSS): layer_id = layer.attrib["id"] layer_label = layer.attrib["{%s}label" % layer.nsmap['inkscape']] # 替换图层标签中的非法文件名字符 safe_label = layer_label.replace('/', '_').replace('\\', '_').replace(':', '_').replace('*', '_').replace('?', '_').replace('"', '_').replace('<', '_').replace('>', '_').replace('|', '_') file_path = os.path.join(export_folder_path, f"{safe_label}.svg") self.svg_export(layer_id, file_path) if __name__ == '__main__': MyExportExtension().run()
修正后的代码新增了导出目录自动创建、非法文件名替换、错误信息打印逻辑,运行后如果存在异常会直接弹出错误提示,可根据提示内容进一步调整适配你的Inkscape版本。
内容的提问来源于stack exchange,提问作者Lipizzaner
相关产品推荐
相关产品推荐

