Italian community of Lazarus and Free Pascal

Programmazione => Componenti Aggiuntivi => Topic aperto da: CortelliStefano - Aprile 20, 2012, 11:36:40 am

Titolo: [RISOLTO] PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 20, 2012, 11:36:40 am
Un saluto a tutto il forum. Qualcuno è risucito ad installare powerpdf su Mac Os X?

Io sto provandoci su Mac Ox X 10.7 Lion, con Lazarus 0.9.28.2, ma non riesco a venirne ancora a capo.

Se installo la versione che uso correntemente per Linux e Windows, la 0.9.1, compilo correttamente il package ed eseguo il rebuild di lazarus senza problemi. Quando vado però a compilare il mio progetto che usa powerpdf ottengo il seguente errore nel modulo PdfTypes.pas:

Codice: [Seleziona]
procedure _WriteString(const Value: String; Astream: TStream);
begin
  AStream.Write(Pchar(Value)^, Length(Value));
end;

Codice: [Seleziona]
Error: Illegal type conversion: "ShortString" to "^Char"

Ho provato allora a disinstallare powerpdf e ad installare la versione corrente da Lazarus CCR, la 0.9.7 del 07/12/2011 scaricabile qui:

http://sourceforge.net/projects/lazarus-ccr/files/PowerPDF/

In questo caso tuttavia riesco a compilare il pacchetto LPK, ma al momento del rebuild di Lazarus ottengo questo errore, sempre nel modulo PdfTypes.pas, nelle dichiarazioni iniziali:

Codice: [Seleziona]
TPdfObject = class;

Codice: [Seleziona]
Error: Identifier not found "class"

Lo stesso identico problema si verifica se installo la SVN (0.9.7.1) scaricata con:

Codice: [Seleziona]
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/powerpdf

Avevo letto che un problema sotto Mac Os X era quello di sostituire le direttive di compilazione IF(N)DEF Linux con Unix e di sostutire ZLib con PasZLib nella clausola uses, ma vedo che entrambe le cose sono già così sia nella 0.9.7 che nella 0.9.7.1

Avete qualche consiglio per risolvere il problema? Non vorrei provare con le versioni 0.9.30 o successive che hanno purtroppo  fastidiosi bachi, del resto nel readme anche della SVN vedo che è stata testata con Lazarus 0.9.27 (r16875), quindi non credo che sia quello il problema.

Buona giornata a tutti,

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: xinyiman - Aprile 20, 2012, 11:47:00 am
Ciao Stefano come ben sai purtoppo non ho un Mac con cui fare delle prove! Sorry!  :-\
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 20, 2012, 12:33:34 pm
Codice: [Seleziona]
procedure _WriteString(const Value: String; Astream: TStream);
begin
  AStream.Write(Pchar(Value)^, Length(Value));
end;

Prova a cambiare in questo modo la chiamata.

Codice: [Seleziona]
procedure _WriteString(const Value: String; Astream: TStream);
begin
  AStream.Write(Value[1], Length(Value));
end;

In questo modo eviti il cast a PChar.
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 20, 2012, 12:55:53 pm
Sono andato a controllare il metodo di TStream
Codice: [Seleziona]
 Procedure TStream.WriteAnsiString (const S : String);
  Var L : Longint;

  begin
    L:=Length(S);
    WriteBuffer (L,SizeOf(L));
    WriteBuffer (Pointer(S)^,L);
  end;   
Non credo vada bene al tuo scopo ... visto che ti interesa scrivere solo il contenuto della stringa (insomma solo testo).
Codice: [Seleziona]
procedure _WriteString(const Value: String; Astream: TStream); 
begin   
  AStream.Write(Pchar(Value)^, Length(Value));
end;
Quello che ti ho indicato prima andava benissimo con Delphi.
In FreePascal dovrebbe diventare una cosa simile.
Codice: [Seleziona]
procedure _WriteString(const Value: String; Astream: TStream); 
 begin   
   AStream.Write(Pointer(Value)^, Length(Value));
 end;

Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 20, 2012, 01:24:42 pm
Ciao e grazie della velocissima risposta.

La prima soluzione sembrerebbe proprio funzionare, per lo meno non da' errore in compilazione:

Codice: [Seleziona]
AStream.Write(Value[1], Length(Value));

