Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo
Sommaire > XML > OpenDocument (OpenOffice.org)
        Que faut-il pour lire des documents OpenDocument en PHP ?
        Comment créer un document OpenDocument ?
        Comment ajouter un paragraphe ?
        Comment mettre du texte en forme ?



Que faut-il pour lire des documents OpenDocument en PHP ?
auteur : Guillaume Rossolini
Les documents OpenOffice sont des archives ZIP de documents XML. À ce titre, il faut avoir activé les extensions ZIP et DOM pour pouvoir lire ces documents en PHP 5.

lien : faq http://php.developpez.com/faq/tmp/bibliotheques-extensions/?page=divers#extension_installer
lien : faq http://php.developpez.com/faq/tmp/bibliotheques-extensions/?page=zip#zip_definition

Comment créer un document OpenDocument ?
auteur : Guillaume Rossolini
OpenOffice utilise des fichiers ZIP contenant des fichiers XML.

La structure minimale d'une archive OpenOffice Text est :
  • /META-INF/manifest.xml : Décrit le type du document principal (Text, Calc, Presentation, etc.) ainsi que de tous les autres éléments de l'archive ;
  • /content.xml : Le document principal, il peut contenir du texte, un classeur Spreadsheet, des slides Presentation, etc.
/META-INF/manifest.xml
<?xml version="1.0" encoding="utf-8" ?>
<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0">
    <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text" manifest:full-path="/" />
    <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml" />
</manifest:manifest>
/content.xml
<?xml version="1.0" encoding="utf-8" ?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
    <office:body>
        <office:text>
            <text:p>Hello world!</text:p>
        </office:text>
    </office:body>
</office:document-content>

Voici le code nécessaire pour créer de toutes pièces un document OpenOffice Text en PHP 5 :
hello-world.php
<?php

$manifest = new DOMDocument('1.0', 'utf-8');

