[Zope-it] Re: [Zope-it] Editabilità di un documento: UNA SOLUZIONE INCOMPLETA (MA BELLA!)

Maurizio Betti mbetti@inf.unitn.it
Mon, 31 Mar 2003 02:58:40 +0200


--=====================_206717==_.ALT
Content-Type: text/plain; charset="iso-8859-1"; format=flowed
Content-Transfer-Encoding: quoted-printable

At 11.14 19/03/2003 +0100, you wrote:
>E possibile Creare, in una applicazione web realizzata con Zope, un=20
>documento in formato doc dove vengono immessi i dati immagazzinati in un=20
>database?Con Microsoft Access =E8 possibile farlo. Mi chiedevo se potevo=20
>realizzare questo anche con il Browser.

Guarda, io avevo un problema simile e l'ho risolto in questo modo:

1. Crei un documento .doc di partenza vuoto con dei SEGNALIBRI che indicano=
=20
dove vanno messe le informazioni che prelevi dal db e lo salvi ad esempio=20
in c:\temp

2. Crei un file .py che copi nella cartella extensions di Zope con un=20
codice come quello riportato sotto (NB: devi avere installato le librerie=20
win32com che scarichi da internet). Come vedi il main prende in input un=20
campo titoloAF (che viene passato da Zope che lo preleva dal DB), apre il=20
documemento esistente (docName), va al segnalibro, ci caccia dentro il=20
testo passato in input e salva il file sul FS del server con un nome=20
diverso (ID_AF) rispetto all'originale di partenza.

#######################################################
import win32com, sys, string, win32api, traceback
import win32com.client.dynamic
from pythoncom import CoInitializeEx, COINIT_MULTITHREADED

def main(docName, ID_AF, titoloAF):
     ID_AF=3Dstr(ID_AF)+'.doc'
     myDir=3D'E:\\temp\\'
     CoInitializeEx(COINIT_MULTITHREADED)
     w=3Dwin32com.client.dynamic.Dispatch("Word.Application")
     w.Visible=3D1
     myDoc=3Dw.Documents.Open(myDir + docName)
     #Vado al segnalibro 'titoloAF'
     myRange =3D myDoc.GoTo(Name=3D'titoloAF')
     #Inserisco il testo relativo
     myRange.InsertAfter(titoloAF)
     #Salvo il documento
     myDir=3D'E:\\temp\\'
     myDoc.SaveAs(myDir+ID_AF)
     myDoc.Close()
     myDoc=3Dw.Documents.Open(myDir+ID_AF)
     #myDoc.PrintOut()
     myDoc.Close()
     return 'Documento pubblicato con successo!'

#Routine che salva il documento
def saveAs(self, filename):
     self.wordDoc.SaveAs(filename)

#Routine che stampa il documento
def printout(self):
     self.wordDoc.PrintOut()
#######################################################

3. Dopo aver  "importato" il file .py in Zope usando ExternalMethod lo=20
richiami da un DTML Document con un codice del tipo

<dtml-in expr=3D"spGetAF(ID_AF=3DID_AF)">
     <dtml-var expr=3D"manageDoc(docName=3D'nomeDocSrc.doc',=20
ID_AF=3D'nomeDocRis', titoloAF=3D'campo prelevato da DB')">
      <dtml-call=20
expr=3D"RESPONSE.redirect('../../myFS/ResultDoc/'+_.str(ID_AF)+'.doc')">
</dtml-in>

dove spGetAF =E8 lo ZSQL che preleva i dati dal DB e manageDoc il nome=20
dell'ExternalMethod.

4. A questo punto di ritrovi con il file salvato sul FS del Server. Il=20
problema che rimane =E8 quello di passare il file da FS al db ad oggetti di=
=20
Zope (se ti serve questo passaggio). Io questo non sono riuscito ad=20
automatizzarlo completamente (se qualcuno ha suggerimenti BATTA UN COLPO!)=
=20
e l'ho risolto utilizzando il prodotto LocalFS (id: myFS) che mi offre una=
=20
visione logica del disco fisico. In pratica dopo aver salvato il file=20
redirigo l'utente (RESPONSE.redirect) su quel file. L'utente scarica il=20
file in locale e con una form di tipo "file" lo inserisce in ZOPE=20
(manage_addfile()).

L'ultima parte =E8 forse un po' macchinosa, ma il risultato nel complesso=20
devo dire che non =E8 niente male!

spero di esserti stato d'aiuto e se hai dubbi scrivi.

ciao, Mau



