Newsgroup: it.comp.www.php
Titolo: MS Word su Unix/Linux

Ciao a tutti.
Ho questo problema:
dovrei generare dinamicamente in PHP (lato server!) dei documenti MS Word
(con formattazioni...quindi non posso generare dei semplici .txt).
Il tutto pero' dovrebbe funzionare su server Unix/Linux (quindi senza
supporto COM).
Ho trovato una cosa simile che pero' lavora (e funziona, l'ho testata) solo
per MS Excel:
si chiama BiffWriter (si trova sia su Pear, che su 
phpclasses.org
, ecc.)
Sapete se e' reperibile qualcosa del genere che lavori con MS Word???
P.S.:...il committenti vuole documenti MS Word, la soluzione PDF è, per il
momento, stata accantonata...
Grazie.
Luca

 Sapete se e' reperibile qualcosa del genere che lavori con MS Word???
Purtroppo non ti so dare una risposta però, visto che il formato M$ Word 
è un formato chiuso e proprietario di cui non si sanno le specifiche, 
dubito che qualcuno si sia preso la briga di fare un moduletto per poter 
creare file Word. Comunque se mi dici che esiste per Excel allora può 
darsi che esista anche per Word ma sicuramente sarà piuttosto limitato 
(dal fatto che tutte le info circa i file M$ Word devono essere state 
recuperate attraverso reverse-engineering).
Fossi in te farei questo discorso al committente:
1) Io ti metto il supporto M$ Word se mi dai le specifiche del loro 
formato, altrimenti mi spiace ma non è possibile;
2) Il formato M$ Word obbliga i loro clienti ad aver acquistato M$ 
Office, cosa che non accade con un formato di file aperto come PDF, RTF, 
etc. quindi è per il loro bene non usare formati che obblighino i loro 
utenti ad acquistare software apposito.
Scusa se non ti ho risposto ma purtroppo non ho idea di come risolvere 
il tuo problema se non appunto usando file non M$ Word.
Ciao,
   Luca
-- 
Linux registered user #291568 (
http://counter.li.org/
)
Electronic Frontier Foundation Member (
http://www.eff.org/
)
Mandrake Club Member (
http://www.mandrakeclub.com/
)

creare file Word.
Ricordo che parecchio tempo fa lessi su un ng (non chiedetemi quale)
che qualcuno aveva trovato le specifiche dei file .doc spiattellate in
bella vista da qualche parte in rete.
Come informazione č un po' vaga ma magari con una ricerca un po' piů
approfondita...

 momento, stata accantonata...
In genere, il committente vuole che il file si *apra* con m$ word, non 
che sia necessariamente un .DOC. Io ho fatto una cosa del genere in un 
ambiente diverso, mettendo un template di file .RTF in un campo di un DB 
e riempendolo con i valori giusti prima di scaricarlo. Se setti 
correttamente il MIME type sul server potresti fargli apparire anche la 
finestrella "apri questo documento con l'applicazione di default (Word)".
Per fargli riconsiderare la cosa, ricordagli che RTF: e' uno standard 
aperto ma si apre anche con uord (<- non e' un errore BD), non ha 
problemi del tipo "scritto con word9x e non dice che si potrebbe vedere 
male con win9y", si zippa meglio (se lo vuoi comprimere per lo 
scaricamento o dopo) ecc. :D
-- 
Saluti >^_^<
Hatanaka

> Sapete se e' reperibile qualcosa del genere che lavori con MS Word???
Ho risolto brutalmente, ma brillantemente, "costringendo" gli utenti ad 
adoperare OpenOffice. La struttura dei file sxw di openoffice,
anche non leggendo documentazioni, è abbastanza chiara.
Mi sono fatto vari modelli con dei "campi" (chiamiamoli così) del tipo
@@@COGNOME@@@, @@@NOME@@@, @@@ORARIO@@@, ecc., che poi vengono
opportunamente sostituiti. Si riesce anche a creare dinamicamente 
immagini e metterle dentro il documento.
È un occasione da non perdere per convincere i tuoi utenti a passare
all'open source...
gpb

Concordo.
Un altra soluzione, che io ho adoperato, è stata quella di "costringere"
gli utenti ad adoperare OpenOffice.
Dal punto di vista di programmazione il formato sxw è abbastanza
semplice da manipolare. Personalmente mi sono fatto vari modelli con
dei "campi" (chiamiamoli così) del tipo @@@COGNOME@@@, @@@NOME@@@,
@@@ORARIO@@@, ecc., che sostituisco con i dati opportuni in php.
Riesco anche a sostituire immagini dentro un documento mettendone
di altre create dinamicamente, ed è pure facile.
È un opportunità DA NON PERDERE per far passare gli utenti al software
open source (per di più gratuito).
gpb

 per MS Excel:
ti allego un esempio di una esportazione mysql => in .xls  dal programma=>
http://www.swisse.net/cms/2,6,100/it/
   PHP-Barcode Faktura
