Laden...

[Gelöst] Beschädigtes Word-File nach Einfügen von Bild durch XML-SDK

Erstellt von Nitro2k7 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.721 Views
Nitro2k7 Themenstarter:in
276 Beiträge seit 2007
vor 12 Jahren
[Gelöst] Beschädigtes Word-File nach Einfügen von Bild durch XML-SDK

Hallo,

ich möchte gern ein Bild in eine Wordvorlage einfügen. Die Vorlage ist eine DOCX-Datei, das zu befüllende Feld ist ein Mergefield ("PICTURE").

Wenn das Word-File erstellt wurde bekomme ich eine Fehlermeldung eines beschädigten Word-Dokumentes.

Lager ich das ganze in ein Testprojekt aus, funktioniert es einwandfrei.

Ich bin mittlerweile soweit, dass ich weiss, dass die Fehlermeldung beim Erstellen durch eine der folgenden Zeilen kommt:


MainDocumentPart mp = docx.MainDocumentPart;
            ImagePart ip = mp.AddImagePart(ImagePartType.Jpeg);
            string irid = mp.GetIdOfPart(ip);
            using (FileStream strm = new FileStream(myPicFilePath, FileMode.Open))
            {
                ip.FeedData(strm);
            }

in der Zeile


 ImagePart ip = mp.AddImagePart(ImagePartType.Jpeg);

ist was faul (oder an etwas, was damit zusammenhängt). Habe auch schon verschiedene Templates ausprobiert.

Welche Probleme kann es beim Einfügen von ImageParts (bei AddImagePart) geben?

Gruss

nitro

EDIT: Rechtschreibung

Nitro2k7 Themenstarter:in
276 Beiträge seit 2007
vor 12 Jahren

Ich habe es jetzt mit einem "Workaround" gelöst...indem ich es ausgelagert habe und den Stream in der gleichen Methode schliesse, in der ich das ganze öffne und nicht von woanders darauf zugreife.

Komischerweise geht es, wenn es Strings sind, wenns an Bilder geht, geht es schon nicht mehr.

Dafür werden alle Statements UNTER dem Bild nicht mehr ersetzt...ich werde weiter daran arbeiten, daher noch nicht das "gelöst"-Tag im Titel

Gruss

nitro

L
27 Beiträge seit 2011
vor 12 Jahren

Mit dem OpenXML SDK kommt ein Code-Generator im sog. ProductivityTool.
Du lädst ein Docx rein und kannst schon auf die einzelnen Parts springen.
Dann Reflect Code und raus kommt ein Progrämmchen, um genau dieses Docx zu erzeugen.

Habe ich mal für ein Bild gemacht:



// Einfügen des Imageparts 
            ImagePart imagePart1 = mainDocumentPart1.AddNewPart<ImagePart>("image/png", "rId4");
            GenerateImagePart1Content(imagePart1);

        // Generates content of imagePart1.
        private void GenerateImagePart1Content(ImagePart imagePart1)
        {
            System.IO.Stream data = GetBinaryDataStream(imagePart1Data);
            imagePart1.FeedData(data);
            data.Close();
        }
//...
        #region Binary Data
        private string imagePart1Data =      "iVBORw0KGgoAAAANSUhEUgAAAXgAAABKCAIAAAA... usw "

private System.IO.Stream GetBinaryDataStream(string base64String)
        {
            return new  System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
        }

// und jetzt das Aufbauen des XMLs im Document, na ja halt generated...

