Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035

При создании документа картинки сбиваются вместе

01.10.2019, 08:51. Показов 4500. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Имеется задача - программно создать файл.
Наполнить его изображениями и текстом.

Нашёл пример, модифицировал его:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
            const string fileName = @"F:\test.docx";
            const string imageName = @"F:\win10.jpg";
 
            // Get the Word application object.
            Microsoft.Office.Interop.Word._Application word_app;
            word_app = new Microsoft.Office.Interop.Word.Application();
 
            // Make Word visible (optional).
            word_app.Visible = true;
 
            // Create the Word document.
            object missing = Type.Missing;
            Microsoft.Office.Interop.Word._Document word_doc = word_app.Documents.Add(ref missing, ref missing, ref missing, ref missing);
 
            // Create a header paragraph.
            Microsoft.Office.Interop.Word.Paragraph para = word_doc.Paragraphs.Add(ref missing);
            para.Range.Font.Name = "Courier New";
            para.Range.Font.Size = 16;
            para.Range.Text = "Examination summary" + Environment.NewLine;
            para.Range.Text = "Doctor: " + "Ivanov I I";
            para.Range.InsertParagraphAfter();
 
            para.Range.Font.Size = 14;
            para.Range.Text = "Doctor: " + "Ivanov I I" + Environment.NewLine;
            para.Range.InsertParagraphAfter();
 
            para.Range.Font.Size = 14;
            para.Range.Text = "Patient: " + "Sidorova I I" + Environment.NewLine;
            para.Range.InsertParagraphAfter();
 
            para.Range.Font.Size = 14;
            para.Range.Text = "Date: " + DateTime.Now.ToString();
            para.Range.InsertParagraphAfter();
 
 
 
 
 
            for (int i = 0; i < 5; ++i)
            {
                // Add a page break.
                object break_type = Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak;
                para.Range.InsertBreak(ref break_type);
 
                para = word_doc.Paragraphs.Add(ref missing);
 
                // Add more text.
                para.Range.Text = "Picture number " + i.ToString() + Environment.NewLine;
                para.Range.InsertParagraphAfter();
 
                para.Range.Text = "Diagnose: " + Environment.NewLine + "fhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufew fhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufew";
                para.Range.InsertParagraphAfter();
 
                // Create an InlineShape in the InlineShapes collection where the picture should be added later
                // It is used to get automatically scaled sizes.
                Microsoft.Office.Interop.Word.InlineShape autoScaledInlineShape = para.Range.InlineShapes.AddPicture(imageName);
                float scaledWidth = autoScaledInlineShape.Width;
                float scaledHeight = autoScaledInlineShape.Height;
//                autoScaledInlineShape.Delete();
 
                // Create a new Shape and fill it with the picture
                Microsoft.Office.Interop.Word.Shape newShape = word_doc.Shapes.AddShape(1 + i, 0, 0, scaledWidth, scaledHeight);
                newShape.Fill.UserPicture(imageName);
 
                // Convert the Shape to an InlineShape and optional disable Border
                Microsoft.Office.Interop.Word.InlineShape finalInlineShape = newShape.ConvertToInlineShape();
                //            finalInlineShape.Line.Visible = finalInlineShape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoFalse;
 
                // Cut the range of the InlineShape to clipboard
                finalInlineShape.Range.Cut();
 
                para.Range.Paste();
 
                para.Range.Text = "Summary.";
 
                para.Range.InsertParagraphAfter();
 
                #region Pictures
                // Find the beginning of the document.
                // For other pre-defined bookmarks, see:
                //      http://support.microsoft.com/kb/212555
                object start_of_doc = "\\startofdoc";
 
                // Get a Range at the start of the document.
                Microsoft.Office.Interop.Word.Range start_range = word_doc.Bookmarks.get_Item(ref start_of_doc).Range;
 
                // Add the picture to the Range's InlineShapes.
                string picture_file = imageName;
                Microsoft.Office.Interop.Word.InlineShape inline_shape = start_range.InlineShapes.AddPicture(picture_file, ref missing, ref missing, ref missing);
 
                // Format the picture.
                Microsoft.Office.Interop.Word.Shape shape = inline_shape.ConvertToShape();
 
                // Scale uniformly by 50%.
                //shape.RelativeVerticalSize
                //shape.ScaleHeight(0.5f, Core.MsoTriState.msoTrue,
                //    Core.MsoScaleFrom.msoScaleFromTopLeft);
 
                // Wrap text around the picture's square.
                shape.WrapFormat.Type = Microsoft.Office.Interop.Word.WdWrapType.wdWrapSquare;
 
                // Align the picture on the upper right.
                shape.Left = (float)10;
                shape.Top = (float)10;
                #endregion
            }
Но все добавляемые картинки почему-то накладываются одна на другую.

Если есть специалисты, подскажите, как сделать, чтобы каждая картинка выводилась на новой странице, между текстовыми данными?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.10.2019, 08:51
Ответы с готовыми решениями:

Как можно при создании домена разрешить вводить точки вместе с инициалами?
Как при создании домена можно сделать чтоб когда вводит фамилию и инициалы , могли вводить точки вместе инициалами

Ошибка при создании документа word
Спасите мой диплом! Имеется веб-приложение взаимодействующее с базой данных размещённой на sql-сервере, которое выбирает данные и по...

Изменение формы документа при создании
Други! Подмогите кто может! В конфе есть документ &quot;Поступоение товаров и услуг&quot;. На форма этого документа есть элемент...

8
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.10.2019, 08:17
Лучший ответ Сообщение было отмечено Khludenkov как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using Word = Microsoft.Office.Interop.Word;
 
static class WordTools
{
    internal static void CreateDocumentWithPictures(string name, string picFolder)
    {
        var wdApp = new Word.Application();//создать приложение
        var wdDoc = wdApp.Documents.Add();//Добавить документ
        Word.Paragraph para = wdDoc.Paragraphs.First;
        para.Range.Font.Name = "Courier New";
        para.Range.Font.Size = 16;
        para.Range.Text = "Examination summary";
        para.Range.InsertParagraphAfter();
 
        para.Range.Font.Size = 14;
        para.Range.Text = "Doctor: " + "Ivanov I I";
        para.Range.InsertParagraphAfter();
 
        para.Range.Text = "Patient: " + "Sidorova I I";
        para.Range.InsertParagraphAfter();
 
        para.Range.Text = "Date: " + DateTime.Now.ToString();
        para.Range.InsertParagraphAfter();
 
        var pics = System.IO.Directory.GetFiles(picFolder, "*.png");
        var index = 0;
        if (pics != null && pics.Length > 0)
        {
            foreach (var pic in pics)
            {
                //Вставка текста
                para.Range.InsertBreak(Word.WdBreakType.wdPageBreak);
                para.Range.InsertAfter($"Picture number {++index}");
                para.Range.InsertParagraphAfter();
                para.Range.InsertAfter(@"Diagnose:");
                para.Range.InsertParagraphAfter();
                para.Range.InsertAfter(@"fhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufew fhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufewfhueifheifuefh fewiowuhfewufhewuihfwe eoifejfuewoifufueiowufew");
                para.Range.InsertParagraphAfter();
                //Вставка картинки
                var wdInShape = wdDoc.InlineShapes.AddPicture(pic, SaveWithDocument: true, Range: para.Range);
                //Зафиксировать соотношение сторон
                wdInShape.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue;
                //Задать ширину
                wdInShape.Width = 100;
                para.Range.InsertParagraphAfter();
            }
            wdDoc.SaveAs2(name);
        }
        wdApp.Visible = true;
    }
}
Использование: WordTools.CreateDocumentWithPictures(Полное_Имя_Файла, Путь_к_папке_с_изображениями);
1
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035
02.10.2019, 08:53  [ТС]
Большое спасибо!
Позвольте ещё два вопроса.

1) Как добавить ещё одну картинку - на первой странице справа в углу - логотип клиники?
Пытался сам сделать - но похоже картинки живут своей жизнью, текст своей, таблицы тоже сами по себе. Как-то всё в кучу сбивается.

2) Подскажите, есть книга нормальная, где всё это почитать можно - про параграфы и прочее? Читал МСДН на эту тему, но как-то не особо...
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.10.2019, 15:34
Khludenkov, картинка в углу на одной странице или на всех?
Книгу не посоветую. Неплохо собрана информация на wordexpert.ru
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035
02.10.2019, 15:48  [ТС]
На первой. Логотип клиники.

