Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> правка doc файла 
V
    Опции темы
bars80080
Дата 21.12.2012, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



есть ли способ править доковский файл, как шаблон?

по принципу:

Код

$text = file_read($dir . '/web.doc');

$newtext = str_replace('{TTB_NAME}', 'QWERTQWERT', $text);

file_write($dir . '/newweb.doc');




или придётся писать его целиком заново?
в длинном договоре надо всего лишь заменить десяток переменных
PM MAIL WWW   Вверх
Fortop
Дата 21.12.2012, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



В Word этот функционал есть.

Более того, он тебе может шаблон заполнить данными из БД через ODBC


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
bars80080
Дата 21.12.2012, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ммм, что-то мне по постановке фразы кажется, что недопоняли. мне не в ворде надо вставить данные, а на сервере налету вписывать их в доковский файл.
пользователь указывает реквизиты, которые сохраняются в mysql БД, а затем скачивает документы с расщирением doc, в которых эти реквизиты уже проставлены


это имеется ввиду? 

http://php.net/manual/ru/function.odbc-pconnect.php

надо будет посмотреть (на работе), держит ли хостинг эту библиотеку
PM MAIL WWW   Вверх
ksnk
Дата 22.12.2012, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



bars80080, можно сохранять его в rft. rtf - обычный текстовый формат. Его же и выдавать юзеру.

Текст туда вставляется как-то так (кодировка файла cp1251)
Код

$text='5 января 2004 года'; 

$rtf_text = preg_replace("/([А-Яа-яёЁтТ]{1,1})/ei", "\"\'\".dechex(ord(\"\\1\"))", $text );

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

Добавлено через 4 минуты
Да! для разметки "полей шаблона" разумно использовать русские буквы, чтобы случайно не получить "английский"язык в этом текстовом поле. Немного больше геморроя с заменой,зато меньше проблем в реальной жизни. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 22.12.2012, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(bars80080 @  21.12.2012,  22:36 Найти цитируемый пост)
это имеется ввиду? 

http://php.net/manual/ru/function.odbc-pconnect.php

надо будет посмотреть (на работе), держит ли хостинг эту библиотеку 

Нет не это.


Имелось в виду использование Word в качестве сервера приложения. И через тот же OLEAutomation выполнять требуемое действие

Добавлено @ 15:56
http://php.net/manual/ru/book.com.php
Или вот так

Это сообщение отредактировал(а) Fortop - 22.12.2012, 15:57


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
bars80080
Дата 9.1.2013, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Fortop @  22.12.2012,  15:54 Найти цитируемый пост)
Имелось в виду использование Word в качестве сервера приложения. И через тот же OLEAutomation выполнять требуемое действие

Добавлено @ 15:56
http://php.net/manual/ru/book.com.php

но это же на линуксовом сервере не идёт?

также использовать rtf нельзя из-за потери разных разностей в тексте

в принципе, моя мысль всё пытается решить задачу в лоб (она ведь изначально не требует высокого пилотажа): к примеру, на месте вставляемого значения находится строка с фиксированной длинной ПЕРЕМЕННАЯ_ДЛЯ_ЗАМЕНЫ_ЮРИДИЧЕСКИЙ_АДРЕС___________ещё-сколько-то-символов-для-дозаполнения-по-принципу-CHAR, которую мы просто заменяем простым str_replace
но пока что-то не удаётся осилить перевод. латинские символы вроде удаётся так менять, дополняя каждый символ кодом \x00. кириллица же завершается \x04 , однако, сопоставить коды самих символов не получается. к примеру, символ "Ю" имеет код DE (222), но в winhex-редакторе он обозначен двумя байтами 2E 04, в то время как "U" имеет код 55 (85), а в редакторе 55 00
как их сопоставить?
PM MAIL WWW   Вверх
bars80080
Дата 10.1.2013, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



в итоге, в рамках желаемого получился сий костыль:

Код

$needle = array('DEFINE_JURE_ADRES', 'DEFINE_JURE_RS');
$str = array('ООО "Самсунг"', '7894623');
$newtext = str_replace_in_doc($needle, $str, $text);


function str_replace_in_doc($needle = '', $str = '', $text = '') {
    $a_len = $a = $b = array();
    if(is_array($needle)) {
        $a_c = count($needle);
        for($i = 0; $i < $a_c; $i++) { $a_len[$i] = strlen($needle[$i]); }
        $a = $needle;
    } else {
        $a_c = 1; $a_len[0] = strlen($needle); $a[0] = $needle;
    }
    if(is_array($str)) {
        $b = $str;
    } else {
        $b[0] = $str;
    }
    
    $a = str_replace_in_doc_needle($a, $a_len, $a_c);
    for($i = 0; $i < $a_c; $i++) {
        if(empty($b[$i])) { $b[$i] = ''; }
        $b[$i] = str_replace_in_doc_str($b[$i], $a_len[$i]);
        $text = str_replace($a[$i], $b[$i], $text);
    }
    return $text;
}
function str_replace_in_doc_str($s, $a_len) {
    $s = iconv('UTF-8', 'UCS-2', $s);
    $b_len = strlen($s); $max = $a_len * 2;
    $len = min($b_len, $max);
    $n = ''; $arr = array();
    for($i = 0; $i < $len; $i++) {
        $add = (!($i%2)) ? 1 : -1;
        $arr[($i + $add)] = substr($s, $i, 1);
    }
    for($i = 0; $i < $len; $i++) { $n .= $arr[$i]; }
    for(; $i < $max; $i += 2) { $n .= "\x20\x00"; }
    return $n;
}
function str_replace_in_doc_needle($a, $a_len, $j_len) {
    $n = array();
    for($j = 0; $j < $j_len; $j++) {
        $n[$j] = '';
        for($i = 0; $i < $a_len[$j]; $i++) { $n[$j] .= substr($a[$j], $i, 1) . "\x00"; }
    }
    return $n;
}


вроде работает. заменяет в фразы DEFINE_JURE_ADRES и DEFINE_JURE_RS в тексте на подставку. если новая фраза длиннее прежней, то новая обрезается под размер прежней. если наоборот, то новая фраза дополняется пробелами

меня в принципе так устраивает, хотя конечно рад был бы разрешить этот момент лучше. но боюсь, тут уже не обойтись без перестройки всего текста (видимо, где-то прописываются контрольные суммы длин строк)
PM MAIL WWW   Вверх
bars80080
Дата 11.1.2013, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



оказывается, почти сделал как надо, просто не допёр, что это уже и есть решение.
заменяю я ведь значениями из БД, а там они всё равно хранятся в полях ограниченной длины. осталось только все искомые размечать на ширину полей (там преимущественно varchar(255)), а дополнять пустоты не пробелами "\x20\x00", а пустыми символами "\x16\x00", в итоге в документе строки выглядят короткими.

тогда задача решена
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.