PHP рдореЗрдВ рд▓реЗрдЦ
рдмрд╣реБрдд рдИрдорд╛рдирджрд╛рд░ рдирд╣реАрдВ DOC рдлрд╝рд╛рдЗрд▓ рдкреАрдврд╝реА рдиреЗ MHT (MIME HTML) рдкреАрдврд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ DOC рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рдкреАрдврд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдореЗрд░реА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд╛рдн рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
1) рдУрдкрдирдСрдлрд┐рд╕ рдореЗрдВ, рдкрдардиреАрдп рдкрд╛рда рдФрд░ рдЪрд┐рддреНрд░ред
2) рд╡рд░реНрдб рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд░реВрдк рдореЗрдВ рдЦреЛрд▓реА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЗрдВ рдирд╣реАрдВред
3) рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ HTML рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧреА рдФрд░ рддреБрд░рдВрдд рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП DOC рдлрд╛рдЗрд▓ рджреЗрдЧреАред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдирдВрдЧреЗ HTML рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдПрдордПрдЪрдЯреА рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдпрджрд┐ рдХреЛрдИ рд╣реЛрдВ, рддреЛ рдХреЛрдб рдХреЛ рдЦреЛрджрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдУрд╕реА рдлрд╝рд╛рдЗрд▓ рджреЗрдЧрд╛ рдФрд░ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдФрд░ рд╕рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА):
function send_download($filename, $charset = 'cp1251') { header ($_SERVER["SERVER_PROTOCOL"] . ' 200 OK'); if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) $UserBrowser = "Opera"; elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) $UserBrowser = "IE"; else $UserBrowser = ''; $mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ? 'application/octetstream' : 'application/octet-stream'; header("Content-Type: application/msword; charset=".$charset); $ua = (isset($_SERVER['HTTP_USER_AGENT']))?$_SERVER['HTTP_USER_AGENT']:''; $isMSIE = preg_match('@MSIE ([0-9].[0-9]{1,2})@', $ua); if ($isMSIE) { header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); } else { header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Pragma: no-cache'); } }
рдЕрдм рдЪрд▓реЛ DOC рдлрд╝рд╛рдЗрд▓ рдХреА рдкреАрдврд╝реА рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдлреЙрд░реНрдо рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде html рднреЗрдЬреЗрдЧрд╛, рдЪрд┐рддреНрд░ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдкрд░ рд╣реИрдВред
<form action="getFile.php" method="POST"> <textarea name="text" rows ="10" cols="60"><?=str_replace(array('<', '>'), array('<', '>'), ' <b></b><img src="/images/logo.gif">');?></textarea> <input type="submit" value="HTML TO DOC"/> </form>
рд╣рдо рдмреЗрд╕ 64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди - рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдПрдБ:
function prepareImage($matches) { global $IMAGES, $IMAGE_NAMES, $IMAGE_COUNT,$gldir,$SITE; $imgfile = $_SERVER['DOCUMENT_ROOT'].'/'.$matches[2]; $imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile)); $url = $SITE.$matches[1]; $data = chunk_split(base64_encode($imgbinary)); $IMAGE_COUNT++; $ext = substr($matches[2], strpos($matches[2], '.') + 1, strlen($matches[2])); $imgName = 'images'.$IMAGE_COUNT.'.'.$ext; $IMAGES .= ' --doc_file_part_na_habrahabr Content-Location: '.$gldir.'images/'.$imgName.' Content-Transfer-Encoding: base64 Content-Type: image/'.$ext.' '.$data.' '; $pr1 = $matches[1]; $pr2 = $matches[3]; $IMAGE_NAMES .= ' <o:File HRef=3D"'.$imgName.'"/>'; return '<v:imagedata src=3D"'.$gldir.'images/'.$imgName.'" o:href=3D"'.$url.'"/></v:shape><![endif]--><![if !vml]><span style=3D"mso-ignore:vglayout"><img border=3D0 src=3D"'$gldir'.images/'.$imgName.'" alt=3DHaut v:shapes=3D"_x0000_i1057" '.$p1.' '.$pr2.'></span><![endif]>'; }
рддреБрд░рдВрдд, рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рддрдм рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдореИрдВ рд╕рд┐рд░реНрдл PHP рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдУрдкрдирдСрдлрд╝рд┐рд╕ рдореЗрдВ рднреА рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗред
function xml_entities($text, $charset = 'cp1251'){ global $SITE; $text = preg_replace_callback( '/<img([a-zA-Z0-9:\/\.\-\?=_&\s;"]*)src="([--a-zA-Z\d\s:\/\.\-\?=_&]*)"([a-zA-Z0-9:\/\.\-\?=_&\s;"]*)>/', "prepareImage", $text); $text = preg_replace('/href="/','href=3D"'.$SITE, $text); $text = preg_replace('/=(?=[^3])/','=3D',$text); $text = preg_replace('/\s?=\s?"/','=3D"',$text); $text = htmlentities($text, null, $charset); $fi = array(""","&","'","<",">"); $re = array('"',"&","'","<",">"); return str_replace($fi, $re, $text); }
рдЕрдм рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣реА:
global $SITE; $SITE = 'http://pihpi.ru'; function htmlToDoc($name, $html, $charset = 'cp1251') { $nameFile = $name.'.doc'; global $IMAGES, $IMAGE_NAMES, $IMAGE_COUNT, $gldir, $SITE; $IMAGE_COUNT = 0; $IMAGE_NAMES = ''; $IMAGES = ''; $gldir = 'file:///C:/AF22D505/'; $head = 'MIME-Version: 1.0 Content-Type: multipart/related; boundary="doc_file_part_na_habrahabr" --doc_file_part_na_habrahabr Content-Location: '.$gldir.$nameFile.' Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="windows-1251" <html xmlns:o=3D"urn:schemas-microsoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" xmlns=3D"http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=3DContent-Type content=3D"text/html; charset=3Dwindows-1251"> <meta name=3DProgId content=3DWord.Document> <meta name=3DGenerator content=3D"Microsoft Word 11"> <meta name=3DOriginator content=3D"Microsoft Word 11"> <link rel=3DFile-List href=3D"filelist.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Print</w:View> <w:GrammarState>Clean</w:GrammarState> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState=3D"false" LatentStyleCount=3D"156"> </w:LatentStyles> </xml><![endif]--> <style> <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Tahoma"; mso-fareast-font-family:"Tahoma";} @page Section1 {size:595.3pt 841.9pt; margin:18.0pt 19.3pt 18.0pt 18.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"\041E\0431\044B\0447\043D\0430\044F \0442\0430\0431\043B\= 0438\0446\0430"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Tahoma"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400; width:100%; } td.br1{ border:1px solid black; } </style> <![endif]--> </head> <body>'; $end = ' </body> </html> '; $html = xml_entities($html, $charset); $fileList = ' --doc_file_part_na_habrahabr Content-Location: '.$gldir.'filelist.xml Content-Transfer-Encoding: quoted-printable Content-Type: text/xml; charset="utf-8" <xml xmlns:o=3D"urn:schemas-microsoft-com:office:office"> <o:MainFile HRef=3D"../'.$nameFile.'"/> '.$IMAGE_NAMES.' <o:File HRef=3D"filelist.xml"/> </xml> '; $content = $head.$html.$end.$IMAGES.$fileList.'--doc_file_part_na_habrahabr--'; send_download($nameFile); echo $content; exit(); }
рдФрд░ рдЕрдВрдд рдореЗрдВ, HTML рдХрд╛ DOC рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╣реА рд░реВрдкрд╛рдВрддрд░рдг:
if (isset($_POST['text'])) { htmlToDoc('article', str_replace('\\', '', $_POST['text'])); }
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЖрдк рдирд┐рдореНрди рд▓рд┐рдВрдХ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
http://pihpi.ru/getFile.php
рд▓рд┐рдмрд░ рдСрдлрд┐рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:
рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд┐рддреНрд░ рдЕрдлрд╕реЛрд╕ рд╣реИрдВред рдорд╛рдЗрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдВрдЯреЗрдВрдЯ-рдЖрдИрдбреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╛ рддреЛ рдореБрдЭреЗ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рд▓рд┐рдмреНрд░реЗ рдСрдлрд┐рд╕ MIME HTML рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред