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 23456
Следующая страница
[23.06.2017 13:29] WilliamArist
?Software Essay
Moreover to the essay included with the Ordinary Software and as part of Villanova's Member Section of your Basic Software, Villanova requires that you just post a person Villanova Essay (of 250-1000 words for each the Normal Software guidelines) from the three choices below. This essay is definitely an important part of your software as it offers us using an opportunity to gain further insights into your candidacy. Please note: the Villanova Essay should have a separate and distinctive response to that in the Usual Software Essay.
Villanova Essay Prompts (2016-17)
Option 1: At Villanova, we believe that it is our similarities that make us good, but our differences that make us stronger. Please tell us about a relationship you have with someone who is different from you and how that has changed who that you are today.
Option Two: "Become what you're not yet" — Saint Augustine Should you daydream, who do you hope to become around the long term?
Option Three: Describe a book, movie, song or other do the job of art that is significant to you since you ended up young and how its meaning has changed for you as you have grown.
Well-known Software Essay:
Please also post the essay of your choice from the Commonplace Software.
Tips For Crafting Your Essay
Be Yourself. Through the essay, the Admission Committee is hoping to get to know you even better. You may be so considerably a lot more than just your grades and examination scores. Your essay offers a perspective into your thoughts, opinions, hopes and dreams.
Proof Learn. A well-crafted essay usually has the majority of revisions. Please overview your content and edit your do the job before you post it for consideration.
Answer the question posed. Please answer the question that we pose. It may be tempting to send a general or personal statement, notably if time is ticking; however, it is important for you to definitely respond to our special question.
There may be not a correct or incorrect answer to the question. The Admission Committee is not really necessarily wanting for what you say, but rather how you say it. We desire to see you make a thesis statement and defend it. We just want to see you use useful grammar, spelling and punctuation. Overall, we aspire to see a thoughtful and well-written essay. It should be clear to us that the candidate has put significant effort into the composition with the essay.
Remember, your essay can really enhance your software. We start looking forward to reading your essay!
Admission
Maybe it is the rigorous academics and personalized learning. Maybe it is the Augustinian Catholic guideposts of truth, unity and love. Maybe it is the 250,000 hours of once-a-year community company. Or maybe it is the whole package of distinctive functions that makes Villanova a special place-a put that stands out and stands apart; a site that attracts students who desire to think critically, act compassionately and succeed whilst serving others.
Social Media Links
[17.06.2017 14:01] Donaldmn
Hello))) I have such a situation, a shortage of money to buy a car. I have a bad credit history. I would like to know the opinion of Internet users loans — where better to take a loan. please advise. use the search engine Google, did not inspire confidence. Please give a link and description of the company, which can provide 100% loan for those with bad credit history Thanks in advance
[16.06.2017 07:47] MichaelSpact
fx-brokers-review.com/index_bg.html Форекс брокери анализ и рейтинг
[13.06.2017 19:51] AUToccunk
Интернет магазин запчастей для автомобилей autocomponent63.ru — это качественные комплектеющие, высокого уровня специалисты и удобность заказа. Потребность купить запчасти для иномарок возникает время от времени, ведь машины изнашиваются по частям. И с этим согласятся все владельцы авто. Рынок автозапчастей сегодня – пестр и просторный, с этим также все соглашаются. Именно из-за этого подбор запчастей для иномарок как и поиск запчастей по авторазборам может вызвать трудности. Но только не для тех, кто обратился в наш магазин запчастей для авто autocomponent63.ru. Если Вы ищете автозапчасти, аналоги автозапчастей для иномарок, авторазбор для иномарок, недорогие запчасти для иномарок, автозапчасти Кинель, автозапчасти Самара – считайте, Вам повезло. Каталог запчастей для иномарок на сайте нашего магазина – прост и понятен. К тому же, здесь к Вашему вниманию широкий ассортимент. Единственное, чего чего Вы у нас не увидите – это б/у запчасти для иномарок и детали сомнительного происхождения, поскольку мы гарнтируем качество. Не нужно больше спрашивать у поисковика, где найти автозапчасти официальный сайт, то, что Вам нужно – это autocomponent63.ru.
Авто запчасти: <a href=https://autocomponent63.ru>интернет Магазин запчастей</a>
[13.06.2017 02:00] Kevincus
<a href=https://freecasinoslotgamesxl.com/>casino slot games </a>
slot machine games
<a href=" https://freecasinoslotgamesxl.com/ ">casino slot games free </a>
slot games free with bonus
[12.06.2017 23:33] Kevincus
<a href=https://freecasinoslotgamesxl.com/>free online slot games </a>
free slot games
<a href=" https://freecasinoslotgamesxl.com/ ">free slot machine games casino </a>
free slot games no download
[07.06.2017 12:33] Lancecom
Объединение «Мосэлектротягстрой» — один из старейших и всего один из в настоящее время существующих солидных строительных трестов Москвы.

