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