Templa mentis
Работа   Лирика   Склад   Заметки на полях   
На главнуюКарта сайтаОбратная связь







Самый лучший счетчик в РУнете
Работа /
Учим PHP работать с MS Word посредством JScript

Статья посвящена скрещиванию двух с первого взгляда несовместимых технологий, работающих на разных платформах.

Задача состояла в том, чтобы создать иллюстрированный печатный каталог плакатов с сайта plakaty.ru. Каталог должен был иметь нестандартное содержание, биографии художников, изображения плакатов с идентификационными номерами, названиями, годами публикации и в завершение — алфавитный указатель всего этого добра. Основной проблемой, мешавшей реализовать эту задачу стандартными методами была реализация «печатной» постраничности. Множество экспериментов с попытками сделать это все на уровне HTML, к сожалению, не увенчались успехом. Ну не умеет HTML работать с печатными документами. На мысль попробовать использовать Word через яваскрипт натолкнул Александр Кроч, за что ему отдельное «БОЛЬШОЕ СПАСИБО».

Как оказалось, Word очень прост и легок в использовании в плане взаимодействия с веб приложениями. И как ни странно имеет довольно простой программный интерфейс, API тобиш.

Итак приступим. Ниже представлена общая схема работы нашей монстрообразной конструкции.

Общая схема работы:

PHP взаимодействует с БД, в данном случае MySQL. Используя шаблоны содержащие в себе необходимые куски кода на JScript'е собирает сценарий, пкоторый в последствии запускается на клиентской машине, создает объект MS Word и выполняет все, что задумано. По сути PHP здесь используется в качестве построителя яваскрипта на базе данных из БД. Все нижеописанное будет работать и без него.

Все нижеописанные функции доступны в редакторе макросов ворда, по сути — никто не мешает записать в самом ворде макрос, потом перенести его исходный текст в программную часть и запустить через браузер. Честно говоря таким образом его функции и изучались, потому как в колодце знаний микрософта — MSDN, документация по нему не очень.

Итак, приступим, постараюсь сжато описать основные функции с которыми пришлось столкнуться, так-как много печатать и воду разливать не хочется. Если что-то будет неясно, обращайтесь в фидбек.

/*
Для начала, определим несколько констант, чтобы потом не путаться. Дело в том, что в редакторе макросов MS Word есть так называемый Quick Help который умеет показывать все параметры функций, так вот значения в нем обычно показываются в виде констант, частью которых являются описанные ниже. Можно было-бы определить больше, но острой необходимости в этом не было, да и цифру быстрее написать, чем длиннющую константу.
*/

wdSeekMainDocument = 0;
wdSeekCurrentPageHeader = 9;
wdSeekCurrentPageFooter = 10;
wdToggle = 999998;

// Создание объекта MS Word:
word = new ActiveXObject ("Word.Application");

