emragins
emragins

Reputation: 5157

OpenXML: Issue adding images to documents

Up until now, this block of code has been using to build documents with text for several months with no snags. I am now trying to dynamically add images. I've spent about two days staring at code and researching and am at an end. I suspect the issue is that relationships are not being created (more details below.) Maybe not?

   //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);

The image part is essentially copied from http://blog.stuartwhiteford.com/?p=33) and is running in a loop presently. I also copied his BuildImage() function and use it as-is.

When I open the resulting docx, I see red Xs where the images are saying "This image cannot currently be displayed."

When I open the zip, the images will appear in root/media, but not root/word/media as I'd expect. I also cannot find the images referenced in any of the relationship files. Ideally they'd be in root/word/_rels/document.xml.rels. You'll notice I changed how imageRelationshipID is set hoping to fix this. It didn't.

Please help. Thank you.

Upvotes: 1

Views: 2195

Answers (1)

emragins
emragins

Reputation: 5157

So... It seems like OpenXML just hates me. I copied AddImagePart code from like 3-4 places among trying other things--none of which lasted long--and just could not get relationships to form. The implication I see is that they happen automatically with the AddImagePart function.

I ended up doing a complete workaround where I add all the pictures I might want to put and remove the Drawing nodes' parents of the ones I didn't want (Run nodes, generally.) Since these are very small pictures, it's feasible and in ways more elegant than trying to add them as necessary since I don't have to keep track of where images are stored on disk.

Upvotes: 3

Related Questions