Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Maverich - Maggio 22, 2012, 05:01:41 pm

Titolo: pilotare LibreOffice
Inserito da: Maverich - Maggio 22, 2012, 05:01:41 pm
mi sto ponendo il problema di aprire un documento "write" di LibreOffice/OpenOffice, cercare una sorta di marcatore posto dall'utilizzatore ed al suo posto inserire il valore di un campo proveniente da un DB.
es: posto che l'utilizzatore abbia un documento che contiene il testo [***] , dovrei aprire il documento cercare [***] (naturalmente non si conosce la posizione in cui si trova),e sostituirlo con il valore del Campo DB (mettiamo il solito Mario Rossi) che potrebbe risultare

.<testio precedente>. con il presente atto il [***]  <testo successivo>
.<testio precedente>. con il presente atto il Sig. Mario Rossi <testo successivo>

vorrei poterlo fare sia in Windows che Linux, quindi OLE non va bene.
gli esempi trovati usano sempre variabile := CreateOleObject('com.sun.star.ServiceManager');
 
non va bene neppure usare i codici Campo all'interno del Documento, vorrebbe dire rifare tutti i documenti.

esperienze in merito ?
Titolo: Re:pilotare LibreOffice
Inserito da: Stilgar - Maggio 22, 2012, 05:12:17 pm
Puoi accedere al documento ... row ... senza usare Office?
In quel caso, apri modifchi e salvi con un altro nome.
Basta un string replace.
Se ricordo bene OpenOffice è scritto in Java, quindi un'altra strada è attivare la jvm direttamente da programma, attivare office e chiamare le varie funzioni java....
Non è proprio una bella esperienza ...
C'è diventare matti ...
Titolo: Re:pilotare LibreOffice
Inserito da: nomorelogic - Maggio 22, 2012, 05:38:31 pm
c'è un'API che si chiama UNO (la stessa la dovresti trovare per openoffice)
prova a dare un'occhiata
http://api.libreoffice.org/
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 22, 2012, 05:56:50 pm
Puoi accedere al documento ... row ... senza usare Office?
In quel caso, apri modifchi e salvi con un altro nome.
Basta un string replace.

non ti seguo, comunque si, l'ide sarebbe di fare le modifiche senza aprire il documento;
nel senso seleziono il nominativo dalla griglia ed il resto dovrebbe essere automatizzato.

non credo sia cosi' semplice, salvare con altro none;  ci sono le formattazioni di LibreOffice da rispettare

Citazione
Se ricordo bene OpenOffice è scritto in Java, quindi un'altra strada è attivare la jvm direttamente da programma, attivare office e chiamare le varie funzioni java....
Non è proprio una bella esperienza ...
C'è diventare matti ...

esiste un Tool "UNO-Bridge" http://sourceforge.net/projects/uno-pas-bridge/ 
destinato a Delphi, da capire se adattabile a Lazarus.
e questo documento spiega come utilizzare UNO-Bridge

si chiama BG3400-BasicProgrammersGuide (se non va il link, google lo trova inserendo il nome del documento)
http://www.google.it/url?sa=t&rct=j&q=bg3400-basicprogrammersguide&source=web&cd=2&sqi=2&ved=0CC8QFjAB&url=http%3A%2F%2Fmedia.libreoffice.org%2Fcmis%2Fbrowser%3Fid%3Dworkspace%253A%252F%252FSpacesStore%252F7f79b9a9-9cf1-47eb-b831-320c30115621&ei=eba7T_6lIe3b4QSi-dXJCQ&usg=AFQjCNEceEJ2y0jjJj7oOFn8HbCoYlOcmg&cad=rja
Titolo: Re:pilotare LibreOffice
Inserito da: Legolas - Maggio 22, 2012, 05:59:02 pm
Se non sbaglio il formato utilizzato da *Office (OpenOffice e derivati) è uno zippone contenente dei files xml. Potrebbe bastare decomprimere, modificare uno dei files e ricomprimere  :)
Titolo: Re:pilotare LibreOffice
Inserito da: nomorelogic - Maggio 22, 2012, 06:10:55 pm
ho dato un'occhiata alle UNO...
credo che tocchi fare come dice Legolas ;)
Titolo: Re:pilotare LibreOffice
Inserito da: nomorelogic - Maggio 22, 2012, 06:16:15 pm
qua spiegano come si può pilotare openoffice con script python
http://wiki.freepascal.org/Office_Automation#Step_1._Test_UNO_via_Python_macro_run_within_OO
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 22, 2012, 06:30:05 pm
Se non sbaglio il formato utilizzato da *Office (OpenOffice e derivati) è uno zippone contenente dei files xml. Potrebbe bastare decomprimere, modificare uno dei files e ricomprimere  :)

Quotone !!!!
Io l'ho fatto proprio così.
Prendi il tuo documento "pippo.odt" e lo decomprimi in una directory di lavoro.
Apri il file "content.xml" e fai la tua sostituzione e lo risalvi.
Rizippi il tutto stando attento a fare in modo che vengano salvati solo i files e non la directory che li contiene.

Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Stilgar - Maggio 22, 2012, 10:00:24 pm
Il mio dubbio era che non avessi accesso al odt.
Per questo chiedevo se avevi accesso... al file ;)
In ogni caso, controlla con WinZip o altro se riesci ad aprire il file.
In ogni caso dovrebbe essere uno standard aperto.
C'è una sentenza di un tribunale americano dietro al formato di OpenOffice ... che vede microsoft condannata ad aprire il suo formato e adattarsi a quello "aperto".
Se non ricordo male è per il predominio del mercato Office Automation che l'ha persa, quella causa ;)
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 23, 2012, 08:02:06 am
Se non sbaglio il formato utilizzato da *Office (OpenOffice e derivati) è uno zippone contenente dei files xml. Potrebbe bastare decomprimere, modificare uno dei files e ricomprimere  :)

Quotone !!!!
Io l'ho fatto proprio così.
Prendi il tuo documento "pippo.odt" e lo decomprimi in una directory di lavoro.
Apri il file "content.xml" e fai la tua sostituzione e lo risalvi.
Rizippi il tutto stando attento a fare in modo che vengano salvati solo i files e non la directory che li contiene.

Ciao, Mario

ho provato la tua indicazione (su Linux con jZip); ho creato un documento di prova test.odt, salvato e provato a decomprimerlo (pulsante destro Extract to ...), ma risponde Unable to Open Document.
la prova l'hai fatta su Windows ?
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 23, 2012, 08:12:13 am
Ti direi che è un difetto di JZip (che però non conosco come progamma).
Per verificarlo, prova a rinominare il file cambiandogli estensione in ".zip", vedrai che lo decomprime !!!

Per il tuo progetto, non appoggiarti ad applicativi esterni: ci sono componenti di lazarus che permettono di comprimere e decomprimere.

Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 23, 2012, 06:17:27 pm
Ti direi che è un difetto di JZip (che però non conosco come progamma).
Per verificarlo, prova a rinominare il file cambiandogli estensione in ".zip", vedrai che lo decomprime !!!

Per il tuo progetto, non appoggiarti ad applicativi esterni: ci sono componenti di lazarus che permettono di comprimere e decomprimere.

Ciao, Marioontent

ho provato solo ora;
ho rinominato da .odt a .zip e decompresso; cosi' ho modificato Content.xml e apportato le variazioni;
salvo le modifiche e comprimo tutti i files rinomino da .zip a .odt ,apro il documento e le modifiche risultano OK.

grazie delle dritte; una nota se comprimo nel formato .tar.gz dopo le operazioni da .tar.gz a .odt il documento risulta illeggi tuttbile.
tutte le prove fatte a mano, ora le provero' da codice.

ciao
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 29, 2012, 05:20:38 pm
[...]
Per il tuo progetto, non appoggiarti ad applicativi esterni: ci sono componenti di lazarus che permettono di comprimere e decomprimere.

sto usando Lazarus 1.1, (da CodeTyphon 2.70 che installa molti componenti);
non mi pare di aver trovato componenti per Compressione/Decompressione (Zlib o simili).
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 29, 2012, 06:18:29 pm
Io uso questo: http://wiki.freepascal.org/paszlib (http://wiki.freepascal.org/paszlib)
Se non ricordo male, è nei sorgenti di FPC.

Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 29, 2012, 07:07:14 pm
ho trovato un'esempio nei sorgenti (***), ma non ottengo risultati
dopo la compressione trovo
TestTyponIns.zip
-->C:
-->Lazarus
-->TestZip
-->CodeTyponIns
-->... vuoto