La seconda soluzione invece da' errore:

Codice: [Seleziona]
AStream.Write(Pointer(Value)^, Length(Value));

Error: Illegal type conversion: "ShortString" to "^untyped"

Compilando seguendo la prima soluzione, mi vedo un nuovo errore nel PdfImages.pas (da quello che ho capito PdfTypes e PdfImages sono i due moduli più ostici, se riusciamo a risolvere anche questo forse riusciamo a venirne a capo).

Il primo errore è il seguente:

Codice: [Seleziona]
PdfImages.pas(1,1) Fatal: Can't find unit QGraphics used by PdfImages

Ho pensato quindi che ci fosse qualche problema a livello di direttive di compilazione, ed ho aggiunto allora davanti a tutto:

Codice: [Seleziona]
{$DEFINE UNIX}
{$DEFINE LAZ_POWERPDF}

quindi sostituito LINUX con UNIX nelle direttive di compilazione.

Ora compilando ricevo il seguente errore:

Codice: [Seleziona]
function CreatePdfImage(AImage: TGraphic; ImageClassName: string; ObjectMgr: TPdfObjectMgr=nil): TPdfImage;
var
  PdfImageCreator: TPdfImageCreator;
begin
  Result := nil;
  {$IFDEF LAZ_POWERPDF}
  PdfImageCreator := TPdfImageCreator(PdfLazFindClass(ImageClassName).Create);
  {$ELSE}
  PdfImageCreator := TPdfImageCreator(FindClass(ImageClassName).Create);
  {$ENDIF}

Error: Identifier not found "PdfLazFindClass"

Penso anche qui che ci sia errore a livello di direttive di compilazione, ho sostituito usando sempre e solo

Codice: [Seleziona]
  PdfImageCreator := TPdfImageCreator(FindClass(ImageClassName).Create);

Adesso sembra compilare, ma viene fuori un nuovo errore, sempre in PdfImages.pas:

Codice: [Seleziona]
pb[ 0 ] := acolor.red shr 8;
pb[ 1 ] := acolor.green shr 8;
pb[ 2 ] := acolor.blue shr 8;

PdfImages.pas(275,35) Error: Incompatible types: got "LongWord" expected "TByteArray"

C'è qualcosa che posso tentare cambiare per bypassare questo errore?

Ancora grazie per l'aiuto, ciao,

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 20, 2012, 01:32:41 pm

Codice: [Seleziona]
pb[ 0 ] := acolor.red shr 8;
pb[ 1 ] := acolor.green shr 8;
pb[ 2 ] := acolor.blue shr 8;

PdfImages.pas(275,35) Error: Incompatible types: got "LongWord" expected "TByteArray"


Codice: [Seleziona]
{$ifndef fpc}
        for y := 0 to Height - 1 do
        begin
          pb := ScanLine[y];
          x := 0;
          while x < Width * PIXEL_COLOR_SIZE - 1 do
          begin
            b := pb[x];
            pb[x] := pb[x+2];
            pb[x+2] := b;
            Stream.Write(pb[x], 3);
            x := x + PIXEL_COLOR_SIZE;
          end;
{$else}
        for y := 0 to aintfimage.Height - 1 do
        begin
          new(pb);
          for x := 0 to aintfimage.Width-1 do
          begin
            aColor := aIntfImage.Colors[x,y];
            pb[ 0 ] := acolor.red shr 8;
            pb[ 1 ] := acolor.green shr 8;
            pb[ 2 ] := acolor.blue shr 8;
            Stream.write(pb[ 0 ], 3);
          end;
          dispose(pb);
{$endif}
          Attributes.AddItem('ColorSpace', TPdfName.CreateName('DeviceRGB'));


prova a cambiare il codice con p^[xxx]
Dall'errore di compilazione che riporti, il compilatore sta ancora puntando all'intero array.
Come in C/C++ se piazzi un puntatore a tipo e poi accedi come array, stai chiedendo al compilatore di accedere alla memoria (n*Size<T>) rispetto al puntatore.
Prova a derefenziare.
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 20, 2012, 04:20:09 pm
Ancora grazie dell'aiuto, sempre preciso e... risolutivo!  ;)

Ho aggiunto il ^ e adesso non da' più errore:

Codice: [Seleziona]
pb^[ 0 ] := acolor.red shr 8;
pb^[ 1 ] := acolor.green shr 8;
pb^[ 2 ] := acolor.blue shr 8;

Se può servire anche ad altri, riporto anche gli errori successivi che dovrei essere riuscito a sistemare. In gran parte si tratta di errori nelle direttive di compilazione.

1) Altro errore in fondo al modulo PdfImages:

Codice: [Seleziona]
initialization
  {$IFDEF LAZ_POWERPDF}
  PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ELSE}
  RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ENDIF}

Identifier not found "PdfLazRegisterClassAlias"

Ho cambiato allora l'IFDEF con IFNDEF in modo che utilizzasse l'altra procedura e funziona.

Codice: [Seleziona]
initialization
  {$IFNDEF LAZ_POWERPDF}
  PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ELSE}
  RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ENDIF}

2) Errore in PReport:

Codice: [Seleziona]
PReport.pas(352,50) Error: Identifier not found "TMessage"

che ho risolto semplicemente aggiungendo una direttiva di compilazione all'inizio:

Codice: [Seleziona]
{$DEFINE LAZ_POWERPDF}

3) Altro problema in PRAnnotation:

Codice: [Seleziona]
PRAnnotation(1,1) Fatal: Can't find unit Windows used by PRAnnotation

risolto anche qui aggiungendo la direttiva di compilazione:

Codice: [Seleziona]
{$DEFINE LAZ_POWERPDF}

4) Problema si sposta al modulo PdfJpegImage.pas:

Codice: [Seleziona]
PdfJpegImage.pas(1,1) Fatal: Can't find unit JPEG used by PdfJpegImage

risolto con la solita direttiva di complazione:

Codice: [Seleziona]
{$DEFINE LAZ_POWERPDF}

5) Altro errore sempre in PdfJpegImage:

Codice: [Seleziona]
PdfJpegImage.pas(79,27) Error: Identifier not found "PdfLazRegisterClassAlias"

risolto cambiando l'IFDEF con IFNDEF:

Codice: [Seleziona]
initialization

  {$IFNDEF LAZ_POWERPDF}
  PdfLazRegisterClassAlias(TPdfJpegImage, 'Pdf-Jpeg');
  {$ELSE}
  RegisterClassAlias(TPdfJpegImage, 'Pdf-Jpeg');
  {$ENDIF}

6) Ancora un errore in PdfJpegImage:

Codice: [Seleziona]
PdfJpegImage.pas(1,1) Fatal: Can't find unit Windows used by PRJpegImage

Tra l'altro la unit Windows non è neppure nominata in PRJpegImage (provato anche con il Cerca dell'IDE), penso quindi che si tratti di qualche altro modulo richiamato nella uses, presumo sempre a causa di direttive di compilazione errate da qualche parte.

Ho aggiunto quindi le direttive di compilazione:

Codice: [Seleziona]
{$DEFINE UNIX}
{$SEFINE LAZ_POWERPDF}

nei moduli finora reincontrati ed anche in PRJpegImage.pas

Al momento non ho incontrato altri errori di compilazione, anche se aspetto a scrivere "Risolto" di potere verificare il funzionamento di PowerPdf sotto Mac Os X.

Adesso vado a continuare il mio lavoro su altri errori in sede di compilazione del progetto, che però riguardano più in generale l'installazione di Lazarus e non powerpdf.

Ancora un grandissimo GRAZIE per l'aiuto, a buon rendere ...  ;)

Buona giornata a tutti,

Stefano

Ancora un grande grazie per l'aiuto,

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 20, 2012, 04:34:02 pm
Il punto 5 è errato.
PdfLazRegisterClassAlias è definito in PdfTypes.
Codice: [Seleziona]
{$IFDEF LAZ_POWERPDF}
procedure PdfLazRegisterClassAlias(aClass: TPersistentClass; Alias: string);
begin
  Classes.RegisterClass(aClass);
  if AliasList=nil then
    AliasList := TStringList.Create;
  AliasList.AddObject(Alias, TObject(aClass));
end;

Scusa la domanda, ma quando compili, hai messo come direttiva di compilazione (da IDE, per intenderci) LAZ_POWERPDF?
Non è che i problemi che incontri siano dovuto a quello? (Mi sembra che tu stia mettendo mano a tutta la libreria con modifiche ... "al volo").
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 20, 2012, 06:01:07 pm
Hai ragione, nella fretta si vede che ho sbagliato qualcosa.

