Quelles sont les solutions disponibles pour PHP pour créer un document Word dans un environnement Linux?
Si vous avez besoin de produire de "vrais" documents Word, vous avez besoin d'un serveur Web Windows et d'une automatisation COM. Je recommande fortement article de Joel à ce sujet.
Une alternative assez courante (mais peu fiable) est:
header("Content-type: application/vnd.ms-Word");
header("Content-Disposition: attachment; filename=document_name.doc");
echo "<html>";
echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1252\">";
echo "<body>";
echo "<b>Fake Word document</b>";
echo "</body>";
echo "</html>"
Assurez-vous de ne pas utiliser de feuilles de style externes. Tout devrait être dans le même fichier.
Notez que cela n'envoie pas un document Word réel. Il incite simplement les navigateurs à le proposer en téléchargement et à utiliser par défaut un .doc
extension de fichier. Les versions plus anciennes de Word peuvent souvent l'ouvrir sans aucun message d'avertissement/de sécurité et simplement importer le HTML brut dans Word. PHP envoi en envoyant ce trompeur Content-Type
l'en-tête ne constitue pas une véritable conversion de format de fichier.
PHPWord peut générer des documents Word au format docx. Il peut également utiliser un fichier .docx existant comme modèle - des variables de modèle peuvent être ajoutées au document au format $ {varname}
Il a une licence LGPL et les exemples fournis avec le code ont bien fonctionné pour moi.
Modèles OpenOffice + OOo interface de ligne de commande.
Des outils et des bibliothèques sont disponibles pour faciliter chacune de ces étapes.
Peut-être que ça aide.
De loin le moyen le plus simple de créer des fichiers DOC sous Linux, en utilisant PHP est avec le composant Zend Framework phpLiveDocx.
Depuis le site Web du projet:
"phpLiveDocx permet aux développeurs de générer des documents en combinant des données structurées à partir de PHP avec un modèle, créé dans un traitement de texte. Le document résultant peut être enregistré au format PDF, DOCX, DOC ou RTF. Le concept est le même qu'avec le publipostage. "
OpenTBS peut créer des documents dynamiques DOCX dans PHP en utilisant la technique des modèles.
Aucun fichier temporaire nécessaire, aucune ligne de commande, tout en PHP.
Il peut ajouter ou supprimer des images. Le document créé peut être produit sous forme de téléchargement HTML, de fichier enregistré sur le serveur ou de contenu binaire en PHP.
Il peut également fusionner des fichiers OpenDocument (ODT, ODS, ODF, ...)
Suite à la réponse d'Ivan Krechetov, voici une fonction qui fait du publipostage (en fait juste un simple remplacement de texte) pour docx et odt, sans avoir besoin d'une bibliothèque supplémentaire.
function mailMerge($templateFile, $newFile, $row)
{
if (!copy($templateFile, $newFile)) // make a duplicate so we dont overwrite the template
return false; // could not duplicate template
$Zip = new ZipArchive();
if ($Zip->open($newFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
return false; // probably not a docx file
$file = substr($templateFile, -4) == '.odt' ? 'content.xml' : 'Word/document.xml';
$data = $Zip->getFromName($file);
foreach ($row as $key => $value)
$data = str_replace($key, $value, $data);
$Zip->deleteName($file);
$Zip->addFromString($file, $data);
$Zip->close();
return true;
}
Cela remplacera [Nom de la personne] par Mina et [Nom de la personne] par Mooo:
$replacements = array('[Person Name]' => 'Mina', '[Person Last Name]' => 'Mooo');
$newFile = tempnam_sfx(sys_get_temp_dir(), '.dat');
$templateName = 'personinfo.docx';
if (mailMerge($templateName, $newFile, $replacements))
{
header('Content-type: application/msword');
header('Content-Disposition: attachment; filename=' . $templateName);
header('Accept-Ranges: bytes');
header('Content-Length: '. filesize($file));
readfile($newFile);
unlink($newFile);
}
Attention, cette fonction peut corrompre le document si la chaîne à remplacer est trop générale. Essayez d'utiliser des chaînes de remplacement détaillées comme [Nom de la personne].
Le projet Apache possède une bibliothèque appelée POI qui peut être utilisée pour générer des fichiers MS Office. C'est une bibliothèque Java mais l'avantage est qu'elle peut fonctionner sur Linux sans problème. Cette bibliothèque a ses limites mais elle peut faire le travail pour vous, et elle est probablement plus simple à utiliser qu'à essayer. pour exécuter Word.
Une autre option serait OpenOffice mais je ne peux pas exactement le recommander car je ne l'ai jamais utilisé.
<?php
function fWriteFile($sFileName,$sFileContent="No Data",$ROOT)
{
$Word = new COM("Word.application") or die("Unable to instantiate Word");
//bring it to front
$Word->Visible = 1;
//open an empty document
$Word->Documents->Add();
//do some weird stuff
$Word->Selection->TypeText($sFileContent);
$Word->Documents[1]->SaveAs($ROOT."/".$sFileName.".doc");
//closing Word
$Word->Quit();
//free the object
$Word = null;
return $sFileName;
}
?>
<?php
$PATH_ROOT=dirname(__FILE__);
$Return ="<table>";
$Return .="<tr><td>Row[0]</td></tr>";
$Return .="<tr><td>Row[1]</td></tr>";
$sReturn .="</table>";
fWriteFile("test",$Return,$PATH_ROOT);
?>
Il existe 2 options pour créer des documents Word de qualité. Utilisez COM pour communiquer avec Word (cela nécessite au moins un serveur php Windows). Utilisez openoffice et son API pour créer et enregistrer des documents au format Word.
Jetez un œil à PHP documents COM (les commentaires sont utiles) http://us3.php.net/com