[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: генерация rtf документа из ШАБЛОНА
zvezda_t
Здравствуйте!
Не работает подставка значений в заменител (<<name>>):

  //выбор приложения для визуализации
header('Content-Type: application/msword');
header('Content-Disposition: inline, filename=cert.rtf');

$name1="Ivan";

//открыть файл шаблона
$filename = 'PHPCert.rtf';
$output = file_get_contents($filename);

//замена заполнителей в шаблоне
$output = str_replace("<<name>>",$name1,$output);

//отправить сгенерированный документ в браузер
echo $output;

Но вообще то изначально у меня обычный вордовский документ... Вот как мне в него вставить данные из БД?



Спустя 2 минуты, 15 секунд (15.09.2010 - 09:01) Basili4 написал(а):
в $name1 у тебя что ?

Спустя 4 минуты, 23 секунды (15.09.2010 - 09:05) zvezda_t написал(а):
$name1="Ivan";

Спустя 12 минут, 13 секунд (15.09.2010 - 09:17) Basili4 написал(а):
zvezda_t
в коде где ???
в упор не вижу $name1="Ivan";

У себя проверил у меня <<name>> меняется в путь.

т.е. возможно $output пустая.

Спустя 1 час, 39 минут, 44 секунды (15.09.2010 - 10:57) zvezda_t написал(а):
почему пустая? как правильно то сделать?

Спустя 26 минут, 36 секунд (15.09.2010 - 11:24) Basili4 написал(а):
zvezda_t
просто выведи её

echo $output;

если будет тест выведен то надо думать


Но чудес не бывает не может функция не срабоать в этом случае str_replace("<<name>>",'Иван','sdsdsf <<name>> afsdfdsf ');

Ты бьешся головой об стену причем не в том месте.

я могу предположить что $output; пустая в $filename не правильный путь.


Посему проверяй содержимое $output; и если в нем будет под строка <<name>> и str_replace не сработает , я пойду искать другую работу....



Спустя 2 часа, 45 минут, 42 секунды (15.09.2010 - 14:09) Krevedko написал(а):

$output = file_get_contents($filename);
echo $output;
die();
//замена заполнителей в шаблоне


что выводит ?

Спустя 16 часов, 14 минут, 1 секунда (16.09.2010 - 06:23) zvezda_t написал(а):
Krevedko
Цитата
что выводит ?

выводит что то в этом духе - но свой заменитель я там не вижу...
Цитата
{\rtf1\ansi\ansicpg1251\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1049\deflangfe1049{\fonttbl{\f0\froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\f1\fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial;}{\f2\fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f35\fswiss\fcharset204\fprq2{\*\panose 020b0604030504040204}Tahoma;} {\f36\fmodern\fcharset0\fprq1{\*\panose 02060609020000020004}Consultant{\*\falt Courier New};}{\f72\froman\fcharset0\fprq2 Times New Roman;}{\f70\froman\fcharset238\fprq2 Times New Roman CE;}{\f73\froman\fcharset161\fprq2 Times New Roman Greek;} {\f74\froman\fcharset162\fprq2 Times New Roman Tur;}{\f75\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f77\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f78


Может мне не использовать rtf?
У меня обычный вордовский документ - как мне туда вставить данные из БД?

Спустя 3 часа, 27 минут, 43 секунды (16.09.2010 - 09:51) Krevedko написал(а):
ну еще бы. ворд -это тебе не txt.

Цитата
У меня обычный вордовский документ - как мне туда вставить данные из БД?


Открываешь документ в ворде. Правка-Заменить.

Спустя 1 час, 14 минут, 21 секунда (16.09.2010 - 11:05) zvezda_t написал(а):
Цитата
Открываешь документ в ворде. Правка-Заменить.

это юмор такой? mad.gif
у меня данные в БД SQL, там тысячи записей...
мне нужно с помощью php открыть мой шаблон - документа Word и вставлять данные... неужели никто такого не делал? unsure.gif

Спустя 14 минут, 13 секунд (16.09.2010 - 11:20) twin написал(а):
А документ загружается или шаблон на сервере?

Спустя 1 час, 45 минут, 7 секунд (16.09.2010 - 13:05) Krevedko написал(а):
Цитата (zvezda_t @ 16.09.2010 - 08:05)
Цитата
Открываешь документ в ворде. Правка-Заменить.

это юмор такой? mad.gif
у меня данные в БД SQL, там тысячи записей...
мне нужно с помощью php открыть мой шаблон - документа Word и вставлять данные... неужели никто такого не делал? unsure.gif

в txt сохрани rtf и правь себе

а если хочется извратиться, читай здесь :

http://habrahabr.ru/blogs/php/70119/

Спустя 6 минут, 8 секунд (16.09.2010 - 13:11) zvezda_t написал(а):
Цитата
А документ загружается или шаблон на сервере?

Шаблон на сервере

Спустя 2 минуты, 42 секунды (16.09.2010 - 13:14) Krevedko написал(а):
я дал тебе ссылку, где подбробно написано как вытащить текст из rtf
+ приложена готовая функция на пхп.

Спустя 1 час, 10 минут, 31 секунда (16.09.2010 - 14:24) Krevedko написал(а):
Текст любой ценой: RTF
Что ж продолжим наши изыскания на предмет получения текста из различных форматов данных. Не так давно мы с вами научились вытаскивать текст из zipped-xml-based файлов (odt и docx), а также, в начале этой недели, из pdf. Сегодня мы продолжим с обещанным rtf.

Rich Text Format (он же rtf), вы могли бы подумать, достаточно забытый, хотя и не очень сложный формат представления текстовых данных. Что ж, относительно несложный для получения текста, но за свою историю: от своей первой версии до текущей 1.9.1 — он приобрёл под 300 страниц официально документации и огромное количество надстроек, которые в большей степени нам будут мешать при получении plain text'а. Попробуем их обойти...


А что там внутри?

Как уж повелось давайте заглянем вовнутрь rtf-файла и посмотрим, что там внутри:
---тут была картинка---


Что мы видим? Я вижу наше любимое стихотворение «Парус». Мы видим изначально текстовый 8-битный формат данных. Это уже радует — когда в исходных данных текст, понимать, что происходит, гораздо проще. Теперь давайте разберёмся, как эти самые данные прочитать. Для этого я расскажу немного теории по теме.

Будем считать, что rtf состоит из управляющих слов, которые могут быть сгруппированы во вложенные множества. Управляющие слово начинается на обратный слэш (\), группа обёрнута в фигурные скобки ({ и }).

Управляющие слово состоит из последовательности букв английского алфавита (от a до z) и может быть завершено численным параметром (возможно отрицательным). Как вариант, слово может содержать один не цифро-буквенный ascii-символ. Всё, что не подпадает под эти правила, не является частью управляющего слова. Таким образом, последовательность вида \rtf1\ansi\ansicpg1251 без проблем делится на три слова rtf с параметром 1 (major-версия формата), ansi (текущая кодировка) и ansicpg с параметром 1251 (текущая кодовая страница под номером 1251 — т.е. Windows-1251).

Группированные множества определяют область действия управляющих слов. Таким образом, управляющие слова описанные внутри фигурных скобок работают только внутри них и всех дочерних подмножеств. Для того, чтобы правильно отработать какие слова имеют место сейчас — требуется вести стек управляющих слов. При открытии фигурной скобки создавать новый элемент-массив в стеке, в который сразу же добавлять данные предыдущего слоя стека, при закрытии скобки — удалять самый верхний слой.

Ещё стоит отметить, что некоторые управляющие слова могут быть закрыты с помощью добавления параметра ноль, а не создания новой подгруппы. Например, следующие варианты эквивалентны: This is {\b bold} text, This is \b bold \b0 text = This is bold text.


Откуда брать текст?

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

Во-первых, стоит отметить, что исходная кодировка rtf-файла — это ANSI, поэтому без всякий изысков сохранится только, английский текст. Нас же интересует, как минимум, русский текст, а ещё лучше Unicode, не так ли? Что правда, то правда — rtf хоть и старый формат, но сгодится на сохранение и того и другого.

Итак, в rtf'е есть возможность использования второй половины таблицы ASCII, та что от 128 и выше. С учётом текущей кодировки (выше управляющее слово \ansicpg), конечно же. Для этого в RTF была введена последовательность вида \'hh, где hh — это двоичный hex-код символа из таблицы ASCII.

Ну и второй, более интересный вариант, это unicode-кодированные данные. Для них в формат включено лаконично короткое ключевое слово \uABCD с цифровым параметром ABCD. ABCD в данном случае код unicode-символа в десятичной системе счисления. Всё опять просто, как вы могли заметить.

Просто, да не очень. В rtf существует ещё одно ключевое слово \ucN, которое тесно связано с Unicode. Дело в том, что формат RTF очень рьяно поддерживает совместимость со старыми устройствами, на которых возможно придётся открывать данный файл. Как вариант, подобное устройство (ну например компьютер с Windows 3.11 smile.gif не сможет прочитать Unicode, что ему делать? Для этого после каждого unicode-символа, шифрованного ключевым словом \u может быть указано от нуля до нескольких символов, которые должны быть отображены в случае, если rtf-viewer не способен отобразить или разобрать текущие данные (по документации, если просмотрщик не может отобразить верно данные, он должен их пропустить).

В связи с этим, большинство современных редакторов после unicode-управляющего слова ставят символ вопроса, как знак, что требуется показать вместо текущего символа. Но возможны и варианты, например: Lab\u915GValue. Зададимся вопросом — сколько символов требуется отобразить, если нет возможности показать Unicode. Всё опять же не очень сложно — указанное выше ключевое слово \ucN в качестве параметра N как раз и предоставляет это значение. Т.е. перед Unicode-данными обязательно появится что-то типа \uc1, что скажет нам пропустить один символ после unicode'а.


Давайте почитаем!

Похоже, что накопленных нами данных будет достаточно, чтобы прочитать наши первые rtf-файлы. Поехали:


1.function rtf_isPlainText($s) {
2. $failAt = array("*", "fonttbl", "colortbl", "datastore", "themedata");
3. for ($i = ; $i < count($failAt); $i++)
4. if (!empty($s[$failAt[$i]])) return false;
5. return true;
6.}
7.function rtf2text($filename) {
8. $text = file_get_contents($filename);
9. if (!strlen($text))
10. return "";
11. $document = "";
12. $stack = array();
13. $j = -1;
14. for ($i = ; $i < strlen($text); $i++) {
15. $c = $text[$i];
16. switch ($c) {
17. case "\\":
18. $nc = $text[$i + 1];
19. if ($nc == '\\' && rtf_isPlainText($stack[$j])) $document .= '\\';
20. elseif ($nc == '~' && rtf_isPlainText($stack[$j])) $document .= ' ';
21. elseif ($nc == '_' && rtf_isPlainText($stack[$j])) $document .= '-';
22. elseif ($nc == '*') $stack[$j]["*"] = true;
23. elseif ($nc == "'") {
24. $hex = substr($text, $i + 2, 2);
25. if (rtf_isPlainText($stack[$j]))
26. $document .= html_entity_decode("&#".hexdec($hex).";");
27. $i += 2;
28. } elseif ($nc >= 'a' && $nc <= 'z' || $nc >= 'A' && $nc <= 'Z') {
29. $word = "";
30. $param = null;
31. for ($k = $i + 1, $m = ; $k < strlen($text); $k++, $m++) {
32. $nc = $text[$k];
33. if ($nc >= 'a' && $nc <= 'z' || $nc >= 'A' && $nc <= 'Z') {
34. if (empty($param))
35. $word .= $nc;
36. else
37. break;
38. } elseif ($nc >= '0' && $nc <= '9')
39. $param .= $nc;
40. elseif ($nc == '-') {
41. if (empty($param))
42. $param .= $nc;
43. else
44. break;
45. } else
46. break;
47. }
48. $i += $m - 1;
49. $toText = "";
50. switch (strtolower($word)) {
51. case "u":
52. $toText .= html_entity_decode("&#x".dechex($param).";");
53. $ucDelta = @$stack[$j]["uc"];
54. if ($ucDelta > )
55. $i += $ucDelta;
56. break;
57. case "par": case "page": case "column": case "line": case "lbr":
58. $toText .= "\n";
59. break;
60. case "emspace": case "enspace": case "qmspace":
61. $toText .= " ";
62. break;
63. case "tab": $toText .= "\t"; break;
64. case "chdate": $toText .= date("m.d.Y"); break;
65. case "chdpl": $toText .= date("l, j F Y"); break;
66. case "chdpa": $toText .= date("D, j M Y"); break;
67. case "chtime": $toText .= date("H:i:s"); break;
68. case "emdash": $toText .= html_entity_decode("—"); break;
69. case "endash": $toText .= html_entity_decode("–"); break;
70. case "bullet": $toText .= html_entity_decode("•"); break;
71. case "lquote": $toText .= html_entity_decode("‘"); break;
72. case "rquote": $toText .= html_entity_decode("’"); break;
73. case "ldblquote": $toText .= html_entity_decode("«"); break;
74. case "rdblquote": $toText .= html_entity_decode("»"); break;
75. default:
76. $stack[$j][strtolower($word)] = empty($param) ? true : $param;
77. break;
78. }
79. if (rtf_isPlainText($stack[$j]))
80. $document .= $toText;
81. }
82. $i++;
83. break;
84. case "{":
85. array_push($stack, $stack[$j++]);
86. break;
87. case "}":
88. array_pop($stack);
89. $j--;
90. break;
91. case '\0': case '\r': case '\f': case '\n': break;
92. default:
93. if (rtf_isPlainText($stack[$j]))
94. $document .= $c;
95. break;
96. }
97. }
98. return $document;
99.}


Исходный откомментированный код можно посмотреть здесь.


Заключение

Что мы имеем в итоге? Данный код справится верно с большинством rtf-файлов, но есть несколько способов его улучшить. Во-первых, стоит добавить дополнительные отсечения на нетекстовые данные — у меня отсекаются только шрифты, цветовая палитра, тема оформления, бинарные данные, а также всё, что помечено, как «не читай меня, если не можешь» (\*). Во-вторых же, стоит ещё распарсить кодировку и кодовую страницу, для того чтобы вернее отобразить ключевые слова вида \'hh.

Что дальше? Дальше я бы хотел затронуть форматы электронных книг, такие как fb2, epub и подобные им. В связи с этим, я хотел бы обратиться за помощью к читателям: во-первых, какие ещё форматы электронных книг стоит посмотреть, а во-вторых, где можно найти побольше файлов, указанных вами форматов. Заранее спасибо smile.gif

Спустя 15 часов, 56 минут, 11 секунд (17.09.2010 - 06:20) zvezda_t написал(а):
спасибо, но у меня новая проблема - я сохранила свой документ Word1.doc как Word1.rtf и потеряла половину шрифтов и таблиц...
возможно ли как нибудь прям с документом Word1.doc работать? rolleyes.gif

Спустя 11 минут, 44 секунды (17.09.2010 - 06:32) twin написал(а):
.doc - скомпелированный файл на сколько мне известно. Ничего не выйдет.

Спустя 21 минута, 23 секунды (17.09.2010 - 06:53) Basili4 написал(а):
zvezda_t
только через СOM для этого у тебя на серевере должен быть установлен Word

Спустя 20 дней, 7 часов, 57 минут, 46 секунд (7.10.2010 - 14:51) zvezda_t написал(а):
а можно примерчик? что то ничего нагуглить не могу sad.gif

Спустя 1 час, 43 минуты, 42 секунды (7.10.2010 - 16:35) Basili4 написал(а):

Спустя 13 часов, 39 минут, 3 секунды (8.10.2010 - 06:14) zvezda_t написал(а):
Скачала класс...
только там примеров нету((

Мне теперь нужно сейчас специальный шаблон из документа word сделать? Или достаточно сделать заменители типо : <<name>>??? rolleyes.gif

Как с помощью COM объектов заменить значения в шаблоне?

Спустя 2 часа, 1 минута, 49 секунд (8.10.2010 - 08:16) Basili4 написал(а):
примеров роаботы с классом я тоже не нашел

нашел только вот это

<?php
$word = new COM("word.application") or die ("couldnt create an instance of word");
echo "loaded , word version{$word->version}";
//bring word to the front
$word->visible = 1;
//open a word document
$word->Documents->Add();
//add some text to the document
$word->Selection->TypeText("this is some sample text in the document");
//save the document as sampleword.doc
$word->Documents[1]->SaveAs("sampleword.doc");
//close word
$word->Quit();
//free object resources
$word->Release();
$word = null;
?>

Спустя 6 минут, 48 секунд (8.10.2010 - 08:22) Basili4 написал(а):
zvezda_t
глянул я тот класс там примеры не нужны открой index.php там есть пример как открыть поставить закладку и сохранить документ. Ничего более класс делать не может остальное надо дописывать. тебе надо найти доку про com интерфейсы Ворда. и их уже использовать

вот так
$word = new COM("word.application") or die ("couldnt create an instance of word"); //Создание объекта

$word-> Метод();

или так $word->объект->Метод().

Спустя 2 минуты, 51 секунда (8.10.2010 - 08:25) zvezda_t написал(а):
в моём документе word1.doc есть поле:
"ФИО:_________________________________"

как мне туда вставить значение переменной:
$fio=$lastname." ".$name;


??? rolleyes.gif

Спустя 18 минут, 41 секунда (8.10.2010 - 08:44) linker написал(а):
Может поставить 2007 офис, там хранить в docx документы - это архив, распаковываешь, а там простые xml.

Спустя 5 минут, 43 секунды (8.10.2010 - 08:50) zvezda_t написал(а):
Цитата (linker @ 8.10.2010 - 05:44)
Может поставить 2007 офис, там хранить в docx документы - это архив, распаковываешь, а там простые xml.

сохранить мой word1.doc как word1.docx?

а с помощью каких функций его потом открыть?

Спустя 1 день, 4 часа, 1 минута, 14 секунд (9.10.2010 - 12:51) zvezda_t написал(а):
Krevedko
пример который ты привёл - не работает(

там есть пропущенные значения:
14. for ($i = ;
31. for ($k = $i + 1, $m = ;

Спустя 5 часов, 50 минут, 1 секунда (9.10.2010 - 18:41) zvezda_t написал(а):
Новая проблема у меня...

В документе есть поля вида:

«___»____________20_____ г.
ФИО(____________________________)

как быть с линиями, чтоб они не разрывались но сохранились? ведь дата не должна вставляться так: «_12__»__июня__________20__10___ г.

использовать строку подчеркивания: «12»июня2010 г.
или какие то другие средства есть? rolleyes.gif

Спустя 1 месяц, 29 дней, 5 часов, 23 минуты, 28 секунд (9.12.2010 - 01:04) Гарри написал(а):
Здравствуйте. кто нибудь, подскажите. Книги в формате EPUB открываются в Виндоусе как бинарный файл, а потоиу из невозможно скачать на электронную книгу. Что делать? Чего мне не хватает?
спачибо откликнувшимся.


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.