la cartella CodeTyponIns contiene al suo interno altri files/cartelle

procedure TForm1.Button1Click(Sender: TObject);
var
  Zipper: TZipper;
  zfe: TZipFileEntry;
  I: integer;
  sNome: string;
begin
  try
    sNome := 'C:\Lazarus\TestZip\TestTyphonIns.zip';

    Zipper := TZipper.Create;
    Zipper.FileName := sNome;

    //Default Compression Level
    //zfe:=Zipper.Entries.AddFileEntry(ParamStr(0));
    zfe:=Zipper.Entries.AddFileEntry('C:\Lazarus\TestZip\CodeTyphonIns');

    //zfe:=z.Entries.AddFileEntry(ParamStr(0));     
    zfe:=Zipper.Entries.AddFileEntry('C:\Lazarus\TestZip\CodeTyphonIns');
    zfe.CompressionLevel :=clnone;
    Zipper.ZipAllFiles;
                           
  finally
    Zipper.Free;
  end;       

anche sostituendo
    zfe:=Zipper.Entries.AddFileEntry('C:\Lazarus\TestZip\CodeTyphonIns');
    zfe:=Zipper.Entries.AddFileEntry('C:\Lazarus\TestZip\CodeTyphonIns');

con
AddFileEntry(cons ADiskFileName, AArchiveFileName: string)
 
zfe:=Zipper.Entries.AddFileEntry('C:\Lazarus\TestZip', 'C:\Lazarus\TestZip\CodeTyphonIns');

il risultato non cambia.

Per la decompressione tutto bene:

procedure TForm1.Button2Click(Sender: TObject);
var UnZipper: TUnZipper;
    ZipFilePath, UnzippedFolderName: string;
begin
  ZipFilePath := 'C:\Lazarus\TestZip\CodeTyphonIns.zip';
  UnzippedFolderName := 'C:\Lazarus\TestZip';

  UnZipper := TUnZipper.Create;
  try
    UnZipper.FileName := ZipFilePath;
    UnZipper.OutputPath := UnzippedFolderName;
    UnZipper.Examine;
    UnZipper.UnZipAllFiles;
  finally
    UnZipper.Free;
  end;
end;   

ma per la compressione ... ho bisogno di un'esempio .....

(***) questo l'originale
program EnhancedZipperExample;

{$mode objfpc}{$H+}

uses
  Classes, zstream, zipper;

var
   z: TZipper;
   zfe: TZipFileEntry;
begin
  z:=TZipper.Create;
  z.FileName:='fpcCompressionLevelTestFile.zip';
  try
    //Default Compression Level
    zfe:=z.Entries.AddFileEntry(ParamStr(0));
    //Compression Level = none ( Store )
    zfe:=z.Entries.AddFileEntry(ParamStr(0));
    zfe.CompressionLevel:=clnone;
    z.ZipAllFiles;
  finally
    z.Free;
  end;
  {
   The result can be checked with the command(On Linux):
   unzip -v fpcCompressionLevelTestFile.zip
   The column Method Shows different values to each file
  }
end.
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 29, 2012, 07:29:40 pm
Ciao,
sto guardando il mio vecchio progetto. Non ne ricordo il motivo (è passato qualche anno), ma per la compressione usavo un antro componente: http://tpabbrevia.sourceforge.net/ (http://tpabbrevia.sourceforge.net/)