--=====================_206717==_.ALT
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
At 11.14 19/03/2003 +0100, you wrote:<br>
<blockquote type=3Dcite class=3Dcite cite><font face=3D"arial" size=3D2>E
possibile Creare, in una applicazione web realizzata con Zope, un
documento in formato doc dove vengono immessi i dati immagazzinati in un
database?Con Microsoft Access =E8 possibile farlo. Mi chiedevo se potevo
realizzare questo anche con il Browser. </font></blockquote><br>
Guarda, io avevo un problema simile e l'ho risolto in questo
modo:<br><br>
1. Crei un documento .doc di partenza vuoto con dei SEGNALIBRI che
indicano dove vanno messe le informazioni che prelevi dal db e lo salvi
ad esempio in c:\temp<br><br>
2. Crei un file .py che copi nella cartella extensions di Zope con un
codice come quello riportato sotto (NB: devi avere installato le librerie
win32com che scarichi da internet). Come vedi il main prende in input un
campo titoloAF (che viene passato da Zope che lo preleva dal DB), apre il
documemento esistente (docName), va al segnalibro, ci caccia dentro il
testo passato in input e salva il file sul FS del server con un nome
diverso (ID_AF) rispetto all'originale di partenza.<br><br>
#######################################################<br>
import win32com, sys, string, win32api, traceback<br>
import win32com.client.dynamic<br>
from pythoncom import CoInitializeEx, COINIT_MULTITHREADED<br><br>
def main(docName, ID_AF, titoloAF):<br>
&nbsp;&nbsp;&nbsp; ID_AF=3Dstr(ID_AF)+'.doc'<br>
&nbsp;&nbsp;&nbsp; myDir=3D'E:\\temp\\'<br>
&nbsp;&nbsp;&nbsp; CoInitializeEx(COINIT_MULTITHREADED)<br>
&nbsp;&nbsp;&nbsp;
w=3Dwin32com.client.dynamic.Dispatch(&quot;Word.Application&quot;)<br>
&nbsp;&nbsp;&nbsp; w.Visible=3D1<br>
&nbsp;&nbsp;&nbsp; myDoc=3Dw.Documents.Open(myDir + docName)<br>
&nbsp;&nbsp;&nbsp; #Vado al segnalibro 'titoloAF'<br>
&nbsp;&nbsp;&nbsp; myRange =3D myDoc.GoTo(Name=3D'titoloAF')<br>
&nbsp;&nbsp;&nbsp; #Inserisco il testo relativo<br>
&nbsp;&nbsp;&nbsp; myRange.InsertAfter(titoloAF)<br>
&nbsp;&nbsp;&nbsp; #Salvo il documento<br>
&nbsp;&nbsp;&nbsp; myDir=3D'E:\\temp\\'<br>
&nbsp;&nbsp;&nbsp; myDoc.SaveAs(myDir+ID_AF)<br>
&nbsp;&nbsp;&nbsp; myDoc.Close()<br>
&nbsp;&nbsp;&nbsp; myDoc=3Dw.Documents.Open(myDir+ID_AF)<br>
&nbsp;&nbsp;&nbsp; #myDoc.PrintOut()<br>
&nbsp;&nbsp;&nbsp; myDoc.Close()<br>
&nbsp;&nbsp;&nbsp; return 'Documento pubblicato con successo!'<br><br>
#Routine che salva il documento<br>
def saveAs(self, filename):<br>
&nbsp;&nbsp;&nbsp; self.wordDoc.SaveAs(filename)<br><br>
#Routine che stampa il documento<br>
def printout(self):<br>
&nbsp;&nbsp;&nbsp; self.wordDoc.PrintOut()<br>
#######################################################<br><br>
<font face=3D"arial" size=3D2>3. Dopo aver&nbsp; &quot;importato&quot; il
file .py in Zope usando ExternalMethod lo richiami da un DTML Document
con un codice del tipo<br><br>
&lt;dtml-in expr=3D&quot;spGetAF(ID_AF=3DID_AF)&quot;&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;dtml-var
expr=3D&quot;manageDoc(docName=3D'nomeDocSrc.doc', ID_AF=3D'nomeDocRis',
titoloAF=3D'campo prelevato da DB')&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;dtml-call
expr=3D&quot;RESPONSE.redirect('../../myFS/ResultDoc/'+_.str(ID_AF)+'.doc')&=
quot;&gt;<br>
&lt;/dtml-in&gt;<br><br>
dove spGetAF =E8 lo ZSQL che preleva i dati dal DB e manageDoc il nome
dell'ExternalMethod.<br><br>
4. A questo punto di ritrovi con il file salvato sul FS del Server. Il
problema che rimane =E8 quello di passare il file da FS al db ad oggetti di
Zope (se ti serve questo passaggio). Io questo non sono riuscito ad
automatizzarlo completamente (se qualcuno ha suggerimenti BATTA UN
COLPO!) e l'ho risolto utilizzando il prodotto LocalFS (id: myFS) che mi
offre una visione logica del disco fisico. In pratica dopo aver salvato
il file redirigo l'utente (RESPONSE.redirect) su quel file. L'utente
scarica il file in locale e con una form di tipo &quot;file&quot; lo
inserisce in ZOPE (manage_addfile()).<br><br>
L'ultima parte =E8 forse un po' macchinosa, ma il risultato nel complesso
devo dire che non =E8 niente male!<br><br>
spero di esserti stato d'aiuto e se hai dubbi scrivi.<br><br>
ciao, Mau<br><br>
<br>
</font></html>

--=====================_206717==_.ALT--