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

  • Автор темы Автор темы GRIG
  • Дата начала Дата начала

GRIG

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

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

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

Или можно как-нибудь извернуться с другими форматами (вроде RTF или PDF)?
 
Спасибо, интересная мысль. Надо будет подумать. Правда, меня пока смущает, что надо будет как-то создать файл-шаблон с логотипом фирмы. Для DOC и RTF это делается легко. А с PDF надо будет повозиться.
 
если ресурсы не жмут, то проще tcpdf, генерируешь html и отправляешь его в writeHTML
есть некоторые нюансы для html, но это уже мелочи, проще чем разбираться с генераторами pdf
 
я делаю RTF документ, заменяю там что-нибуть такое clientlastname на нужный текст, проще некуда
 
Вот этот момент поподробнее, пожалуйста. Создать 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
 
Спасибо. Простенько и со вкусом.
Один вопрос еще остался: где тут существенно, что кодировка виндовая? Потому как у нас корпоративный стандарт - 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);
}
 
Спасибо. Теперь все это надо обмозговать хорошенько.
 
Да, задача стояла заменить blablabla на одну строку без спец. символов, так что как ведет себя при переносе строи т.п. - не знаю) расскажешь что да как если чтО)

-~{}~ 08.07.10 16:21:

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

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