$XMLManifest = $manifest->createElement('manifest:manifest');
$XMLManifest->setAttribute('xmlns:manifest', 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0');
$manifest->appendChild($XMLManifest);

$XMLFileEntry = $manifest->createElement('manifest:file-entry');
$XMLFileEntry->setAttribute('manifest:media-type', 'application/vnd.oasis.opendocument.text');
$XMLFileEntry->setAttribute('manifest:full-path', '/');
$XMLManifest->appendChild($XMLFileEntry);

$XMLFileEntry = $manifest->createElement('manifest:file-entry');
$XMLFileEntry->setAttribute('manifest:media-type', 'text/xml');
$XMLFileEntry->setAttribute('manifest:full-path', 'content.xml');
$XMLManifest->appendChild($XMLFileEntry);


$content = new DOMDocument('1.0', 'utf-8');

$XMLOfficeContent = $content->createElement('office:document-content');
$XMLOfficeContent->setAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
$XMLOfficeContent->setAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');
$content->appendChild($XMLOfficeContent);

$XMLOfficeBody = $content->createElement('office:body');
$XMLOfficeContent->appendChild($XMLOfficeBody);

$XMLOfficeText = $content->createElement('office:text');
$XMLOfficeBody->appendChild($XMLOfficeText);

$XMLText = $content->createElement('text:p', utf8_encode("Hello world!"));
$XMLOfficeText->appendChild($XMLText);


$document = new ZipArchive();
$document->open('hello-world.odt', ZIPARCHIVE::OVERWRITE);

$document->addFromString('META-INF/manifest.xml', $manifest->saveXML());
$document->addFromString('content.xml', $content->saveXML());

$document->close();

?>
lien : faq Que faut-il pour lire des documents OpenDocument en PHP ?

Comment ajouter un paragraphe ?
auteur : Guillaume Rossolini
Un paragraphe de texte est un élément "p" contenant directement le texte (pas de run puis text comme dans OpenXML). Cet élément est contenu dans la racine "text" du document (dans le cas d'un document Text).
Le namespace 'text' reflète l'élément parent :
$XMLText = $content->createElement('text:p', utf8_encode("Hello world!"));
$XMLOfficeText->appendChild($XMLText);
Exemple complet :
<?php

$content = new DOMDocument('1.0', 'utf-8');

$XMLDocumentContent = $content->createElement('office:document-content');
$XMLDocumentContent->setAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
$XMLDocumentContent->setAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');
$content->appendChild($XMLDocumentContent);

$XMLBody = $content->createElement('office:body');
$XMLDocumentContent->appendChild($XMLBody);

$XMLText = $content->createElement('office:text');
$XMLBody->appendChild($XMLText);

$XMLParagraph = $content->createElement('text:p');
$XMLText->appendChild($XMLParagraph);

$XMLText = $content->createTextNode(utf8_encode("Du texte simple."));
$XMLParagraph->appendChild($XMLText);

$content->save('content.xml');

?>

Comment mettre du texte en forme ?
auteur : Guillaume Rossolini
OpenDocument utilise un système très similaire à HTML pour mettre le texte en forme : des éléments span insérés directement dans le paragraphe permettent de modifier la mise en forme d'une portion de texte. Il faut appliquer un style à chacun de ces éléments span.
Exemple de mise en forme :
<office:automatic-styles>
    <style:style style:name="b" style:family="text">
        <style:text-properties fo:font-weight="bold" /> 
    </style:style>
</office:automatic-styles>
Exemple de paragraphe :
<text:p text:style-name="Standard">
    Un paragraphe
    <text:span text:style-name="b">mis en forme</text:span> 
    .
</text:p>
$XMLAutomaticStyles = $content->createElement('office:automatic-styles');
$XMLDocumentContent->appendChild($XMLAutomaticStyles);

$XMLStyle = $content->createElement('style:style');
$XMLStyle->setAttribute('style:name', 'b');
$XMLStyle->setAttribute('style:family', 'text');
$XMLAutomaticStyles->appendChild($XMLStyle);

$XMLTextProperties = $content->createElement('style:text-properties');
$XMLTextProperties->setAttribute('fo:font-weight', 'bold');
$XMLStyle->appendChild($XMLTextProperties);

// ...

$XMLParagraph = $content->createElement('text:p');
$XMLText->appendChild($XMLParagraph);

$XMLText = $content->createTextNode(utf8_encode("Du texte "));
$XMLParagraph->appendChild($XMLText);

$XMLText = $content->createElement('text:span', utf8_encode("mis en forme"));
$XMLText->setAttribute('text:style-name', 'tests');
$XMLParagraph->appendChild($XMLText);

$XMLText = $content->createTextNode(utf8_encode("."));
$XMLParagraph->appendChild($XMLText);

L'élément "office:automatic-styles" doit être ajouté à l'élément "office:document-content".

L'élément "text:p" doit être ajouté à un élément "office:text".
Exemple complet :
<?php

$content = new DOMDocument('1.0', 'utf-8');

$XMLDocumentContent = $content->createElement('office:document-content');
$XMLDocumentContent->setAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0');
$XMLDocumentContent->setAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0');
$XMLDocumentContent->setAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0');
$XMLDocumentContent->setAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0');
$content->appendChild($XMLDocumentContent);


$XMLAutomaticStyles = $content->createElement('office:automatic-styles');
$XMLDocumentContent->appendChild($XMLAutomaticStyles);

$XMLStyle = $content->createElement('style:style');
$XMLStyle->setAttribute('style:name', 'tests');
$XMLStyle->setAttribute('style:family', 'text');
$XMLAutomaticStyles->appendChild($XMLStyle);

$XMLTextProperties = $content->createElement('style:text-properties');
$XMLTextProperties->setAttribute('fo:font-family', 'Courier new');
$XMLTextProperties->setAttribute('fo:font-weight', 'bold');
$XMLTextProperties->setAttribute('fo:font-style', 'italic');
$XMLTextProperties->setAttribute('fo:color', '#FF0000');
$XMLTextProperties->setAttribute('fo:background-color', '#00FFFF');
$XMLTextProperties->setAttribute('style:text-underline-type', 'single');
$XMLStyle->appendChild($XMLTextProperties);


$XMLBody = $content->createElement('office:body');
$XMLDocumentContent->appendChild($XMLBody);

$XMLText = $content->createElement('office:text');
$XMLBody->appendChild($XMLText);

$XMLParagraph = $content->createElement('text:p');
$XMLText->appendChild($XMLParagraph);

$XMLText = $content->createTextNode(utf8_encode("Du texte "));
$XMLParagraph->appendChild($XMLText);

$XMLText = $content->createElement('text:span', utf8_encode("mis en forme"));
$XMLText->setAttribute('text:style-name', 'tests');
$XMLParagraph->appendChild($XMLText);

$XMLText = $content->createTextNode(utf8_encode("."));
$XMLParagraph->appendChild($XMLText);

$content->save('content.xml');

?>


Consultez les autres F.A.Q.


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com