//...
            Drawing drawing1 = new Drawing();

            Wp.Inline inline1 = new Wp.Inline(){ DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U };
            Wp.Extent extent1 = new Wp.Extent(){ Cx = 3580765L, Cy = 706120L };
            Wp.EffectExtent effectExtent1 = new Wp.EffectExtent(){ LeftEdge = 19050L, TopEdge = 0L, RightEdge = 635L, BottomEdge = 0L };
            Wp.DocProperties docProperties1 = new Wp.DocProperties(){ Id = (UInt32Value)1U, Name = "Bild 1" };

            Wp.NonVisualGraphicFrameDrawingProperties nonVisualGraphicFrameDrawingProperties1 = new Wp.NonVisualGraphicFrameDrawingProperties();

            A.GraphicFrameLocks graphicFrameLocks1 = new A.GraphicFrameLocks(){ NoChangeAspect = true };
            graphicFrameLocks1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

            nonVisualGraphicFrameDrawingProperties1.Append(graphicFrameLocks1);

            A.Graphic graphic1 = new A.Graphic();
            graphic1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main");

            A.GraphicData graphicData1 = new A.GraphicData(){ Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" };

            Pic.Picture picture1 = new Pic.Picture();
            picture1.AddNamespaceDeclaration("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");

            Pic.NonVisualPictureProperties nonVisualPictureProperties1 = new Pic.NonVisualPictureProperties();
            Pic.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Pic.NonVisualDrawingProperties(){ Id = (UInt32Value)0U, Name = "Picture 1" };

            Pic.NonVisualPictureDrawingProperties nonVisualPictureDrawingProperties1 = new Pic.NonVisualPictureDrawingProperties();
            A.PictureLocks pictureLocks1 = new A.PictureLocks(){ NoChangeAspect = true, NoChangeArrowheads = true };

            nonVisualPictureDrawingProperties1.Append(pictureLocks1);

            nonVisualPictureProperties1.Append(nonVisualDrawingProperties1);
            nonVisualPictureProperties1.Append(nonVisualPictureDrawingProperties1);

            Pic.BlipFill blipFill1 = new Pic.BlipFill();
            A.Blip blip1 = new A.Blip(){ Embed = "rId4", CompressionState = A.BlipCompressionValues.Print };
            A.SourceRectangle sourceRectangle1 = new A.SourceRectangle();

            A.Stretch stretch1 = new A.Stretch();
            A.FillRectangle fillRectangle1 = new A.FillRectangle();

            stretch1.Append(fillRectangle1);

            blipFill1.Append(blip1);
            blipFill1.Append(sourceRectangle1);
            blipFill1.Append(stretch1);

            Pic.ShapeProperties shapeProperties1 = new Pic.ShapeProperties(){ BlackWhiteMode = A.BlackWhiteModeValues.Auto };

            A.Transform2D transform2D1 = new A.Transform2D();
            A.Offset offset1 = new A.Offset(){ X = 0L, Y = 0L };
            A.Extents extents1 = new A.Extents(){ Cx = 3580765L, Cy = 706120L };

            transform2D1.Append(offset1);
            transform2D1.Append(extents1);

            A.PresetGeometry presetGeometry1 = new A.PresetGeometry(){ Preset = A.ShapeTypeValues.Rectangle };
            A.AdjustValueList adjustValueList1 = new A.AdjustValueList();

            presetGeometry1.Append(adjustValueList1);
            A.NoFill noFill1 = new A.NoFill();

            A.Outline outline1 = new A.Outline(){ Width = 9525 };
            A.NoFill noFill2 = new A.NoFill();
            A.Miter miter1 = new A.Miter(){ Limit = 800000 };
            A.HeadEnd headEnd1 = new A.HeadEnd();
            A.TailEnd tailEnd1 = new A.TailEnd();

            outline1.Append(noFill2);
            outline1.Append(miter1);
            outline1.Append(headEnd1);
            outline1.Append(tailEnd1);

            shapeProperties1.Append(transform2D1);
            shapeProperties1.Append(presetGeometry1);
            shapeProperties1.Append(noFill1);
            shapeProperties1.Append(outline1);

            picture1.Append(nonVisualPictureProperties1);
            picture1.Append(blipFill1);
            picture1.Append(shapeProperties1);

            graphicData1.Append(picture1);

            graphic1.Append(graphicData1);

            inline1.Append(extent1);
            inline1.Append(effectExtent1);
            inline1.Append(docProperties1);
            inline1.Append(nonVisualGraphicFrameDrawingProperties1);
            inline1.Append(graphic1);

            drawing1.Append(inline1);

//...



        #endregion


Na ja, das Tool ist ein guter Einstieg in OpenXML.

Nitro2k7 Themenstarter:in
276 Beiträge seit 2007
vor 12 Jahren

Damit ist es dann gelöst denke ich, Vielen Dank.

Gruss

nitro