Ho rimesso il codice originario:

Codice: [Seleziona]
initialization
  {$IFDEF LAZ_POWERPDF}
  PdfLazRegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ELSE}
  RegisterClassAlias(TPdfBitmapImage, 'Pdf-Bitmap');
  {$ENDIF}

senza problemi.

Tutti i moduli che mi hanno dato errore hanno la direttiva di compilazione:

Codice: [Seleziona]
{$DEFINE LAZ_POWERPDF}
{$DEFINE UNIX}

Adesso sono fermo sulla GTKWSArrow:
http://www.lazaruspascal.it/index.php?topic=292.0

ma questo non c'entra con PowerPdf.

Ancora grazie per l'aiuto,

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 24, 2012, 09:39:37 pm
Adesso sono appena riuscito a sistemare i problemi con le UIB (che mi impedivano di testare PowerPdf) e ho provato a lanciare una stampa.

Purtroppo non riesco ancora a generare PDF.

Quando lancio una stampa, ottengo l'errore:

Codice: [Seleziona]
Error reading PReport1.Author: Access violation

Press OK to ignore and risk data corruption.
Press Cancel to kill the program

Grazie per qualsiasi consiglio.

Buona serata a tutti,

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 24, 2012, 09:52:31 pm
Detta così, credo che PReport1 non sia istanziato ....
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 24, 2012, 10:04:44 pm
Grazie della velocissima risposta, hai qualche consiglio per provare a fare qualche tentativo?

Tutto sotto Linux e Windows funziona; a parte quelle due modifiche in PdfTypes e PdfImages e l'aggiunta delle direttive di compilazione per Lazarus, per il resto il codice è lo stesso e del mio progetto non ho toccato nulla.

Googlando un po' ho visto un topic nel forum ufficiale che aveva risolto mettendo le direttive di compilazione:

http://www.lazarus.freepascal.org/index.php?topic=16427.0

A me questo non è bastato. Non so se sia cambiato qualcosa sotto Lion, anche se le ultime versioni di PowerPdf sembravano avere ancora più problemi sotto Mac, come da inizio topic.

Ancora un grande grazie per il tuo tempo e il tuo aiuto, non so proprio come venire a capo del problema...  :(

Buona serata,

Stefano

Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 24, 2012, 10:18:20 pm
Diciamo che l'uso intenso delle direttive di compilazione non è il massimo ...
Se facessero i fork dei sorgenti per machine/operating system, ci sarebbero meno problemi.

Leggevo che c'è un motore interato in mac, non è che puoi fare una versione specifica per mac?
Fai tu il fork dei sorgenti.
Su Mac "specializzi" il report della fattura (immagino che su sia alle prese con documenti da inviare per posta certificata).
In questo modo utilizzi un pezzo del sistema operativo.
In questi casi metto un MD alla fine del nome del file (Machine Depend). Quello che cambia è il path dei sorgenti. In questo modo i sorgenti attorno a questi non cambiano ... fai un "Uses ....ReportMD...".
Ne fai uno "Generico" dal quale estendi le versioni per Linux e Windows.
Per Mac, è diverso. In pratica hai 4 file ...

Non so se questo cambio di struttura del progetto è un casino al punto in cui sei ... come puoi immaginare con i sorgenti davani diventerebbe più facile aiutarti.
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 24, 2012, 10:27:48 pm
Grazie ancora della pazienza, dal topic sul forum ufficiale di Lazarus ho visto che dovrebbe in teoria esserci la possibilità di usare Quartz anche se dovrei capire come.

Il punto è che ho un progetto molto complesso (oltre 250.000 righe di codice) con almeno una ventina di moduli di stampa, i quali gestiscono una serie di opzioni di stampa, sui quali dovrei andarci a mettere le mani...

Senza considerare che poi con un componente grafico come PowerPdf avrei già una serie di impostazioni della pagina già a posto ed il mio obiettivo era quindi di fare il porting di un mio progetto sotto Mac Os X.

Il vantaggio di Lazarus sarebbe proprio il fatto di essere multipiattaforma, per cui vorrei cercare se c'è qualche modo di fare funzionare questo benedetto PowerPdf sotto Mac Os X (e visto che qualcuno sembra esserci riuscito... forse non è impossibile...), che è l'unico componente che mi da' problemi (anche Synaptic per l'invio delle mails, che sapevo che aveva problemi su Mac, sembra funzionare utilizzando la svn).

