如何将图片转换为OpenXML要求格式?Base64生成不一致问题
图片转OpenXML格式及Base64不一致问题解决办法
图片转OpenXML格式的正确流程
要将图片转换为OpenXML可识别的格式,核心是保留图片原始二进制数据并正确关联到文档的ImagePart:
- 直接读取图片的原始二进制字节,避免经过任何格式转换或编码处理
- 将二进制数据编码为无换行的Base64字符串(和SDK工具生成格式对齐)
- 在OpenXML文档中创建对应类型的ImagePart,写入二进制数据并关联到文档内容
Base64字符串不一致的原因及解决方法
1. 图片读取方式错误
如果用带字符编码的方式读取图片(比如StreamReader),会破坏原始二进制数据。正确的读取方式是直接读取字节:
byte[] imageBytes = File.ReadAllBytes("your-image.png"); string base64Str = Convert.ToBase64String(imageBytes);
2. Base64格式带换行
OpenXML SDK工具生成的Base64通常不带换行符,而默认Convert.ToBase64String会自动添加换行。可以通过参数去掉换行:
string base64Str = Convert.ToBase64String(imageBytes, Base64FormattingOptions.None);
3. 图片被隐式格式转换
如果通过Bitmap等对象加载图片,可能会自动修改像素格式或压缩方式,导致二进制数据变化。必须直接读取文件字节,跳过中间对象处理。
4. ContentType不匹配
即使Base64一致,如果ImagePart的ContentType设置错误,OpenXML也无法正确识别图片。需根据图片实际格式设置:
- PNG:
ImagePartType.Png(对应image/png) - JPG:
ImagePartType.Jpeg(对应image/jpeg)
完整示例代码(插入图片到Word文档)
using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.IO; public void InsertImageToWord(string docFilePath, string imageFilePath) { // 读取图片原始字节 byte[] imageBytes = File.ReadAllBytes(imageFilePath); string base64Image = Convert.ToBase64String(imageBytes, Base64FormattingOptions.None); using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(docFilePath, true)) { MainDocumentPart mainPart = wordDoc.MainDocumentPart; // 创建对应类型的ImagePart ImagePart imagePart = mainPart.AddImagePart(ImagePartType.Png); using (Stream stream = imagePart.GetStream()) { stream.Write(imageBytes, 0, imageBytes.Length); } // 获取ImagePart的关联ID string imagePartId = mainPart.GetIdOfPart(imagePart); // 构建图片的Drawing元素 Drawing drawing = new Drawing( new DW.Inline( new DW.Extent() { Cx = 990000, Cy = 792000 }, new DW.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }, new DW.DocProperties() { Id = (UInt32Value)1U, Name = "Inserted Image" }, 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 = "Image File" }, new PIC.NonVisualPictureDrawingProperties()), new PIC.BlipFill( new A.Blip( new A.BlipExtensionList( new A.BlipExtension() { Uri = "{28A0092B-C50C-407E-A947-70E740481C1C}" }) ) { Embed = imagePartId, 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 = 990000, Cy = 792000 }), new A.PresetGeometry( new A.AdjustValueList()) { Preset = A.ShapeTypeValues.Rectangle }))) { Uri = "http://schemas.openxmlformats.org/drawingml/2006/picture" })) { DistanceFromTop = 0U, DistanceFromBottom = 0U, DistanceFromLeft = 0U, DistanceFromRight = 0U, EditId = "50D07946" }); // 将图片插入文档末尾 Paragraph paragraph = new Paragraph(new Run(drawing)); mainPart.Document.Body.Append(paragraph); mainPart.Document.Save(); } }
内容的提问来源于stack exchange,提问作者user30786835
相关产品推荐
相关产品推荐