// Создание документа и установка параметров страницы:
with (word) {
  Documents.Add (); // Создаем документ
// Альтернативой может служить
// Documents.Open ("d:\\ИмяФайла.doc"); // открытие существующего документа

// Selection я так понял основная рабочая область ворда, хотя в объектной модели MS черт ногу сломит.
  with (Selection) {
    ParagraphFormat.TabStops.Add (word.CentimetersToPoints (1.69), 0, 1); // Позиции табов
    PageSetup.LeftMargin = word.CentimetersToPoints (1.59); // Настройки страницы, левый отступ
    PageSetup.TopMargin = word.CentimetersToPoints (2.54); // Настройки страницы, правый отступ
  }

// Двигаемся
// В ворде предусмотрены передвижения по тексту, и каждая описанная ниже операция, будет применяться
// к текущей позиции курсора. Передвижения по тексту производятся программным нажатием кнопок клавиатуры.
Selection.EndKey (6); // жмем End, 6 — Ctrl+End конец документа.
Selection.HomeKey (5); // 5 — строка
// первый параметр юнит, 1-символ, второй параметр — количество, третий — выделять текст или нет
Selection.MoveRight (1, 3, 1);
Selection.MoveLeft (1, 3, 0);
Selection.MoveUp (1, 5);
Selection.MoveDown (1, 5);

// Добавляем нижний колонтитул:
  ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter; // переключаемся на колонтитул
  Selection.Fields.Add (Selection.Range, 33); // 33 — есть номер поля "текущая страница"
  Selection.ParagraphFormat.Alignment = 2; // По правому краю
  ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument; // возвращаемся в документ из области колонтитула

/*
Колонтитулы в ворде не поддаются логике, особенно если у вас несколько разделов и на каждый раздел необходим свой колонтитул, насколько мне удалось их понять, они почму-то строятся в обратном порядке.
Для того чтобы создать разрыв и новый раздел, а на нем колонтитул не наследуемый от предыдущего используется следующая конструкция:
Selection.InsertBreak (2); // Разрыв страницы, 2-новый раздел с текущей страницы

// Не забываем выставить параметры страницы для нового раздела
Selection.PageSetup.LeftMargin = CentimetersToPoints (1.59);
Selection.PageSetup.TopMargin = CentimetersToPoints (2.54);

// Переключаемся на верхний колонтитул
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader;
// Отключаем привязку. Дальше делаем с колонтитулом что хотим.
Selection.HeaderFooter.LinkToPrevious = false;

*/

// Устанавливаем параметры шрифта:
  Selection.Font.Name = 'Arial';
  Selection.Font.Size = '24';
  Selection.Font.Bold = wdToggle; // Переключаем жирность, можно использовать 0 и 1 для вкл/выкл
// У Selection.Font есть еще другие параметры которые описаны в QuickHelp

// Пишем текст:
  Selection.TypeText („Ворд, матерая хреновина!“);

// Жмем Enter (создаем параграф и переводим каретку):
  TypeParagraph ();

// Вставка файла в текст документа выглядит следующим образом
// В качестве источника можно использовать урлы как в этом примере
// Параметры идущие за именем источника я уже не помню, загляните в QuickHelp редактора макросов
  Selection.InsertFile („http://plakaty.ru/index.php“, "", 0, 0, 1);

/*
Учтите то, что при вставке HTMLя с картинками, эти самые картинки будут "подтягиваться"
из источника, Ворд не будет их сохранять в документе, как это обойти выяснить не удалось,
поэтому пришлось пойти на хитрость. Сразу в документ можно поставить метку, потом её найти
и заменить на так называемый InlineShape (внутреннюю картинку) которая сохранится вместе с документом.
Пример:

// Страшный объект поиска по документу
// имеющий кучу бесполезных параметров:)
with (Selection.Find) {
ClearFormatting (); // Очищаем параметры поиска
Text = "#P1#"; // Что ищем
Replacement.Text = ""; // На что заменяем
Forward = true; // В какую сторону ищем
Wrap = 1;
Format = false;
MatchCase = false; // Регистр
MatchWholeWord = false; // Целое слово
MatchWildcards = false;
MatchSoundsLike = false;
MatchAllWordForms = false;
Execute (); // ФАС!
}

// Таки нашли или нет?
if (Selection.Find.Found) {
  // Вставка внутренней картинки на место метки
  Selection.InlineShapes.AddPicture ("d:\\posters\\Картинка.jpg", false, true);
}

*/

// Создаем Оглавление
// Для того, чтобы оглавление у нас не было пустым,
// необходимо задать уровни нужным элементам оглавления
  Selection.Range.Paragraphs.OutlineLevel = 1; // цифра определяет уровень

// Вставляем автооглавление
  ActiveDocument.TablesOfContents.Add (Selection.Range, true, 3, 0);


// Создаем Алфавитный указатель
/*
Следует оговориться, что для алфавитного указателя нужны метки по тексту,
эти метки можно сделать автоматически скормив ворду текстовый файлик
со списком слов которые необходимо пометить, делается это следующим образом:

*/

  with (ActiveDocument) {
    // Собственно файлик списка помечаемых слов
    ActiveDocument.Indexes.AutoMarkEntries ("d:\\concord.txt");

    // Добавляем алфавитный указатель
    Indexes.Add (Selection.Range, 0, 0, false, 1, 2, 0,1049);

    // Назначаем ему кучу всяких бесполезных параметров:)
    Indexes (1). HeadingSeparator = 2;
    Indexes (1). Type = 0;
    Indexes (1). RightAlignPageNumbers = true;
    Indexes (1). NumberOfColumns = 2;
    Indexes (1). TabLeader = 1;
  }

// Запись документа
  ActiveDocument.SaveAs ("d:\\MyDoc.doc");
  Quit (); // завершает работу MS Word
}

На этом в принципе и закончим, тема раскрыта, все остальное увлеченному человеку не составит труда изучить самостоятельно. Будут вопросы — пишите, постараюсь ответить.

P.S.
650 страниц каталога плакатов, сделанного по вышеописанной технологии лопатились на P4, 2.8GHz, 512 RAM около получаса, в принципе терпимо, если учесть общее количество непростых операций по сборке нестандартного содержания и вставки картинок. В результате получился нескромный файлик в 42Мегабайта.




Комментарии:
  123 4 56789
Предыдущая страница Следующая страница
[26.10.2016 14:15] Buy Levitra
Hello! Good site, you can buy levitra cheaper!
[26.10.2016 08:06] Buy Levitra
Hello! Good site, you can buy levitra cheaper!
[26.10.2016 04:53] Zithromax
el1202 Hello, pure situate! As a consequence of you as your time! fu215hu3731ud3447
[26.10.2016 03:55] Zithromax
hb4738 Hello, good plot! Gratefulness you payment your things! hm2687pt3205wc350
[27.08.2016 14:02] JacindaSn
<b> Stray homeless dogs need your help!</b>


<b>All information is here: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
We are volunteers in the charitable organization in Ukraine. We help stray dogs and homeless animals. Sterilization and treatment of stray dogs — our main goal. We rescue injured animals. In order to limit the population of stray dogs we use only sterilization. Captured and sterilized animals get a special collar. People know that a dog with a collar safe and sterilized. Often there is a need for treatment of stray animals and we do it.
Many nice people help us. However, we do not have enough money. All our money spent for catching, transportation, sterilization and food for stray animals. Veterinary services are very expensive and we do not always have enough money.
Our government is not ready to cover all the expenses for homeless animal’s needs. We constantly looking into all ways possible to engage any additional funds. For about every 1000$ we can help to 50 stray dogs. This includes neutering, anti-parasite treatment, other medical help needed so the stray animal would be healthy, clean and ready for adoption.
Please help us to save stray dogs.

<b>That is for what we need money:</b>

1) Food for dogs
2) Transportation
3) Medications
4) Veterinary services
5) Treatment
6) Sterilization
We would not have asked for your help, if it was not so important.
Please help us to make our purpose in life to real.

