繁体   English   中英

C#WordprocessingDocument-在单元格中插入图像-无法显示图像

[英]C# WordprocessingDocument - insert an image in a cell - Image cannot be displayed

执行以下代码以将图像添加到单元格:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(byteArrayOriginalStream, true))
{
     using (Stream imageStream = new MemoryStream())
     {
         using (FileStream tempStream = new FileStream("C:\Images\xxxx Critical.jpg", FileMode.OpenOrCreate, FileAccess.ReadWrite))
         {
              tempStream.CopyTo(imageStream);
         }

         ImagePart imagePart = wordDoc.MainDocumentPart.AddImagePart(ImagePartType.Jpeg);
         imageStream.Seek(0, SeekOrigin.Begin);
         imagePart.FeedData(imageStream);
         pictureCell.RemoveAllChildren();
         AddImageToCell(pictureCell, wordDoc.MainDocumentPart.GetIdOfPart(imagePart));
    }
    wordDoc.MainDocumentPart.Document.Save();
    //copy the bytearraystream to outputfilestream
    byteArrayOriginalStream.Seek(0, SeekOrigin.Begin);
    byteArrayOriginalStream.CopyTo(outputStream);
}

然后,这会在WCF服务中通过传递给该服务的目标URL创建一个Word文档,但是,该Word文档始终显示“很抱歉。我们无法打开{nameoffile} .docx,因为我们发现其内容存在问题如果按ok,则显示红色x和“此图像无法显示”。

在WCF服务中创建文档会导致此问题,不应将其视为未返回消息而是创建文件。

jpg文件只有32kb的大小,因此不会想到这个问题。

如何显示图像?

下面是AddImageToCell代码,以防出现问题

                            }
private static void AddImageToCell(TableCell cell, string relationshipId)
    {
        var element =
          new Drawing(
            new DW.Inline(
              new DW.Extent() { Cx = 990000L, Cy = 792000L },
              new DW.EffectExtent()
              {
                  LeftEdge = 0L,
                  TopEdge = 0L,
                  RightEdge = 0L,
                  BottomEdge = 0L
              },
              new DW.DocProperties()
              {
                  Id = (UInt32Value)1U,
                  Name = "Picture 1"
              },
              new DW.NonVisualGraphicFrameDrawingProperties(
                  new A.GraphicFrameLocks() { NoChangeAspect = true }),
              new A.Graphic(
                new A.GraphicData(
                  new PIC.Picture(
                    new PIC.NonVisualPictureProperties(
                      new PIC.NonVisualDrawingProperties()
                      {
                          Id = (UInt32Value)0U,
                          Name = "New Bitmap Image.jpg"
                      },
                      new PIC.NonVisualPictureDrawingProperties()),
                    new PIC.BlipFill(
                      new A.Blip(
                        new A.BlipExtensionList(
                          new A.BlipExtension()
                          {
                              Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}"
                          })
                       )
                      {
                          Embed = relationshipId,
                          CompressionState =
                          A.BlipCompressionValues.Print
                      },
                      new A.Stretch(
                        new A.FillRectangle())),
                      new PIC.ShapeProperties(
                        new A.Transform2D(
                          new A.Offset() { X = 0L, Y = 0L },
                          new A.Extents() { Cx = 990000L, Cy = 792000L }),
                        new A.PresetGeometry(
                          new A.AdjustValueList()
                        )
                        { Preset = A.ShapeTypeValues.Rectangle }))
                )
                { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })
            )
            {
                DistanceFromTop = (UInt32Value)0U,
                DistanceFromBottom = (UInt32Value)0U,
                DistanceFromLeft = (UInt32Value)0U,
                DistanceFromRight = (UInt32Value)0U
            });

        cell.Append(new Paragraph(new Run(element)));
    }

我设法重新创建了一个类似的场景,并在使用流打开并再次将结果保存到流时得到插入图像的错误。

问题是与图像部件的关系未正确保存在文档中。 经过一番研究,我发现了这篇文章 ,其中提到关系在文档关闭时被保存 在您的代码中,在关闭文档之前将文档流复制到结果流。 这似乎是问题的原因。

有几种方法可以解决此问题。 您可以尝试:

  1. 将文档复制从using语句移到其中打开了文档的位置:

     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(byteArrayOriginalStream, true)) { //... } byteArrayOriginalStream.Seek(0, SeekOrigin.Begin); byteArrayOriginalStream.CopyTo(outputStream); 

要么

  1. 在复制之前,明确调用文档实例上的Close()方法:

     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(byteArrayOriginalStream, true)) { //... wordDoc.MainDocumentPart.Document.Save(); wordDoc.Close(); //copy the bytearraystream to outputfilestream byteArrayOriginalStream.Seek(0, SeekOrigin.Begin); byteArrayOriginalStream.CopyTo(outputStream); } 

如果这不能解决问题,或者您还有其他问题,请随时提出:)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM