使用C#结合CorelDraw类型库自动化编辑CDR文件遇文本插入问题
CorelDraw COM自动化创建Shape实例报错的解决方法
需求
使用C#结合CorelDraw类型库自动化处理近200个含嵌套形状(如矩形套矩形)的CDR文件,为每组形状的最内层添加指定名称列表中的名称,生成新文件后导出为SVG。
问题
已成功获取文件中的形状,但插入文本时创建Shape实例抛出COM异常:
System.Runtime.InteropServices.COMException: 'Retrieving the COM class factory for component with CLSID {A77D0076-C6D1-4D32-9F72-F3A62CE56578} failed due to the following error: 80040154 Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)).'
已尝试的代码
Type pia_type = Type.GetTypeFromProgID("CorelDRAW.Application"); Application app = Activator.CreateInstance(pia_type) as Application; app.Visible = true; Document document = app.OpenDocument(@"Path_To_Cdr"); // Update : ShapeRange shapes = document.ActivePage.Shapes.FindShapes(); foreach(Shape s in shapes) { // 此处抛出异常 // System.Runtime.InteropServices.COMException: 'Retrieving the COM class factory for component Shape newShape = new Shape() { // Text.Contents = "Eureka!!" }; s.PlaceTextInside(newShape); }
解决方案
问题核心是不能直接通过new Shape()实例化CorelDraw的COM对象,所有形状必须通过CorelDraw应用或文档提供的API方法创建。
正确实现步骤:
- 调用文档的
CreateArtisticText或CreateParagraphText方法生成文本形状 - 将创建好的文本形状放入目标闭合形状内部
修改后的代码示例:
Type pia_type = Type.GetTypeFromProgID("CorelDRAW.Application"); Application app = Activator.CreateInstance(pia_type) as Application; app.Visible = true; Document document = app.OpenDocument(@"Path_To_Cdr"); ShapeRange shapes = document.ActivePage.Shapes.FindShapes(); foreach(Shape s in shapes) { // 仅处理闭合形状(比如矩形),避免无效操作 if (s.IsClosed && s.Type == cdrShapeType.cdrRectangleShape) { // 在页面临时位置创建美术文本(后续会被放入目标形状) Shape textShape = document.ActivePage.CreateArtisticText(0, 0, "Eureka!!"); // 可选:设置文本样式 textShape.Text.Font = "Arial"; textShape.Text.Size = 12; // 将文本放入目标形状内部 s.PlaceTextInside(textShape); } } // 保存修改后的CDR文件 document.SaveAs(@"Path_To_Save_New_Cdr", cdrSaveFileType.cdrCDR); // 导出为SVG格式 document.Export(@"Path_To_Export_SVG", cdrExportFileFormat.cdrSVG);
额外注意事项:
- 确保CorelDraw已正确注册COM组件,且程序编译位数(x86/x64)与CorelDraw安装版本一致
- 处理嵌套形状时,可通过
Shape.ChildShapes属性递归判断最内层(无任何子形状的即为目标) - 批量处理时建议设置
app.Visible = false,提升运行效率
内容的提问来源于stack exchange,提问作者Linesh Lanjewar
相关产品推荐
相关产品推荐