Среди лидирующих проектов — перестройка Казанского вокзала, сооружение сооружения Совета Федерации ФС РФ, наикрупнейшей в Европе сортировочной станции «Бекасово», здание Правительства Московской Области, масштабные объекты в интересах Минобороны и МЧС России.

К настоящему времени Трестом введено большое количество жилых домов в Москве и Подмосковье, а кроме того прочих российских областях — Ярославле, Рязани, Костроме, Калуге и прочих.

В состав компании входит 12 подразделений, ремонтная база, автобаза, завод по изготовлению сухих смесей и завод ЖБИ, размещенных на территории Москвы, Московской, Костромской и Владимирской областях. На этот момент времени “Мосэлектротягстрой” возводит примерно 30 объектов производственного, транспортного и гражданского типа на территории европейской части РФ.


[04.06.2017 14:09] WilliamMoomb
<a href=https://carinsurancefloridafxp.com/>car insurance lakeland florida</a><a href=https://classiccarinsurancermm.com/>is classic car insurance cheaper</a><a href=https://carinsurancefloridafxp.com/>car company florida in insurance</a><a href=" https://classiccarinsurancermm.com/ ">fiat coupe classic car insurance</a><a href=" https://howmuchiscarinsurance17.com/ ">how much is car insurance in ohio</a><a href=" https://howmuchiscarinsurance17.com/ ">how much is mexican car insurance per day</a>
[04.06.2017 14:09] Scottcinty
<a href=https://cheapcarinsurancexs.com/>full coverage car insurance cheap</a><a href=https://carinsurancequotesfx.com/>car insurance quotes houston tx</a><a href=https://carinsurancecompaniesmml.com/>reasonable car insurance companies</a><a href=" https://carinsurancecalculatorlms.com/ ">how much car insurance do i need calculator</a><a href=" https://carinsurancecalculatorlms.com/ ">rough car insurance calculator</a><a href=" https://carinsurancequotesfx.com/ ">ohio car insurance quotes</a>
[04.06.2017 11:00] WilliamMoomb
<a href=https://classiccarinsurancermm.com/>classic car insurance in arizona</a><a href=https://howmuchiscarinsurance17.com/>how much is the insurance for a car</a><a href=https://carinsurancerates2017.com/>connecticut car insurance rates</a><a href=" https://carinsurancerates2017.com/ ">car insurance rates by location</a><a href=" https://carinsurancerates2017.com/ ">how to compare car insurance rates</a><a href=" https://carinsurancerates2017.com/ ">car insurance rates by state 2014</a>
[04.06.2017 11:00] Scottcinty
<a href=https://carinsurancequotesfx.com/>alabama car insurance quotes</a><a href=https://bestcarinsurancefsx.com/>best car insurance rates in virginia</a><a href=https://bestcarinsurancefsx.com/>best car insurance companies for college students</a><a href=" https://cheapcarinsurancexs.com/ ">california cheap car insurance</a><a href=" https://bestcarinsurancefsx.com/ ">best teen car insurance</a><a href=" https://cheapcarinsurancexs.com/ ">cheap car insurance arkansas</a>
[02.06.2017 18:33] Debraflins
Vous serez considere comme ayant voulu abuser d'une pauvre femme en la reduisant au role de prostituee domestique.
[02.06.2017 11:59] Debraflins
Ils vivent un menage a trois avec l'amiral Nelson. Annonces 100% gratuites, meilleures escort girls a Paris et toute la France.
[30.05.2017 03:30] Apbarrany
Однако, если тебя заинтересует ремонт очистных сооружений для моторного предприятия, пусконаладка городских очистных сооружений, монтаж очистных сооружений района, аудит осадки очистных сооружений, пусконаладка промышленных очистных сооружений, эксплуатация очистных сооружений ливневых стоков, аудит локальных очистных сооружений, то вам нужно обращаться к нам. Многие жители в Красноярске уже оценили ремонт очистных сооружений.. нужно учесть, что в «ЭКО» для модернизации, изготовления и проектирования очистных сооружений используются только высококачественные современные материалы и технологии. Поэтому проектирование очистных сооружений стоков, проектирование биологических очистных сооружений, проектирование очистных сооружений канализации, проектирование очистных сооружений сточных вод, проектирование локальных очистных сооружений, проектирование осадок очистных сооружений с «ЭКО» является обеспечит нужный результат. Специалисты наши специалисты помогут вам со строительством, обслуживанием, проектированием и эксплуатацией очистных сооружений в Ставрополе, а также других регионах России. Добавим также, что спектр услуг «ЭКО» довольно разнообразен.
ЭКО Ставрополь: <a href=https://spb.ecolos.ru/products/bytovye-ochistnye-sooruzheniya/stanciya-biologicheskoj-ochistki/>автономная канализация в тюмени</a>
Очистные сооружения в Санкт-Петербурге — <a href=https://spb.ecolos.ru>очистные сооружения</a>
[14.05.2017 23:13] DonaldBup
<a href=https://mobileapkworld.com/>apk sites </a>
<a href=" https://mobileapkworld.com/ ">free game sites for android </a>
   1 23456
Следующая страница

Добавить

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


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