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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, docx, png, конвертация




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Игра в хаос и треугольник Серпинского на C#
JavaScript фреймворки
Что такое Truffle