Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Вставка нумерации листов в Word-документе

Hello comp,

Пишу программу, которая вставляет картинки-tif-образы
отсканированных страниц в документ Ворда. Все здорово получается, вот
только, как все эти страницы пронумеровать?
Вот кусок Делфи-кода, чтобы быть конкретным

// Создаем "ссылку" на Ворд-приложение
WD := CreateOLEObject('Word.Application');
// Открываем новый док
WD.Application.Documents.Add('NORMAL.DOT', FALSE, wdNewBlankDocument, TRUE);
// Размеры рабочей области страницы
Height := WD.Application.Selection.PageSetup.PageHeight-
WD.Application.Selection.PageSetup.BottomMargin-
WD.Application.Selection.PageSetup.TopMargin; // в точках
Width := WD.Application.Selection.PageSetup.PageWidth -
WD.Application.Selection.PageSetup.RightMargin-
WD.Application.Selection.PageSetup.LeftMargin; // в точках

// Имена файлов картинок берем из ЛистБокса
for i := 0 to lbx.Items.Count-1 do
begin
lbx.ItemIndex := i;

// "Ссылка" на объект картинки на листе
s := WD.Application.Selection.InlineShapes.AddPicture(dlbx.Directory+'\'+lbx.Items[i],
False, True);

// Выставим размеры картинки на листе
s.LockAspectRatio := False;
s.Height := Height-20;
s.Width := Width-5;

// Если еще картинки есть - вставляем разрыв
if i < lbx.Items.Count-1 then
WD.Application.Selection.InsertBreak(wdPageBreak);

end; // конец цикла обхода файлов-картинок

Я так понимаю, что нумерация расставлется уже после создания всех
страниц с использованием коллекции PageNumbers -
PageNumbers.Add(wdAlignPageNumberLeft, True). Проблема в том, что не
могу "подлезть" к этой самой PageNumbers.
Делал макросы в Ворде и смотрел на их листинг - ничего не дает, Делфи
не хочет признавать например такую конструкцию
s := WD.Application.Selection.Sections.Items[0].Footers
Если подскажете, как решить это, буду благодарен.
--
Вадим Шешунов

Номер выпуска : 5164
Возраст листа : 869 (дней)
Количество подписчиков : 548
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/511615
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

Ответить   Вадим Шешунов Mon, 6 Feb 2006 12:19:27 +0200 (#511615)

 

Ответы:

Здравствуйте, Вадим,

Я не занимался этой проблемой, но из работы в ворде помню, что
нумерация страниц - это вставка в колонтитул чего-то, что выводит
номер страницы. Т.е. может сначала создать колонтитулы?

Ответить   Tue, 7 Feb 2006 08:32:53 +0500 (#511882)

 

Здравствуйте, Шистеров.

В том-то и была проблема, чтобы правильно "подлезть" к колонтитулам.
Там со всеми этими коллекциями и их цепочками можно сломать ноги с
руками и зубами в придачу. Но все уже выяснилось. Спасибо!

Ответить   Вадим Шешунов Tue, 7 Feb 2006 08:24:43 +0200 (#511921)

 

Здравствуйте, Вадим,

А подробности можно? Хотелось-бы иметь в багажнике!!

Ответить   Tue, 7 Feb 2006 14:18:08 +0500 (#512079)

 

Здравствуйте, Шистеров.

Тогда с самого начала: Имеется список имен tif-картинок (их нужно
распечатать в порядке их перечисления в списке). Вообще-то, есть
программа Image2PDF для создания PDF-документа, но хотелось бы
пронумеровать страницы, растянуть картинки по листу..., а удовольствие
попрограммировать?-))))) Вот я решил загнать в Ворд, как более гибкую
для этого систему, тем более, что опыт взаимодействия с Офисом
кое-какой имеется. А среду выбрал Делфи. Вот и вышло такое:

// Создаем сам объект - переменную для доступа к коллекциям,
// методам, свойствам и событиям Ворда
WD := CreateOLEObject('Word.Application');
// Добавляем новый документ в коллекцию документов
WD.Application.Documents.Add('NORMAL.DOT', FALSE, wdNewBlankDocument, TRUE);

// Выставляем ориентацию листов
if frmOpt.rbBook.Checked then
WD.Application.Selection.PageSetup.Orientation := wdOrientPortrait
else
WD.Application.Selection.PageSetup.Orientation := wdOrientLandscape;

// Вычисляем размеры "печатной" области листа
Height := WD.Application.Selection.PageSetup.PageHeight-
WD.Application.Selection.PageSetup.BottomMargin-
WD.Application.Selection.PageSetup.TopMargin; // в точках
Width := WD.Application.Selection.PageSetup.PageWidth -
WD.Application.Selection.PageSetup.RightMargin-
WD.Application.Selection.PageSetup.LeftMargin; // в точках

// Берем имена файлов картинок, и сами картинки растягиваем по
// печатной облсти
for i := 0 to lbx.Items.Count-1 do
begin
lbx.ItemIndex := i;
// Вставляем картинку как графический объект с получением
// доступа к его свойствам
s := WD.Application.Selection.InlineShapes.AddPicture(dlbx.Directory+'\'+lbx.Items[i],
False, True);
// Теперь в полях s - свойства
// Выключаем пропорциональную растяжку
s.LockAspectRatio := False;
// Установим размеры картинки
s.Height := Height-20;
s.Width := Width-5;

// Если еще будут картинки, вставить разрывы страниц
if i < lbx.Items.Count-1 then
WD.Application.Selection.InsertBreak(wdPageBreak);
end;

if frmOpt.chbNumOn.Checked then
begin
// Вставляем в колонтитулы номер листа
if frmOpt.cmb.ItemIndex <= 1 then
// ... либо в верхний колонтитул
s := WD.Application.Selection.Sections.Item(1).Headers.
Item(1).PageNumbers.Add(wdAlignPageNumberLeft, frmOpt.chbFirstPg.Checked)
else
// ... либо в нижний
s := WD.Application.Selection.Sections.Item(1).Footers.
Item(1).PageNumbers.Add(wdAlignPageNumberLeft, frmOpt.chbFirstPg.Checked);

// s открывает доступ к св-м номера страницы
// Позиционируем номер на странце
if Byte(frmOpt.cmb.ItemIndex) in [0,2] then
s.Alignment := wdAlignPageNumberLeft
else
s.Alignment := wdAlignPageNumberRight;
end;

// Сохраняем док
WD.Application.ActiveDocument.SaveAs(dlbx.Directory+'\'+edtFName.Text);

// Показываем его, если юзер захотел
WD.Application.Visible := frmOpt.chbOpen.Checked;
// Иначе закрываем без сохранения
if not frmOpt.chbOpen.Checked then
WD.Quit(wdDoNotSaveChanges, wdWordDocument, True);
// При желании отпечатаем
if frmOpt.chbPrint.Checked then
WD.ActiveDocument.PrintOut(EmptyParam);
// И высвободим связь с Вордом
WD := Unassigned;

Несколько замечаний:
1. По Ворду "плавать" можно много и долго. Потому нужно иметь под
рукой файл VBAWRD?.CHM (? - это номер в зависимости от версии Офиса).
Там описано все, что интересно в Ворде с точки зрения его
возможностей, как СОМ.
2. Можно писать просто WD, а не WD.Application, это, как я понял, в
нашем контексте одно и то же. Но для полноты картины я писал
WD.Application.
3. Тот случай, что я описываю, является каплей в Ваш багажник. Вы в
этом убедитесь, взглянув на тот самый VBAWRD?.CHM.

Ответить   Вадим Шешунов Wed, 8 Feb 2006 14:13:51 +0200 (#512412)

 

Вадим Шешунов пишет:

А решение можно озвучить?

Ответить   Oleg Ponomarev Tue, 07 Feb 2006 09:08:47 +0200 (#512661)