<b>Other Ways You Can Help:</b>

If you are not able to donate, please share the link to this page with your friends and family to help spread the word. The more people who see this, the more chances to achieve our goal.
Please also share this page via social media.

<b>Don’t be indifferent!
We appreciate for every dollar.
Thank you very much!</b>
<b>
Please share This libk: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
[27.08.2016 12:14] JacindaSn
<b> Stray homeless dogs need your help!</b>


<b>All information is here: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
We are volunteers in the charitable organization in Ukraine. We help stray dogs and homeless animals. Sterilization and treatment of stray dogs — our main goal. We rescue injured animals. In order to limit the population of stray dogs we use only sterilization. Captured and sterilized animals get a special collar. People know that a dog with a collar safe and sterilized. Often there is a need for treatment of stray animals and we do it.
Many nice people help us. However, we do not have enough money. All our money spent for catching, transportation, sterilization and food for stray animals. Veterinary services are very expensive and we do not always have enough money.
Our government is not ready to cover all the expenses for homeless animal’s needs. We constantly looking into all ways possible to engage any additional funds. For about every 1000$ we can help to 50 stray dogs. This includes neutering, anti-parasite treatment, other medical help needed so the stray animal would be healthy, clean and ready for adoption.
Please help us to save stray dogs.

<b>That is for what we need money:</b>

1) Food for dogs
2) Transportation
3) Medications
4) Veterinary services
5) Treatment
6) Sterilization
We would not have asked for your help, if it was not so important.
Please help us to make our purpose in life to real.

<b>Other Ways You Can Help:</b>

If you are not able to donate, please share the link to this page with your friends and family to help spread the word. The more people who see this, the more chances to achieve our goal.
Please also share this page via social media.

<b>Don’t be indifferent!
We appreciate for every dollar.
Thank you very much!</b>
<b>
Please share This libk: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
[25.08.2016 01:59] Selenabeex
<b> Stray homeless dogs need your help!</b>


<b>All information is here: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
We are volunteers in the charitable organization in Ukraine. We help stray dogs and homeless animals. Sterilization and treatment of stray dogs — our main goal. We rescue injured animals. In order to limit the population of stray dogs we use only sterilization. Captured and sterilized animals get a special collar. People know that a dog with a collar safe and sterilized. Often there is a need for treatment of stray animals and we do it.
Many nice people help us. However, we do not have enough money. All our money spent for catching, transportation, sterilization and food for stray animals. Veterinary services are very expensive and we do not always have enough money.
Our government is not ready to cover all the expenses for homeless animal’s needs. We constantly looking into all ways possible to engage any additional funds. For about every 1000$ we can help to 50 stray dogs. This includes neutering, anti-parasite treatment, other medical help needed so the stray animal would be healthy, clean and ready for adoption.
Please help us to save stray dogs.

