C#将Docx转图片后打包Zip文件,图片损坏问题求助
解决Ionic.Zip打包Word转图片后文件损坏的问题
我明白你现在的困扰——Word转图片功能正常,但用Ionic.Zip打包后的图片全损坏了。我看了你的代码,很快就找到问题所在啦!
问题根源
你这段代码里的zip.AddEntry(pngTarget, "Img");是关键错误:这个重载的AddEntry方法会把第二个参数的字符串内容直接写入到Zip条目里,而不是读取你本地生成的PNG文件内容。也就是说,你打包进Zip的根本不是图片,而是内容为"Img"的文本文件,自然打不开。
修复方案
有两种简单的修复方式,你可以根据需求选择:
方案1:直接添加本地生成的图片文件
既然你已经把图片保存到本地了,直接用AddFile方法添加到Zip里就行,这个方法会自动读取本地文件的真实内容:
//Opens the word document and fetch each page and converts to image foreach (Microsoft.Office.Interop.Word.Window window in doc1.Windows) { foreach (Microsoft.Office.Interop.Word.Pane pane in window.Panes) { using (var zip = new ZipFile()) { var pngTarget = ""; for (var i = 1; i <= pane.Pages.Count; i++) { var page = pane.Pages[i]; var bits = page.EnhMetaFileBits; var target = Path.Combine(startupPath.Split('.')[0], string.Format("{1}_page_{0}", i, startupPath.Split('.')[0])); try { using (var ms = new MemoryStream((byte[])(bits))) { var image = System.Drawing.Image.FromStream(ms); pngTarget = Path.ChangeExtension(target, "png"); image.Save(pngTarget, ImageFormat.Png); // 替换AddEntry为AddFile,第二个参数是Zip内的目录名(可选) zip.AddFile(pngTarget, "Images"); } } catch (System.Exception ex) { // 建议这里添加异常日志,方便排查问题 Console.WriteLine($"处理第{i}页出错:{ex.Message}"); } } zip.Save(@"c:\users\chaitanya_t\Downloads\encoded.zip"); } } }
方案2:跳过本地文件,直接用内存流打包(更高效)
如果你不想把图片保存到本地磁盘,还可以直接在内存里处理完就添加到Zip,减少IO操作,性能更好:
//Opens the word document and fetch each page and converts to image foreach (Microsoft.Office.Interop.Word.Window window in doc1.Windows) { foreach (Microsoft.Office.Interop.Word.Pane pane in window.Panes) { using (var zip = new ZipFile()) { for (var i = 1; i <= pane.Pages.Count; i++) { var page = pane.Pages[i]; var bits = page.EnhMetaFileBits; try { using (var emfMs = new MemoryStream((byte[])(bits))) using (var image = System.Drawing.Image.FromStream(emfMs)) using (var pngMs = new MemoryStream()) { // 把图片保存到内存流 image.Save(pngMs, ImageFormat.Png); // 将内存流的内容添加到Zip,指定Zip内的文件名 zip.AddEntry($"Images/page_{i}.png", pngMs.ToArray()); } } catch (System.Exception ex) { Console.WriteLine($"处理第{i}页出错:{ex.Message}"); } } zip.Save(@"c:\users\chaitanya_t\Downloads\encoded.zip"); } } }
额外建议
- 别忘了在catch块里添加日志输出,不然出错了你根本不知道哪里出问题;
- 如果
startupPath.Split('.')[0]的路径可能不存在,最好先判断并创建目录,避免保存图片时出错;
内容的提问来源于stack exchange,提问作者chaitanay
相关产品推荐
相关产品推荐

