Docx в png на C#
Мне поступают самые разные заказы, иногда приходится заниматься тем, чем никогда бы не подумал, просто не придумал бы. Например, одна из задач, которую пришлось решить в процессе создания одной программы на заказ – это конвертация документов Word (docx) в изображение (png).
Для работы нам потребуется установленный в системе ворд, другие способы либо сложнее, либо небесплатные. Итак, метод, на вход принимающий путь к папке и имя файла:
private void ConvertDocPNG(string startPath, string filename1) { var docPath = Path.Combine(startPath, filename1); var app = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document doc = new Microsoft.Office.Interop.Word.Document(); app.Visible = false; doc = app.Documents.Open(docPath); app.WindowState = Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateMaximize; app.ActiveWindow.ActivePane.View.Zoom.Percentage = 100; doc.ShowGrammaticalErrors = false; doc.ShowRevisions = false; doc.ShowSpellingErrors = false;Запускаем ворд (так, чтобы его не видно было), открываем документ, отключаем подсвечивание различных ошибок. Далее извлекаем каждую страницу и конвертируем в картинку:
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) { foreach (Microsoft.Office.Interop.Word.Pane pane in window.Panes) { for (var i = 1; i <= pane.Pages.Count; i++) { Microsoft.Office.Interop.Word.Page page = null; bool populated = false; while (!populated) { try {Переменная ниже не всегда готова в тот же момент к разделению страниц. Если вы пропустите этот шаг, то программа прекратит работу. Что же делать? Просто создадим цикл и обернём выполнение в try-catch. Поток поспит микросекунду и снова попытается инициализировать переменную:
page = pane.Pages[i]; populated = true; } catch (Exception ex) { System.Threading.Thread.Sleep(1); } } var bits = page.EnhMetaFileBits; var target = Path.Combine(startPath + "\\", string.Format("{1}_page_{0}", i, filename1.Split('.')[0])); try { using (var ms = new MemoryStream((byte[])(bits))) { var image = System.Drawing.Image.FromStream(ms); var pngTarget = Path.ChangeExtension(target, "png"); // Способ 1 image.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png); } } catch (System.Exception ex) { doc.Close(true, Type.Missing, Type.Missing); System.Runtime.InteropServices.Marshal.ReleaseComObject(doc); doc = null; app.Quit(true, Type.Missing, Type.Missing); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); app = null; throw ex; } } } }Кстати, есть и другой способ сохранения, посложнее:
float width = Convert.ToInt32(hfIdCardMaxWidth.Value); float height = Convert.ToInt32(hfIdCardMaxHeight.Value); float scale = Math.Min(width / image.Width, height / image.Height); int resizedWidth = (int)Math.Round(image.Width * scale); int resizedHeight = (int)Math.Round(image.Height * scale); Bitmap myBitmap = new Bitmap(image, new Size(resizedWidth, resizedHeight)); myBitmap.Save(pngTarget, System.Drawing.Imaging.ImageFormat.Png);Как видите, нет ничего сложного в конвертации документов Word в изображения с помощью языка C# (.NET). Если вам требуется выполнить какую либо работу на C#, создать программу на заказа по работе с изображениями или чем-либо еще, вы всегда можете написать мне - вам будет оказана быстрая и квалифицированная помощь программиста за умеренную плату.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.