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 文档总是显示 "We're sorry. We can't open {nameoffile}.docx because we found a problem with it's contents and if press ok see red x with "无法显示此图像。
在 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)));
}
我设法重新创建了一个类似的场景,并在使用流打开然后将结果再次保存到流时插入图像时出现错误。
问题是与图像部分的关系没有正确保存在文档中。经过一些研究,我发现 this post,其中提到 关系在文档关闭时保存 。
在您的代码中,文档流在文档关闭之前被复制到结果流中。这似乎是问题的原因。
有几种方法可以解决这个问题。您可以尝试:
将文档复制移出 using
语句,文档打开位置:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(byteArrayOriginalStream, true))
{
//...
}
byteArrayOriginalStream.Seek(0, SeekOrigin.Begin);
byteArrayOriginalStream.CopyTo(outputStream);
或
复制前在文档实例上显式调用 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);
}
如果这不能解决问题,或者如果您有任何其他问题,请随时提问 :)。
执行以下代码将图像添加到单元格:
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 文档总是显示 "We're sorry. We can't open {nameoffile}.docx because we found a problem with it's contents and if press ok see red x with "无法显示此图像。
在 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)));
}
我设法重新创建了一个类似的场景,并在使用流打开然后将结果再次保存到流时插入图像时出现错误。
问题是与图像部分的关系没有正确保存在文档中。经过一些研究,我发现 this post,其中提到 关系在文档关闭时保存 。 在您的代码中,文档流在文档关闭之前被复制到结果流中。这似乎是问题的原因。
有几种方法可以解决这个问题。您可以尝试:
将文档复制移出
using
语句,文档打开位置:using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(byteArrayOriginalStream, true)) { //... } byteArrayOriginalStream.Seek(0, SeekOrigin.Begin); byteArrayOriginalStream.CopyTo(outputStream);
或
复制前在文档实例上显式调用
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); }
如果这不能解决问题,或者如果您有任何其他问题,请随时提问 :)。