magari ti arriva l'idea....
Ciao PK
scrivendo i dati in tabulazione (\t) viene excel
if (isset($w) && ($w==1)){
$file_type = "msword";
$file_ending = $table . "_" . $now_date . ".doc";
}
else {
$file_type = "vnd.ms-excel";
$file_ending = $tableb . "_" . $now_date . ".xls";
}
//header info for browser: determines file type ('.doc' or '.xls')
header("Content-Type: application/$file_type");
header("Content-Disposition: attachment; filename=$file_ending");
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
--------------------------------------------------------
<?php
////header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
////header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
////header("Cache-Control: no-cache, must-revalidate");
////header("Pragma: no-cache");
include($DOCUMENT_ROOT . "/_ini_setting.php");
/////include_once($path_me_self . $includedir . "language/it.php");
include_once($path_me_self . $includedir . "auth.php");
/////echo"dfhdfhdfh";
////exit;
$sql = "select * from $tableb ";
$Use_Title = 1;
//define date for title: EDIT this to create the time-format you need
$now_date = date('m-d-Y-H-i');
//define title for .doc or .xls file: EDIT this if you want
$title = "Dump From  $now_date table $tableb";
$result = @mysql_query($sql)
    or die("Couldn't execute query:<br>" . mysql_error(). "<br>" .
mysql_errno());
if (isset($w) && ($w==1)){
$file_type = "msword";
$file_ending = $table . "_" . $now_date . ".doc";
}
else {
$file_type = "vnd.ms-excel";
$file_ending = $tableb . "_" . $now_date . ".xls";
}
//header info for browser: determines file type ('.doc' or '.xls')
header("Content-Type: application/$file_type");
header("Content-Disposition: attachment; filename=$file_ending");
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
/*
A NOTE ABOUT USING THIS SCRIPT WITH SSL:
==============================================
To get this script to work properly in MSIE,
do the following:
//delete this header:
header("Pragma: no-cache");
//and add these headers just after the "Expires: 0" header:
header("Keep-Alive: timeout=15, max=100");
header("Connection: Keep-Alive");
header("Transfer-Encoding: chunked");
Thanks to Christopher Owens for this!
==============================================
*/
/*    Start of Formatting for Word or Excel    */
if (isset($w) && ($w==1)) //check for $w again
/*    FORMATTING FOR WORD DOCUMENTS ('.doc')   */
{
//create title with timestamp:
if ($Use_Title == 1){
echo("$title\n\n");
}
//define separator (defines columns in excel & tabs in word)
$sep = "\n"; //new line character
    while($row = mysql_fetch_row($result))
    {
        //set_time_limit(60); // HaRa
        $schema_insert = "";
        for($j=0; $j<mysql_num_fields($result);$j++)
        {
        //define field names
        $field_name = mysql_field_name($result,$j);
        //will show name of fields
        $schema_insert .= "$field_name:\t";
            if(!isset($row[$j])) {
                $schema_insert .= "NULL".$sep;
                }
            elseif ($row[$j] != "") {
                $schema_insert .= "$row[$j]".$sep;
                }
            else {
                $schema_insert .= "".$sep;
                }
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        //end of each mysql row
        //creates line to separate data from each MySQL table row
        print "\n----------------------------------------------------\n";
}
}
else
/*    FORMATTING FOR EXCEL DOCUMENTS ('.xls')   */
{
//create title with timestamp:
if ($Use_Title == 1){
echo("$title\n");
}
//define separator (defines columns in excel & tabs in word)
$sep = "\t"; //tabbed character
//start of printing column names as names of MySQL fields
for ($i = 0; $i < mysql_num_fields($result); $i++) {
echo mysql_field_name($result,$i) . "\t";
}
print("\n");
//end of printing column names
//start while loop to get data
/*
note: the following while-loop was taken from phpMyAdmin 2.1.0.
--from the file "lib.inc.php".
*/
    while($row = mysql_fetch_row($result))
    {
        //set_time_limit(60); // HaRa
        $schema_insert = "";
        for($j=0; $j<mysql_num_fields($result);$j++)
        {
            if(!isset($row[$j]))
                $schema_insert .= "NULL".$sep;
            elseif ($row[$j] != "")
                $schema_insert .= "$row[$j]".$sep;
            else
                $schema_insert .= "".$sep;
        }
        $schema_insert = str_replace($sep."$", "", $schema_insert);
  //following fix suggested by Josue (thanks, Josue!)
  //this corrects output in excel when table fields contain \n or \r
  //these two characters are now replaced with a space
  $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
        $schema_insert .= "\t";
        print(trim($schema_insert));
        print "\n";
    }
}
?>
--------------------------------------------------------


open source (per di più gratuito).
E alla tipica osservazione (dopo circa dieci minuti di utilizzo)
"Ma... ma questo E' WORD!", rispondere "Purtroppo no! Ancora non
c'e' il supporto per i macro virus." :-)
Leonardo
-- 
the shadow of the dome of pleasure
floated midway on the waves,
where was heard the mingled measure
from the fountain and the caves.

Grazie a tutti per i preziosi consigli...
...credo che opterò per la soluzione template .rtf e funzioni  tipo
str_replace()... non avevo considerato l'ipotesi .rtf poiché pensavo
fosse formattato tipo MS Word e che quindi non si potesse aprire il
file, leggerne il conenuto e poi modificarne il testo con le normali
funzioni per manipolazione stringhe...
Grazie comunque e di nuovo a tutti.
Ciao, Luca.


Se sono ancora in tempo a convincerti, passa a OpenOffice.
Anch'io inizialmente ho adoperato la tua soluzione, ma sono andato
in crisi per gestire immagini. Il formato sxw è uno zip,
e all'interno contiene testo e immagini separate, è semplicissimo
gestirlo, e OpenOffice è "gratis". Una volta capita la struttura
di tali files puoi ad esempio crearti delle presentazioni, disegni,
fogli elettronici, in formato OpenOffice, con pauerpoint o ecscel
come fai?
Comunque se non devi inserire immagini non è necessario aprire il
file "modello" con un editor di testo; ti è sufficiente creare un
documento dove al posto del testo da sostituire metti dei "tag",
tipo @@@NOME@@@, @@@ORARIO@@@, ecc., salvarlo e sei a posto.
<subliminal on>
  usa OpenOffice, aiuta il software libero!
  usa OpenOffice, aiuta il software libero!
  usa OpenOffice, aiuta il software libero!
<subliminal off>
Bye
	gpb