Questa è la procedura che avevo fatto per zippare:
Codice: [Seleziona]
{Serve per zippare
PathFilesDaZippare contiene la directory relativa, in modo che, se passata, il file
finale non conterrà tutta l'alberatura per arrivare alla directory salvata,
ma solo la directory stessa
}
  procedure Zippa(var NomeFileZip:String; FilesDaZippare:String; PathFilesDaZippare:String = ''; VFEstensioneAutomatica:Boolean = True);
  begin
    //Se è il caso, aggiungo l'estensione al nome del file
    if VFEstensioneAutomatica then begin
      if (UpperCase(ExtractFileExt(NomeFileZip)) <> UpperCase(ExtZip)) then begin
        NomeFileZip:=NomeFileZip + ExtZip;
      end;
    end;

    //Cancello il file se già esiste
    if (FileExistsUTF8(NomeFileZip)) then begin
      DeleteFileUTF8(NomeFileZip);
    end;

      AbZipper1:=TAbZipKit.Create(nil);
      try
        try
          with AbZipper1 do begin
            ArchiveType:=atZip;
            ForceType:=True;
            StoreOptions:=[soRecurse];
            CompressionMethodToUse:=smBestMethod;
            FileName:=NomeFileZip;
            if (PathFilesDaZippare <> '') then begin
              BaseDirectory:=PathFilesDaZippare;
            end;
            Addfiles(FilesDaZippare,0);
            CloseArchive;
          end;
        except
          on E: Exception do ShowMessage('Zip non riuscito: ' +
                                         LineEnding +
                                         E.Message +
                                         LineEnding +
                                         NomeFileZip +
                                         LineEnding +
                                         FilesDaZippare);
        end;
      finally
        FreeAndNil(AbZipper1);
      end;
  end;

Questa era la sua chiamata:
Codice: [Seleziona]
Zippa(NomeFileDest, GetAllFilesMask, DirDest, False);



Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 30, 2012, 09:04:01 am
Ho scaricato il pacchetto "Abbrivia" e installato regolarmente su Delphi;
ma per Lazarus non c'e' il package (.lpk)
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 30, 2012, 10:52:45 am
Ho scaricato il pacchetto "Abbrivia" e installato regolarmente su Delphi;
ma per Lazarus non c'e' il package (.lpk)

ho risolto inserendo nelle uses
  AbZipper, AbZipTyp, AbUtils;

ma devo disabilitare nella unit AbCharSet

{ Unicode backwards compatibility types }
(*{$IF NOT DECLARED(RawByteString)}
type
  RawByteString = AnsiString;
{$IFEND}

{$IF NOT DECLARED(UnicodeString)}
type
  UnicodeString = WideString;
{$IFEND}
*)
Titolo: Re:pilotare LibreOffice
Inserito da: Legolas - Maggio 30, 2012, 11:22:56 am
Qui, in particolare:
http://wiki.freepascal.org/FreePascalArchivePackage

oppure qui, più in generale:
http://wiki.freepascal.org/Components_and_Code_examples#Archiving

:)
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 30, 2012, 03:39:04 pm
Qui, in particolare:
http://wiki.freepascal.org/FreePascalArchivePackage

oppure qui, più in generale:
http://wiki.freepascal.org/Components_and_Code_examples#Archiving

:)

ho scaricato la rel. 3.05 , e le operazioni di Compresisone/Decompressione vanno;
non posso pero' usare la unit AbZView , genera errori a catena.

la AbZView volevo usarla per visualizzare i file letti da un .zip , come negli esempi per Delphi7 (che pero' ha un package).

ma al momento non ho trovato uno straccio di documentazione su come farlo in Lazarus.

es: disabilito questa
(*
{$IFDEF UsingCLX}
    procedure FontChanged; override;
    procedure SizeChanged(OldColCount, OldRowCount: Longint); override;
{$ELSE}
    procedure WMSize(var Msg: TWMSize);
      message WM_SIZE;
    procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd);
      message WM_ERASEBKGND;
    procedure CMFontChanged(var Message: TMessage);
      message CM_FONTCHANGED;
{$ENDIF UsingCLX}
*)

linea 300 , mi dice che non esiste un metodo nella classe padre

    procedure ColumnMoved(FromIndex, ToIndex: Longint);
      override;