Se hai qualche idea... grazie davvero...  ;)
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 24, 2012, 10:35:55 pm
Non avanto un MAC sono nell'impossibilità "fisica" di aiutarti.
Prova a chiedere aiuto nel Forum inglese.
(In ogni caso 250k di righe non è un grosso progetto ;) Secondo IBM siamo ancora ad un progetto piccolo :D Ti lascio immaginare per IBM cosa sia un progetto grande ...)
Piccola postilla, la misurazione a righe non è più utilizzata da molti anni. (Non ricordo se è utilizzata ancora con COBOL, ma le ultime metriche che ho sentito utilizzare, parlavano di funzionalità, ma siamo nell'ambito assicurativo)
Nell'ambito della programmazione ad oggetti si contano le classi.
Sotto le 500 classi è un piccolo progetto (sempre metrica IBM).
Titolo: Re:PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 25, 2012, 05:03:05 pm
Dal forum inglese ancora nessuna risposta, ma finalmente sono riuscito a risolvere.

Il problema dell'installazione della versione scaricata da Lazarus CCR (0.9.7) o della SVN era dovuto alla mancanza del path del componente nella configurazione di Lazarus/FPC.

In pratica, dopo avere disinstallato la versione che avevo di PowerPdf ed avere fatto il rebuild di Lazarus, quindi essere uscito da Lazurus:

1) Ho editato il file /private/etc/fpc.cfg ed ho aggiunto la seguente riga:

Codice: [Seleziona]
-Fu/Developer/lazarus/components/powerpdf

Purtroppo sotto Mac Os X occorre indicare tutti i path nel fpc.cfg o nelle opzioni del compilatore, lì è stato un mio errore, nella fretta mi era sfuggio di aggiungere il path al powerpdf scaricato dal CCR di Lazarus.

2) Ho aggiunto le direttive di compilazione all'inizio di tutti i moduli .pas di PowerPdf:

Codice: [Seleziona]
{$DEFINE UNIX}
{$DEFINE LAZ_POWERPDF}

3) Ho avviato Lazarus, ho compilato e poi installato PowerPdf e fatto il rebuild di Lazarus;

4) Al momento di compilare il mio progetto, non ottenevo più errore in PdfTypes, ma solamente in PdfImages, in cui occorre ancora aggiungere il carattere ^ come mi hai suggerito, quindi il codice:

Codice: [Seleziona]
pb [0]: = acolor.red shr 8;
pb [1]: = acolor.green shr 8;
pb [2]: = acolor.blue shr 8;

diventa:

Codice: [Seleziona]
pb^[0]: = acolor.red shr 8;
pb^[1]: = acolor.green shr 8;
pb^[2]: = acolor.blue shr 8;

A questo punto PowerPdf funziona correttamente.

Spero che questo possa servire anche ad altri che incontrano lo stesso problema. Credo che la stessa cosa possa funzionare anche con la svn, ma non ho provato (preferisco sempre utilizzare le versioni stabili).

Un grande grazie ancora a Stilgar, alla fine il tuo suggerimento di aggiungere il carattere ^ si è rivelato decisivo e mi ha permesso di venire a capo del problema.

Buona giornata a tutti e grazie a xinyiman per questo eccellente forum!!

Stefano
Titolo: Re:PowerPdf su Mac Os X
Inserito da: Stilgar - Aprile 25, 2012, 05:05:57 pm
Ciao,
 potresti proporre la patch, così altri non si troveranno nei casini come te.
Ciao e buona giornata anche a te.
Titolo: Re:[RISOLTO] PowerPdf su Mac Os X
Inserito da: CortelliStefano - Aprile 25, 2012, 05:38:20 pm
Certo, l'ho già scritta sul forum ufficiale di Lazarus:

http://www.lazarus.freepascal.org/index.php/topic,16427.0.html

Purtroppo il mio inglese è abbastanza scarso nello scrivere...

Ancora un grandissimo grazie per tutto l'aiuto, spero che possa servire anche ad altri che incontrano lo stesso problema.

Stefano