<b>That is for what we need money:</b>

1) Food for dogs
2) Transportation
3) Medications
4) Veterinary services
5) Treatment
6) Sterilization
We would not have asked for your help, if it was not so important.
Please help us to make our purpose in life to real.

<b>Other Ways You Can Help:</b>

If you are not able to donate, please share the link to this page with your friends and family to help spread the word. The more people who see this, the more chances to achieve our goal.
Please also share this page via social media.

<b>Don’t be indifferent!
We appreciate for every dollar.
Thank you very much!</b>
<b>
Please share This libk: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
[22.08.2016 04:27] Fctorfrot
Зарабатывай с нами уже завтра! Гарантированные выплаты каждый день! Стабильный заработок 2.5-3% в день!
Регистрируемся https://rns-group.org/ref/vovka002
.
[18.08.2016 03:56] Charlespi
<b> Stray homeless dogs need your help!</b>


<b>All information is here: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
We are volunteers in the charitable organization in Ukraine. We help stray dogs and homeless animals. Sterilization and treatment of stray dogs — our main goal. We rescue injured animals. In order to limit the population of stray dogs we use only sterilization. Captured and sterilized animals get a special collar. People know that a dog with a collar safe and sterilized. Often there is a need for treatment of stray animals and we do it.
Many nice people help us. However, we do not have enough money. All our money spent for catching, transportation, sterilization and food for stray animals. Veterinary services are very expensive and we do not always have enough money.
Our government is not ready to cover all the expenses for homeless animal’s needs. We constantly looking into all ways possible to engage any additional funds. For about every 1000$ we can help to 50 stray dogs. This includes neutering, anti-parasite treatment, other medical help needed so the stray animal would be healthy, clean and ready for adoption.
Please help us to save stray dogs.

<b>That is for what we need money:</b>

1) Food for dogs
2) Transportation
3) Medications
4) Veterinary services
5) Treatment
6) Sterilization
We would not have asked for your help, if it was not so important.
Please help us to make our purpose in life to real.

<b>Other Ways You Can Help:</b>

If you are not able to donate, please share the link to this page with your friends and family to help spread the word. The more people who see this, the more chances to achieve our goal.
Please also share this page via social media.

<b>Don’t be indifferent!
We appreciate for every dollar.
Thank you very much!</b>
<b>
Please share This libk: <a href=https://www.indiegogo.com/project/preview/53a27324>https://igg.me/at/dogs-in-need/x</a></b>
[05.07.2016 03:40] Lucillesi
The internet has made it easy to download just about any song you want for free, but frankly, illegally downloading music just isn’t an option if you’re the honest type looking to support the artists and producers who enrich our lives.

<a href=https://candyred.eu>More info free music downloading</a>

<a href=https://candyred.eu/10-sites-for-free-legal-music-downloads/>Free music download</a>
[02.07.2016 10:40] Unknown
Unknown message
[30.06.2016 04:58] baibBanteevak
Алексей Кузьменко — директор и весь персонал компании SMART Media (Казахстан),
принимает заказы на WhatsApp рассылку, размещение рекламы, и создание сайтов.
На самом деле гражданин Кузьменко, к оказанию этих услуг ни имеет никакого отношения,
все заказы передает в биржи фрилансеров и нагло обманывает исполнителей и заказчиков.
Казахстан
Город: Павлодар
ул. Ломова 21, 11
тел: +7 777 785 62 74, +7 707 60 77 500
Skype: alexsei-92
Будьте внимательны, аферист и мошенник!
[21.06.2016 01:01] Geralyn
Thanks for corinibuttng. It's helped me understand the issues.
[21.06.2016 00:56] Cornelia
Your answer shows real inilgetlence.
[21.06.2016 00:55] Chaas
You are so awesome for helping me solve this myteyrs.
  123 4 56789
Предыдущая страница Следующая страница

Добавить

Ваше имя: 
 
Ваш e-mail: 
:-)  =)  :-(  ;-)  :-P  :'-(  :+)  :-/  :-}  :-{}  :*)  8-)  
:-D  :-@  :-X  :-|  :-!  :-O  ]:-]  @}=--  @=  (#)  }-|  I-)  


© 2002—2005 Sharky
Сделано в подполье студии «Вито»