Titolo: Re:pilotare LibreOffice
Inserito da: Stilgar - Maggio 30, 2012, 03:48:20 pm
Sono andato a controllare.
Esiste un componente per Lazarus ... ;)
fpSpreadsheet  (http://wiki.freepascal.org/FPSpreadsheet)
Ha un file che si chiama : fpszipper.pp
Magari può essere di qualche aiuto ... solo per Lazarus...
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 30, 2012, 06:10:55 pm
Ciao,
scusa il ritardo ma sono un po' incasinato al lavoro. Io il pacchetto non l'ho onstallato, ma aggiungo queste alla uses:
Codice: [Seleziona]
AbArcTyp,
    AbUnzPrc,
    AbUtils ,
    AbZipTyp,
    AbZipKit,

Per visualizzare l'elenco dei files contenuti in uno zip, tempo fa' ho fatto questo:
Codice: [Seleziona]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, PrintersDlgs, Forms, Controls, Graphics, Dialogs,
  StdCtrls, AbZBrows, BonMarUtils;

type

  { TForm1 }

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
const NomeFileZip='C:\_______SalvataggiEsportazione\P1PW_20110930091530_AF_____Ultimo fatto con AMFGS32 vecchio.zip';
var AbZipBrowser:TAbZipBrowser;
    Idx:Integer;
begin
  //Emetto l'elenco dei files contenuti in un file zip con qualche informazione accessoria

  Memo1.Lines.Clear;

  AbZipBrowser:=TAbZipBrowser.Create(nil);
  try
    AbZipBrowser.OpenArchive(NomeFileZip);
    for Idx:=0 to AbZipBrowser.Count - 1 do begin
      if (not AbZipBrowser.Items[Idx].IsDirectory) then begin
        Memo1.Lines.Add(RiempiStringa(MettiPunti(Idx), 3, '0', rsPrima) +
                        ' - ' +
                        MyDateTimeToStr(AbZipBrowser.Items[Idx].LastModTimeAsDateTime) +
                        ' - ' +
                        RiempiStringa(MettiPunti(AbZipBrowser.Items[Idx].UncompressedSize), 10, ' ' , rsPrima) +
                        ' - ' +
                        AbZipBrowser.Items[Idx].DiskFileName);
      end;
    end;
  finally
    FreeAndNil(AbZipBrowser);
  end;
end;

end.

Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Stilgar - Maggio 31, 2012, 09:19:14 am
mmm.
Devo guardare i sorgenti ... ma ad occhio stai facendo una spece di TAR ...
Codice: [Seleziona]
zfe.CompressionLevel:=clnone;
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Maggio 31, 2012, 06:08:01 pm
ho risolto con la unit da te indicata AbZBrows, una curiosita'
come facevi a fare questa verifica:

if (not AbZipBrowser.Items[Idx].IsDirectory) ...

ora il metodo IsDirectory si trova nella classe TFileIterator della FileUtil.


Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Maggio 31, 2012, 06:50:22 pm
Non saprei, a me lo trova sotto AbArcTyp.pas.
Codice: [Seleziona]
    property IsDirectory: Boolean
      read GetIsDirectory;

Magari dipende dall'ordine con cui hai messo le uses. Prova magari a mettere AbZBrows per prima.

Ciao, Mario
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Giugno 01, 2012, 02:57:44 pm
Non saprei, a me lo trova sotto AbArcTyp.pas.
Codice: [Seleziona]
    property IsDirectory: Boolean
      read GetIsDirectory;

Magari dipende dall'ordine con cui hai messo le uses. Prova magari a mettere AbZBrows per prima.

Ciao, Mario

ho controllato, la AbArcTyp.pas rel. 3.05 del 12/01/2007 (parte dei files fpArchive) non ha la property IsDirectory.
la tua che data/rel. riporta ?
Titolo: Re:pilotare LibreOffice
Inserito da: Maverich - Giugno 01, 2012, 03:08:32 pm
Citazione
[...]
ho controllato, la AbArcTyp.pas rel. 3.05 del 12/01/2007 (parte dei files fpArchive) non ha la property IsDirectory.
la tua che data/rel. riporta ?

ho trasportato il mio test usando i sorgenti Abbrevia 5.0, e nella unit AbArcTyp (del 26/11/2011) trovo IsDirectory.
Titolo: Re:pilotare LibreOffice
Inserito da: bonmario - Giugno 01, 2012, 03:19:56 pm
Stavo per risponderti !!!
Io infatti uso la versione 5.0.

Ciao, Mario