Ciao a tutti,
ho un file tipo in formato .odt con all'interno delle variabili quali nome, cognome, indirizzo ecc
Come posso fare il replace di queste varibili con dei valori recuperati da database?
Grazie in anticipo a tutti per i i consigli !
Ciao a tutti,
ho un file tipo in formato .odt con all'interno delle variabili quali nome, cognome, indirizzo ecc
Come posso fare il replace di queste varibili con dei valori recuperati da database?
Grazie in anticipo a tutti per i i consigli !
aquatimer2000
I file odt sono dei zip con all'interno dei file xml. Volendo potresti provare a decomprimerli e vedere se riesci a fare un replace su content.xml
ok, praticamente sono riuscito a:
- "unzippare" il file odt
- ho letto il file content.xml
- ho fatto il replace della parte che mi interessava
- ho salvato il nuovo content.xml
ora dovrei ricreare ora ho tutto il contenuto unzippato in una cartella "temp".
Come faccio a fa diventare tutto questo contenuto un file .odt?
aquatimer2000
ok bene sono riuscito anche a ricreare un file .odt con il nuovo contenuto (zippando tutto in un nuovo file.odt)
Ora però quando provo ad aprire il file con LibreOffice mi dice che
Impossibile aprire il file 'pippo.odt' in quanto è danneggiato. LibreOffice può tentare di riparare il file.
Il danno potrebbe essere frutto di una manipolazione o di un problema durante il trasferimento del file
Vuoi che LibreOffice apra il file?
Se premo SI, il file si apre correttamente con i replace corretti che ho effettuato
Come posso risolvere questo problema?
aquatimer2000
Per avere scritto un generatore di file Excel .xlsx ti posso dire che non è affatto un problema php.
Siccome sono file xml ti tocca unzipare il file odt dopo modifica e poi aprire ogni xml con il browser per vedere dove sta l’errore.
Ridatemi i miei 1000 posts persi !!!!
Non serve a nulla ottimizzare qualcosa che non funziona.
Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr
Ho "unzippato" il nuovo file odt, e al suo interno manca la cartella "Configurations2" e il file "mimetype"
questo di seguito è il codice con cui genero il file odt definitivo
sicuramente è sbagliata la parte qui sopra (che zippa appunto il file odt)Codice PHP:
<?php
$nuovoFileOdt = "nuovoOdt.odt";
$rootPath = realpath('dirtmp');
$zip = new ZipArchive();
$zip->open("$nuovoFileOdt", ZipArchive::CREATE | ZipArchive::OVERWRITE);
$files = new RecursiveIteratorIterator(
new recursiveDirectoryIterator($rootPath),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
?>
come posso correggere?
Ultima modifica di aquatimer2000; 31-05-2018 a 21:51
aquatimer2000
questo è il codice del mio file php che unzippa e zippa, il contenuto del file odt, e mi genera il file odt definitivo (ho controllato i file xml) sembra lo stesso.
lo puoi testare con un tuo file odt ?!
Codice PHP:
<?php
$zip = new ZipArchive;
$res = $zip->open('test.odt');
if ($res === TRUE) {
$zip->extractTo('dir_dove_scompatto');
//$source = file_get_contents('dirtmp/content.xml');
//$source = str_replace('@nome@', 'nome e cognome', $source);
//file_put_contents('dirtmp/content.xml', $source);
/* queste 3 righe sopra, sono quelle con cui faccio il replace.. ma ho fatto dei test anche semplicemente unzippando e zippando, senza modificare content.xml */
$zip->close();
$rootPath = realpath('dir_dove_scompatto');
$zip = new ZipArchive();
$zip->open('nuovoOdt.odt', ZipArchive::CREATE | ZipArchive::OVERWRITE);
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::SELF_FIRST);
foreach ($files as $file) {
if( in_array(substr($file, strrpos($file, '/')+1), array('.', '..')) )
continue;
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen($rootPath) + 1);
if ( $relativePath != "" ) {
if (is_dir($file) === true) {
$zip->addEmptyDir(str_replace($source . '/', '', $relativePath . '/'));
}
else if (is_file($file) === true) {
$zip->addFromString(str_replace($source . '/', '', $relativePath), file_get_contents($file));
}
}
}
$zip->close();
}
else {
echo 'doh!';
}
?>
aquatimer2000
Guarda a me pare che ci siano dei requisiti per creare un archivio odt, ad esempio mi pare che mimetype non deve essere compresso e con ziparchive non mi pare che puoi scegliere la compressione. Con il tuo codice ad esempio libreoffice mi dice che il file va corretto.
Io proverei solamente a sostituire content.xml:
Ovviamente in questo caso ti conviene lavorare su una copia, altrimenti vai a modificare l'originaleCodice PHP:
<?php
$zip = new ZipArchive;
$res = $zip->open('test.odt');
if ($res === TRUE) {
$content = $zip->getFromName('content.xml');
/* Fai le sostituzioni su $content */
$zip->deleteName('content.xml');
$zip->addFromString('content.xml', $content);
$zip->close();
}else {
echo 'doh!';
}
Ultima modifica di boots; 01-06-2018 a 09:22
Ci sono anche delle librerie per modificare i file odf che magari ti evitano un po' di rotture.
Dai un'occhiata a questa: https://github.com/PHPOffice/PHPWord