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Мегабайта.




Комментарии:
  1 2 34567
Предыдущая страница Следующая страница
[14.05.2017 16:48] DonaldBup
<a href=https://mobileapkworld.com/>new game apk legit </a>
<a href=" https://mobileapkworld.com/ ">android apk download free </a>
[27.03.2017 14:04] ibEnals
viagra online
[03.03.2017 03:41] VikaVirtyCymn
Good morning!!
I'm hottie babe  
For you my services webcam videochat live webcam free online))) My skype: vikavirtxxx or go directly to chatroom: <a href=https://www.google.com/?gfe_rd=cr&gws_rd=cr,ssl#newwindow=1&q=bestpornclub>https://www.google.com/?gfe_rd=cr&gws_rd=cr,ssl#newwindow=1&q=live+webcam+sex</a>
I'm waiting for you boys and girls!



P.S.
homemade porn webcams — it's ok))
[20.02.2017 05:28] Dashaoa
Доброго времени суток предлагаю вам обратить внимание на материал по теме: Работа в интернете без вложений
Это подойдет Всем, кто хочет заработать в интернете онлайн например на дому для мам в декрете, домохозяек — совмещение. Или людям кто ищет работу удаленную онлайн.
Переходите по ссылке ниже и узнаете все подробности
Заработать онлайн fas.st/VPUID
[13.02.2017 08:41] TaxiUber
Привет Всем!
Наш таксопарк приглашает водителей к сотрудничеству‚ основная масса заказов собрана именно в Uber

<a href=https://partners.uber.com/i/m7yr9ue>Регистрация в Uber — жми</a>

Мы предлагаем:
-Подработку или как основной вид заработка;
-Гарантированный поток заказов‚ круглосуточно;
-Удобная и простая система заказов;
-Средней доход до 100 000 руб./месяц;
-Свободный график работы;
-Автоматическое распределение заказов;
-Бесплатное обучение‚ возможность начать выполнять заказы сразу после подключения.

Звоните и пишите‚ всегда рады помочь в трудоустройстве!

Можете самостоятельно зарегистрироваться в Uber https://partners.uber.com/i/m7yr9ue


По всем вопросам звоните ежедневно с 10:00 до 17:00!
8-800-333-04-42 (звонок бесплатный)
[11.02.2017 15:18] spavelVes
Наш сервис предоставляет настоящие лайки на фотографии заказчиков, которые готовы платить за качество.

Именно для этого мы и набираем удалённых сотрудников, которые будут выполнять работу, то есть ставить лайки и зарабатывать за это деньги.

Чтобы стать нашим удалённым сотрудником и начать ставить лайки, зарабатывая при этом 45 рублей за 1 поставленный лайк,

достаточно просто зарегистрироваться на нашем сервисе. > www.like.zarplatt.ru <

Вывод заработанных средств ежедневно в течении нескольких минут.
[04.02.2017 20:21] negorVes
Интересная работа или подработка в домашних условиях.
Мы предлагаем: Достойная зарплата без задержек, справка 2-НДФЛ, карьерный рост, бесплатное обучение,
свободный график, страховые взносы в Пенсионный фонд, официальный договор (по желанию).
График Вашей работы, Вы устанавливаете самостоятельно, в пределах Ваших возможностей.
Ваш возраст и образование значения не имеют.
Обязательные условия: наличие компьютера и интернета.
Ваши действия:
1. На сайте (off-rabota.tk) скачайте и установите приложение.
2. Ознакомьтесь с содержимым.
3. Пройдите несложную регистрацию.
4. Обязательно, пройдите курсы обучения. (Бесплатно)
5. Начинайте зарабатывать!
Зарплату мы перечисляем только на банковскую карту любой платёжной системы.
(Для работы советуем оформить отдельную карту)
ВНИМАНИЕ! Весь процесс регистрации, обучения совершенно бесплатны. Не попадитесь в руки мошенников!

 — -JGHHJ16FU16G1U6F51J6F1J6R1UY6F5Y — -
[31.01.2017 04:13] lenvlas2
Хотите

Настоящее продвижение — хорошие беки с тИЦ от +1000

подробно можете узнать тут

https://goo.gl/pGgUOx#272
[24.01.2017 01:30] Shawnbeisa
Christmas Piano
Christmas Background Music
Perfect instrumental background music for romantic and sentimental films, presenting your business, new products or your company in general with an optimistic and motivational touch.
Visit site: https://audiojungle.net/item/christmas-piano/19056234/
Twitter @esif22 https://twitter.com/esif22/status/805286803875958784
[23.01.2017 09:39] Shawnbeisa
Christmas Piano
Christmas Background Music
Perfect instrumental background music for romantic and sentimental films, presenting your business, new products or your company in general with an optimistic and motivational touch.
Visit site: https://audiojungle.net/item/christmas-piano/19056234/
Twitter @esif22 https://twitter.com/esif22/status/805286803875958784
[09.01.2017 18:49] MihailHox
Накопить на крутой складной велик всего-лишь за 396 русских рублей — легко — переходи и регистрируйся быстрее!! -> https://goo.gl/GL2phw
[03.01.2017 17:09] buy viagra online
I’m not positive where you are getting your information, however great topic. I must spend a while finding out much more or figuring out more. Thanks for wonderful information I was searching for this info for my mission.
[url=https://ibuyjunkvehicles.com/] buy viagra online [/url]
[03.01.2017 17:09] buy viagra
One thing I'd prefer to say is the fact that before purchasing more laptop or computer memory, consider the machine directly into which it could be installed. In the event the machine is usually running Windows XP, for instance, the particular memory ceiling is 3.25GB. Putting in over this would simply constitute any waste. Be sure that one's mother board can handle an upgrade quantity, as well. Good blog post.
[url=https://ibuyjunkvehicles.com/] buy viagra [/url]
[01.01.2017 02:25] Shahmatovmet
Р¡Р»С‹С€Р°Р»Р°, С‡С‚Р¾ есть С‚Р°РºР¾Р№ С„РёР»СЊР¼ "РњР¾Р»Р¾Р´Р° Рё РїСЂРµРºСЂР°СЃР½Р°", Р½Р°Р·Р&;Р°Р½РёРµ Р&;СЂР¾Р´Рµ РёР½С‚РµСЂРµСЃР½Р¾Рµ Рё СѓР&;Р»РµРºР°С‚РµР»СЊР½Р¾Рµ, Р° Р&;Р¾С‚ Р½Р°СЃС‡РµС‚ СЃР¾Р´РµСЂР¶Р°Р½РёСЏ СЏ Р½Рµ Р·Р½Р°СЋ. Рђ Р&;С‹ Р½Рµ РїР¾Р´СЃРºР°Р¶РµС‚Рµ, СЃС‚Р¾РёС‚ ли РµРіР¾ Р&;Р¾Р¾Р±С‰Рµ СЃР¼Р¾С‚СЂРµС‚СЊ?
[10.12.2016 04:39] fcTRfqGAUXgdWBVnNrA
doors.txt;2;4
  1 2 34567
Предыдущая страница Следующая страница

Добавить

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


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