Чтение/запись Word-файла средствами PHP

GRIG

Новичок
Чтение/запись Word-файла средствами PHP

Всем привет! Подкиньте идей по такой задаче.
Есть база данных. Время от времени в эту базу посылаются поисковые запросы. И на эти запросы находятся (или не находятся) ответы.
Нужно взять ответ на очередной запрос, добавить к нему некоторые стандартные слова и записать все это в файл в формате Word. Необходимость записи результатов в файл связана с тем, что это официальная процедура, по результатам которой должно быть отправлено письмо (бумажное!) с подписью Большого Начальника и печатью.
Как организовать базу, поиск по базе и все прочее - это я как-нибудь сам соображу. Опыт есть.
А вот как вордовый файл прочитать, а потом записать - вот этого у меня еще не было.
Подскажите куда посмотреть и чего почитать.
Заранее спасибо.
 

dimagolov

Новичок
А вот как вордовый файл прочитать, а потом записать - вот этого у меня еще не было.
1. Если это виндовая машина, то можно через COM открывать шаблон, заполнять его и сохранять под уникальным именем.
2. Можно просто генерить HTML с нужным содержимым, обзывать его .doc, ворд начиная по крайней мере с 2003 прекрасно его понимает и показывает.

Потом можно или складывать это все в папку, или слать на почту, или через тот же COM слать на принтер.
 

GRIG

Новичок
1. А если машина не виндовая, а линуховая?

Или можно как-нибудь извернуться с другими форматами (вроде RTF или PDF)?
 

GRIG

Новичок
Спасибо, интересная мысль. Надо будет подумать. Правда, меня пока смущает, что надо будет как-то создать файл-шаблон с логотипом фирмы. Для DOC и RTF это делается легко. А с PDF надо будет повозиться.
 

AmdY

Пью пиво
Команда форума
если ресурсы не жмут, то проще tcpdf, генерируешь html и отправляешь его в writeHTML
есть некоторые нюансы для html, но это уже мелочи, проще чем разбираться с генераторами pdf
 

Активист

Активист
Команда форума
я делаю RTF документ, заменяю там что-нибуть такое clientlastname на нужный текст, проще некуда
 

GRIG

Новичок
Вот этот момент поподробнее, пожалуйста. Создать RTF-шаблон - это обычным вордом или опенофисом можно. А дальше как?
 

Активист

Активист
Команда форума
PHP:
error_reporting(0);

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

					
					header("Content-type: text/rtf");
					//exit();
					
					$contact_rtf = file_get_contents("uploads/docs/contracts/rtf/{$fname}");
					
					$replacement = array(
					
											"administratorOrganisationForm" => $operatorInfo['administratorOrganisationForm'], // ООО
											"administratorOrgTitle" => $operatorInfo['administratorOrgTitle'], // Рога и копыта
											"administratorPhone" => $operatorInfo['administratorPhone'], 
											"administratorInn" => $operatorInfo['administratorInn'],
);

foreach ($replacement as $key => $value) {
						$contact_rtf = str_replace($key, string2rft($value), $contact_rtf);
						
					}
					
					echo $contact_rtf;
                                        exit();

РТФ обычный, сохрянал в 2007 ворде.

-~{}~ 08.07.10 16:00:

Кодировка CP1251
 

GRIG

Новичок
Спасибо. Простенько и со вкусом.
Один вопрос еще остался: где тут существенно, что кодировка виндовая? Потому как у нас корпоративный стандарт - UTF-8.
 

Активист

Активист
Команда форума
У меня этот проект в UTF-8, тоже, но RTF-ка в cp1251. Потому и написал.У меня в оригинале кусок кода следующий (даю весь некогда вырезать), ковыряй:
PHP:
				case "my/offert.doc":
					$partnerId = isset($_SESSION['auth']['info']['partnerId']) ? $_SESSION['auth']['info']['partnerId'] : false;
					
					if ($partnerId === false) {
						throw new Exception("Permission denied", 403);
					}
					
					$partnerInfo = $this->modulesManager->run("users", "@partner_info", array("partnerId" => $partnerId));
					$operatorInfo = $operatorInfo = $this->modulesManager->run("users", "@get_operator_info", array("id" => $partnerInfo["operatorId"], "skipErrors" => true));
					//echo "Operator info development dump: <pre>";var_dump($operatorInfo); exit();
					
					$partnerType = $partnerInfo['partnerType'];

					switch ($partnerType) {
						case "company":
							if (array_search("ИПБЮЛ", array($partnerInfo['orgUrType']))) {
								$fname = "company_IPBUL.rtf";
							} else {
								$fname = "compnay.rtf";
							}
							break;
						
						case "independent":
							$fname = "independent_IPBUL.rtf"; break;
							break;
							
						default:
							throw new Exception("Can't detect partner type", 404);
					}
					
					//echo "Ориг: \'cf\'f0\'e8\'e2\'e5\'f2 \'ab\'ce\'ce\'ce \'c8\'ed\'ed\'ee\'e2\'e0\'bb<br>".strint2rft(iconv("utf-8", "cp1251", "Привет ООО"));
					
					
					error_reporting(0);
					
					header("Content-type: text/rtf");
					//exit();
					
					$contact_rtf = file_get_contents("uploads/docs/contracts/rtf/{$fname}");
					
					$replacement = array(
					
											"administratorOrganisationForm" => $operatorInfo['administratorOrganisationForm'], // ООО
											"administratorOrgTitle" => $operatorInfo['administratorOrgTitle'], // Рога и копыта
											"administratorPhone" => $operatorInfo['administratorPhone'], 
											"administratorInn" => $operatorInfo['administratorInn'],
											"administratorEmail" => $operatorInfo['administratorEmail'],
											"administratorOgrnCode" => $operatorInfo['administratorOgrnCode'],
											"administratorKppCode" => $operatorInfo['administratorKppCode'],
											"administratorDocAddress" => $operatorInfo['administratorDocAddress'],
											"administratorFactAddress" => $operatorInfo['administratorFactAddress'],
											"administratorBankTitle" => $operatorInfo['administratorBankTitle'],
											"administratorBankBikCode" => $operatorInfo['administratorBankBikCode'],
											"administratorBankAccountCode" => $operatorInfo['administratorBankAccountCode'], // кор счет
											"administratorAccountCode" => $operatorInfo['administratorAccountCode'], // р/счет
											
											"administratorBossName" => $operatorInfo['administratorBossName'],
											"administratorUrOsnovanie" => $operatorInfo['administratorUrOsnovanie'],
											"administratorBossSignature" => $operatorInfo['administratorBossSignature'],
											"administratorBossWho" => $operatorInfo['administratorBossWho'],
											"administratorBossRod" => $operatorInfo['administratorBossRod'],
					
											"login" => $partnerInfo['login'],
											"dateD" => date("d", strtotime($partnerInfo['registratedTime'])),
											"dateM" => date("m", strtotime($partnerInfo['registratedTime'])),
											"dateY" => date("Y", strtotime($partnerInfo['registratedTime'])),
											"urtype" => $partnerInfo['orgUrType'],
											"urname" => $partnerInfo['orgUrName'],
											"brend" => $partnerInfo['title'],
											"bosswhodoc" => $partnerInfo['bossWhoDoc'],
											"bossdoc" => $partnerInfo['bossWhyDoc'],
											"urtype" => $partnerInfo['orgUrType'],
											"urname" => $partnerInfo['orgUrName'],
											"uraddress" => $partnerInfo['urAddress'],
											"postaddress" => $partnerInfo['postAddress'],
											"inn" => $partnerInfo['inn'],
											"kpp" => "", //$partnerInfo[''],
											"okpo" => "", //$partnerInfo[''],
											"rschet" => $partnerInfo['rSchet'],
											"bank" => $partnerInfo['bankTitle'],
											"bik" => $partnerInfo['bik'],
											"kschet" => $partnerInfo['korSchet'],
											"telephone" => ($partnerInfo['partnerType'] == "company" ? $partnerInfo['phone'] :  $partnerInfo['userContactPhone']),
											"fax" => $partnerInfo['fax'],
											"email" => ($partnerInfo['partnerType'] == "company" ? $partnerInfo['email'] :  $partnerInfo['userEmail']),
											"bosswho" => $partnerInfo['bossWho'],
											
											"boss_signature" => (
																	$partnerInfo['partnerType'] == "company" ?
																	"{$partnerInfo['bossLastName']} ".mb_substr($partnerInfo['bossFirstName'], 0,1,"utf-8").". ".mb_substr($partnerInfo['bossMiddleName'],0,1,"utf-8")."."
																	:
																	"{$partnerInfo['userLastName']} ".mb_substr($partnerInfo['userFirstName'], 0,1,"utf-8").". ".mb_substr($partnerInfo['userMiddleName'],0,1,"utf-8")."."
																	),
											"boss" => "{$partnerInfo['bossLastName']} {$partnerInfo['bossFirstName']} {$partnerInfo['bossMiddleName']}",
											
											"lastname" => $partnerInfo['userLastName'],
											"firstname" => $partnerInfo['userFirstName'],
											"middlename" => $partnerInfo['userMiddleName'],
											
											"ogrn" => $partnerInfo['ogrn'],
											
											
											
											);
					
					
					
					foreach ($replacement as $key => $value) {
						$contact_rtf = str_replace($key, strint2rft(iconv("utf-8", "cp1251", $value)), $contact_rtf);
						
					}
					
					echo $contact_rtf;
					exit();
					throw new Exception("OK", 200);
					

//...

function strint2rft($string) {
	//echo $string;
	return preg_replace("/([А-Яа-яёЁтТ]{1,1})/ei", "\"\'\".dechex(ord(\"\\1\"))", $string);
}
 

GRIG

Новичок
Спасибо. Теперь все это надо обмозговать хорошенько.
 

Активист

Активист
Команда форума
Да, задача стояла заменить blablabla на одну строку без спец. символов, так что как ведет себя при переносе строи т.п. - не знаю) расскажешь что да как если чтО)

-~{}~ 08.07.10 16:21:

В ртф - места для замены "отмечал" латиницей без пробелов и нижних подстрочников типа:
Код:
Ваша форма.

Ваш оператор: administratorOrganisationForm "administratorOrgTitle"
Ваш ...
 
Сверху