Bonjour,
PHP8
Dolibarr 21.01
J’ouvre le fichier d’origine template_invoice.odt ne local avec LibreOffice pas de souci il l’ouvre sans erreur.
Sur le Dolibarr héberger j’ouvre n’importe qu’elle .odt j’ai systématiquement un fichier corrompu
J’envoi dans l’admin le template_invoice.odt local qui marche, je génère le document, télécharge le fichier et lors de l’ouverture fichier corrompu
Je crée un fichier .odt avec le minimum :
[!-- BEGIN supplierprices --][!-- END supplierprices --]
object_date_creation = {object_date_creation}
Même punition 
PHP7
Dolibarr 21.01
Même punition 
PHP7
Dolibarr 16.0.3
Même punition 
PHP8
Dolibarr 16.0.3
Même punition 
Cerise sur le gâteau si je clique sur Oui le fichier s’ouvre certaine variable sont bien remplacées, mais pas les extrafields 
Je tourne en rond merci pour vos lumières
Comme a chaque fois que je publie sur le forum je commence a trouver une solution 
J’ai unzipe l’odt liste des repertoires/fichiers :
Répertoire:
Configurations2
META-INF
Thumbnails
Fichier :
content.xml
manifest.rdf
meta.xml
mimetype
settings.xml
styles.xml
je supprime Configurations2 je zip j’ouvre ça marche 
grep -R « Configurations2 » ./
ne retourne que les .odt: binary file
Après l’upload du fichier
unzip -l test_product.odt | grep Configurations2
0 2025-06-15 11:52 Configurations2/toolpanel/
0 2025-06-15 11:52 Configurations2/toolbar/
0 2025-06-15 11:52 Configurations2/statusbar/
0 2025-06-15 11:52 Configurations2/floater/
0 2025-06-15 11:52 Configurations2/images/Bitmaps/
0 2025-06-15 11:52 Configurations2/progressbar/
0 2025-06-15 11:52 Configurations2/popupmenu/
0 2025-06-15 11:52 Configurations2/menubar/
0 2025-06-15 11:52 Configurations2/accelerator/
A des fins de test j’ai modifier document.php l’odt et propre sans Configuration2 mais toujours le meme problème a l’ouverture du fichier avec LibreOffice fichier corrompu 
/*// Send file now
if ($readfile) {
header('Content-Length: '.dol_filesize($fullpath_original_file));
readfileLowMemory($fullpath_original_file_osencoded);
}*/
// Send file now
if ($readfile) {
// Si c'est un fichier .odt, on supprime le répertoire Configurations2/ à la volée
if (preg_match('/\.odt$/i', $fullpath_original_file_osencoded) && is_file($fullpath_original_file_osencoded)) {
require_once DOL_DOCUMENT_ROOT.'/includes/odtphp/zip/pclzip/pclzip.lib.php';
$zip = new PclZip($fullpath_original_file_osencoded);
$zip->delete(PCLZIP_OPT_BY_PREG, '/^Configurations2\//');
}
header('Content-Length: '.dol_filesize($fullpath_original_file));
readfileLowMemory($fullpath_original_file_osencoded);
}