2011-09-04 70 views
1

直到现在,这块代码一直用于构建带有文本的文档几个月,没有障碍。我现在正在尝试动态添加图像。我花了大约两天的时间盯着代码和研究,而且已经结束了。我怀疑问题是关系没有被创建(更多细节在下面)。也许不是?OpenXML:将图像添加到文档

//set stuff up... 
WordprocessingDocument doc = WordprocessingDocument.Open(fsPat, true, new OpenSettings(){ 
    AutoSave = true, 

    MarkupCompatibilityProcessSettings = new MarkupCompatibilityProcessSettings(MarkupCompatibilityProcessMode.ProcessAllParts, 
    DocumentFormat.OpenXml.FileFormatVersions.Office2007), 

    MaxCharactersInPart = long.MaxValue 
    }); 

    MainDocumentPart mainPart = doc.MainDocumentPart; 
. 
.Other stuff goes here 
. 

//now the fun... 
Run r2 = new Run(); 
    // Add an ImagePart. 
    ImagePart ip = mainPart.AddImagePart(ImagePartType.Png); 
    string imageRelationshipID = mainPart.CreateRelationshipToPart(ip); // 
    using (Stream imgStream = ip.GetStream()) 
     { 
     System.Drawing.Bitmap b = new System.Drawing.Bitmap("myfile.png"); 
     b.Save(imgStream, System.Drawing.Imaging.ImageFormat.Png); 
     } 
    Drawing drawing = BuildImage(imageRelationshipID, "name"+imageRelationshipID.ToString(), 17, 17); 
    r2.Append(drawing); 
    p.Append(r2); 

图像部分基本上由http://blog.stuartwhiteford.com/?p=33复制),并且在一个循环中目前正在运行。我也复制了他的BuildImage()函数并按原样使用它。

当我打开生成的docx时,我看到红色的Xs,图像在说“此图像目前无法显示”。

当我打开zip文件时,图像将出现在root/media中,但不是我所期望的root/word/media。我也无法找到任何关系文件中引用的图像。理想情况下,他们将在root/word/_rels/document.xml.rels中。你会注意到我改变了imageRelationshipID的设置,希望解决这个问题。它没有。

请帮忙。谢谢。

回答

1

所以......看起来OpenXML只是讨厌我。我尝试了其他方法,比如尝试其他方法,从3-4个地方复制AddImagePart代码 - 其中没有一个持续很久 - 并且无法建立关系。我所看到的含义是,它们会随着AddImagePart函数自动发生。

我最终做了一个完整的解决方法,我添加了所有我可能想要放置的图片,并删除了我不想要的图片节点的父母(一般运行节点)。由于这些图片都是非常小的图片,因为我不必跟踪图像存储在磁盘上的位置,所以它是可行的,并且比我们尝试添加它们更加优雅。

+0

你能否详细说明一下?我遇到了完全相同的问题。图像关系没有被创建。 – tr4nc3

+0

@ tr4nc3在我的场景中,我知道我总是希望在特定位置显示3张图像中的一张。所以我欺骗并将它们添加到我的模板文档中的这些位置。然后,我可以删除所有与所需的“图像名称”不匹配的图像,只留下一个。所有3张图像仍然嵌入在媒体文件夹中,因此文件大小稍微大一些,否则就会变大。这只适用于我,因为a)有限的图像选项b)小图像(12x12或其他)c)我使用模板而不是从头构建文档。 – emragins

+0

如果这不符合您的需求,对不起,我将无法提供帮助。我从来没有得到“添加图像”代码来支持上述解决方案。我的项目的长期结果是,我们最终转而构建html并将其转换为pdf。后来,我们最终还是转向了Crystal Reports,这要感谢非技术商人。这是一个完全不同的故事,被告知啤酒。 – emragins

相关问题