Пока вот так сделал:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
            var wdApp = new Word.Application();
            var wdDoc = wdApp.Documents.Add();
            Paragraph para = wdDoc.Paragraphs.First;
            para.Range.Font.Name = "Courier New";
            para.Range.Font.Size = 14;
 
            para.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphRight;
 
            //  Вставка картинки - logotype
            var wdInShape1 = wdDoc.InlineShapes.AddPicture(logoFileName, SaveWithDocument: true, Range: para.Range);
 
            //  Задать ширину
            wdInShape1.Width = 100;
            wdInShape1.Height = 100;
            para.Range.InsertParagraphAfter();
 
 
            para.Range.InsertAfter("");
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("");
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("");
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("");
            para.Range.InsertParagraphAfter();
 
            //  Insert Header
            para.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
            para.Range.InsertAfter("Клиника: " + cf.ClinicaName);
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("Доктор: " + Currents.Examination.DoctorFIO);
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("Должность: " + Currents.Examination.Doctor.Profession);
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("Пациент: " + Currents.Examination.PatientFIO);
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter("Дата формирования отчёта:");
            para.Range.InsertParagraphAfter();
            para.Range.InsertAfter(DateTime.Now.ToString());
            para.Range.InsertParagraphAfter();
 
            var pics = Directory.GetFiles(cf.MediaDirPath + @"\" + Currents.Examination.PathToFolder, "*.jpg");
            var index = 0;
 
            int picAmount = 0;
 
 
            if ((pics != null) && (pics.Length > 0))
            {
                picAmount = pics.Length;
            }
            else
            {
                MessageBox.Show("Внимание! Снимки не обнаружены (формат файлов - JPEG)", "Снимки не обнаружены" , MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
 
            para.Range.InsertAfter("Снимков всего: " + picAmount);
            para.Range.InsertParagraphAfter();
На каком-то сайте встречал избранные главы из книги "C# для профессионалов"

Скачал "Wrox Press - Professional C#, 3rd Edition"

Но то ли книга не та, то ли издание другое...



Сейчас сделано, что рисунок-логотип вверху справа.
Затем внизу слева - текстовая информация.


Желательно бы конечно, чтобы наверху справа - картинка.
И тоже сверху, но слева - текстовая информация.


И если можно, подскажите, можно ли добавить "номера страниц".
И если можно, сверху колонтитул с фирменной информацией...

Вопросы, вопросы...
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.10.2019, 17:50
Цитата Сообщение от Khludenkov Посмотреть сообщение
вот так сделал:
Неправильно. Нужно использовать не InlineShapes, а ShapeRange. Разница в том, что InlineShape находятся в тексте, а Shape имеют обтекание.
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.10.2019, 07:20
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Вставка логотипа
var logoPic = wdDoc.Shapes.AddPicture(@"logo_pic_path");
//Задание положения картинки относительно страницы
//Горизонтальное положение
logoPic.RelativeHorizontalPosition = Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin;
//Вертикальное положение
logoPic.RelativeVerticalPosition = Word.WdRelativeVerticalPosition.wdRelativeVerticalPositionMargin;
//Выравнивание. Неочевидная настройка, удалось установить записью макроса.
logoPic.Left = (float)Word.WdShapePosition.wdShapeRight;
//Относительное расстояние до левого и верхнего края
logoPic.TopRelative = (float)Word.WdShapePositionRelative.wdShapePositionRelativeNone;
logoPic.LeftRelative = (float)Word.WdShapePositionRelative.wdShapePositionRelativeNone;
//Обтекание текстом. Вокруг картинки
logoPic.WrapFormat.Type = Word.WdWrapType.wdWrapSquare;
Что касается всего остального: колонтитулы, номера страниц и прочие «хотелки», то всё это можно реализовать программно, но гораздо удобнее и правильнее сделать шаблон документа со всеми неизменяющимися элементами, на основе шаблона создавать документ и дальше уже заполнять его.
1
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035
03.10.2019, 09:49  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
правильнее сделать шаблон документа
Да, спасибо.
Наверное в эту сторону и буду дальше копать.

Добавлено через 56 минут
ViterAlex, если можно, укажите ссылку на ресурс, где написано про шаблон документа.
Тоже wordexpert.ru ?

Программная модель ворда что для C# что для VBA одинаковая ?
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.10.2019, 10:10
Цитата Сообщение от Khludenkov Посмотреть сообщение
Программная модель ворда что для C# что для VBA одинаковая ?
Это называется объектная модель. Практически одинаковая. Я слышал об отличиях, но в чём именно они заключаются — не знаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2019, 10:10
Помогаю со студенческими работами здесь

Out of memory при создании документа Word
Добрый день. Есть простейшая программка, запускающая ms word. using System; using System.Collections.Generic; using...

Добавление отступов при создании xml документа
Здравтствуйте. Я создаю xml документ так: DocumentBuilderFactory factory; DocumentBuilder builder; Document doc; try { ...

Автоматическое создание обработки при создании документа
Добрый день! необходимо сделать так чтобы обработка создавалась автоматически при создании документа на данный момент обработка...

Ошибка при создании документа Реализация товаров
Доброго времени суток господа. Начал изучать 1с, и тут практически сразу напоролся на грабли. При вызове создания документа выдает...

Автоматическая замена кодировки при создании документа
вот еще вопросик есть. у меня есть .txt файлы на сайте которые несут переменные. в этих переменных русские буквы, а что бы они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru