Newsgroup: it.comp.lang.delphi
Titolo: [D7][Firebird 1.5][FastReport 2.5] Qualcuno Utilizza La Libreria SynPDF ?

Ciao a tutti,
 
come al solito mio cognato è tornato alla carica chiedendo che alcuni report ( creati con FastReport 2.5 ) vengano prodotti in pdf.
 
Visto che ultimamente a mio cognato gli affari non è che gli vadano benissimo non vuole finanziare l'acquisto dell'ultima versione di FastReport, credo la 5.x, che ha l'export dei report in pdf.
 
Visto la "crisi" ho notato la libreria free SynPdf, a questo punto prima di fare domande puntuali per niente vorrei chiedere se qualcuno del ng utilizza con soddisfazione tale componente.
 
Un grazie a tutti.
 
Ciao da Enrico c/o Anthelios
 

 come al solito mio cognato è tornato alla carica chiedendo che alcuni report ( creati con FastReport 2.5 ) vengano prodotti in pdf.
 
E stamparli su una stampante virtuale come dopdf e tante altre 
disponibili gratuitamente ?
 
 
 
-- 
Mai mettersi a discutere con un idiota:
- prima ti porta al suo livello e poi ti batte con l'esperienza;
- chi ascolta potrebbe non capire la differenza.
 

 
 
avevo adocchiato tale possibilità, l'ho scartato per i seguenti motivi :
 
1) quelli a pagamento, anche se non costano tanto sono a pagamento ( braccino corto di mio cognato ).
2) quelli free tipo ghost qualcosa non ho ben capito come installarlo e configurarlo, qui sono io che ho limitate capacità.
 
Quello che poi ha influito sulla mia decisione è che alcuni report li devo inviare via mail, utilizzando stampanti virtuali, oltre alla loro configurazione ad hoc, dovrei, scusate il termine, "pollare" quando viene creato il pdf cosi da inviarlo al client di posta.
 
Ciao e grazie da Enrico.

 soddisfazione tale componente.
 
Questa "crisi" ha colpito un po tutti ..... ma si deve tirare avanti anche 
se tutto fa presagire a un futuro non proprio roseo !
Tornando  a synpdf io lo sto usando da tempo, ma con quickreport.
 
Credo che con poche modifiche puoi adattare questo codice per le tue 
necessita'
 
uses ....., synpdf;
 
Procedure ExportAsPdf(QuickRep: TQuickRep; const aFileName: TFileName);
var  Pdf: TPdfDocument;
     aMeta: TMetaFile;
     i: integer;
begin
Pdf := TPdfDocument.Create;
  try
    Pdf.DefaultPaperSize := psA4;
    QuickRep.Prepare;
    for i := 1 to QuickRep.QRPrinter.PageCount do
    begin
      Pdf.AddPage;
      aMeta := QuickRep.QRPrinter.GetPage(i);
      try
        // draw the page content
        Pdf.Canvas.RenderMetaFile(aMeta,1,0,0);
      finally
        FreeAndNil(aMeta);
      end;
    end;
    Pdf.SaveToFile(aFileName);
  finally
    FreeAndNil(Pdf);
  end;
end;
 
Spero ti sia utile
 
Ciao
 
Daniele 
 

Ciao Daniele,
 
intanto ti ringrazio molto per il supporto.
 
Io tramite il seguente codice sono riuscito a stampare un report di prova, solo che ho dovuto commentare le seguenti righe :
 
// vpdf.GeneratePDF15File :=true;
// vPdf.Canvas.RenderMetaFile(emf, 1, 0, 0, tpExactTextCharacterPositining);
 
per il semplice fatto che il compilatore non trova i riferimenti a GeneratePDF15File e la proprietà tpExactTextCharacterPositioning.
 
Inoltre per installare correttamente la libreria ho dovuto commentare la parte di crypting.
 
Tu sai per caso come mai non vede i riferimenti di cui sopra, eventualmente sai come si installa correttamente la libreria con il crypting ?
 
Ciao ed ancora grazie da Enrico Giudici.
 
Ecco il codice :
 
unit UFreePdf;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FR_Class, SynPdf;
 
type
  TForm1 = class(TForm)
    frReport1: TfrReport;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    frReport1.LoadFromFile('D:\Temp\Test.frf');
    frReport1.ShowReport;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i,w,h:integer;
    EMF: TMetafile;
    EMFCanvas: TMetafileCanvas;
    PageInfo: PfrPageInfo;
    vpdf : TPdfDocumentGDI;
    OutDC: HDC;
    LogX, LogY : Extended;
begin
    OutDC := Canvas.Handle;
    LogX := GetDeviceCaps(OutDC, LOGPIXELSX);
    LogY := GetDeviceCaps(OutDC, LOGPIXELSY);
 
    frReport1.LoadFromFile('D:\Vari\Medusa\RepProva.frf');
    frReport1.ShowProgress:=false;
    frReport1.PrepareReport;
 
    vpdf := TPdfDocumentGDI.Create;
//    vpdf.GeneratePDF15File :=true;
    vpdf.CompressionMethod := cmNone;
 
    vPdf.DefaultPaperSize := psA4; // setup for standard 8.5x11 Letter
    vPdf.ScreenLogPixels := 72;
 
    for i:=0 to frReport1.EMFPages.Count-1 do
     begin
        PageInfo :=frReport1.EMFPages[i];
        EMF := TMetafile.Create;
        w:=trunc(PageInfo.prninfo.pgw/logX*vpdf.ScreenLogPixels);
        h:=trunc(PageInfo.prninfo.pgh/logY*vpdf.ScreenLogPixels);
        EMF.Width := w;
        EMF.Height := h;
        EMFCanvas := TMetafileCanvas.Create(EMF, 0);
        PageInfo.Visible := True;
        frReport1.EMFPages.Draw(i, EMFCanvas,
        Rect(0, 0, w, h));
        vpdf.AddPage;
        EMFCanvas.Free;
//        vPdf.Canvas.RenderMetaFile(emf, 1, 0, 0, tpExactTextCharacterPositining);
        vPdf.Canvas.RenderMetaFile(emf, 1, 0, 0, vpdf.UseSetTextJustification);
        EMF.Free;
     end;
 
    vpdf.SaveToFile('D:\Temp\Test.pdf');
    vpdf.free;
end;
 
end.

Ciao Enrico,
   non posso dirti molto di piu' in quanto quella procedura la sto usando da 
moltissimo tempo senza mai modificarla.
 
Anche QR ha il suo componente per stampare il report in un file .pdf, ma 
preferisco (anche sbagliando) a non cambiare quello che e' stabile, 
affidabile e testato.
 
L'unico argomento da tenere in considerazione (come disse Alberto qualche 
anno fa) e' il fatto che QR per qualsiasi riferimento (numero di pagine 
ecc...) deve chiamare PREPARE.
Nel mio personalissimo caso non sono mai andato oltre qualche decina di 
pagine, quindi non ho apprezzabili deficit di prestazioni .... ma se devo 
dirottare su pdf qualche centinaia di pagine la situazione cambia.
 
Sto pensando di cambiare ambiente, ma non so su quale puntare.
 
Tornando al problema principale (synpdf) potresti, senza troppo affanno, ad 
adottare una soluzione "maccheronica" che prevede l'utilizzo delle stampanti 
virtuali (per esempio io ho pdf creator) + timer.
Soluzione veloce, di rapida implementazione senza costi.
 
Ecco la logica:
 
- Entri nella form in cui c'e' la procedura di stampa
- Chiedi il nome su cui vuoi stampare il file (test.pdf)
- Tramite un bottoncino apri il dialog di stampa da dove selezioni la 
stampante virtuale e fai partire il timer
- Nella stampante virtuale vedi il tuo pdf e lo salvi con il nome che hai 
digitato prima (e' probabile che puoi lanciare la stampante virtuale anche 
con il nome del file da creare)
- Nell'evento ontimer (per esempio ogni 10 secondi) controlli se il file 
esiste, se esiste fermi il timer e apri la tua procedura di invio email e 
fai quello che devi fare.
  All'uscita della procedura di email cancelli (salvi, sposta ecc...) il 
file dal disco per le operazioni successive (e per evitare di dare un nome 
gia' presente).
 
Se sei un programmatore professionista (non come me) tempo per realizzare 
quanto sopra 10 minuti (li ho impiegati io, quindi tu anche meno).
 
Ciao
 
Daniele
 
 

 quanto sopra 10 minuti (li ho impiegati io, quindi tu anche meno).
 
avevo già valutato questo, come ti dicevo lo avevo scartato perchè in un operazione devo generare dei pdf ( qualche decina ) e inviarli via mail ai clienti di mio cognato in modo automatico, senza interagire con lui. Ecco perchè preferivo la soluzione SynPDf per avere più controllo sulle operazioni.
 
Se ti ricordi ancora mi potresti per cortesia dirmi la procedura su come hai installato SynPDF ? A me ha dato errore sulla parte di crypting che poi non mi serve.
 
Ciao e grazie ancora da Enrico Giudici

 poi non mi serve.
 
Vai a questo link
http://synopse.info/fossil/wiki?name=PDF+Engine
 
 
scarichi l'ultima versione, la scompatti in una directory a tua scelta, 
inserisci la directory nelle preferenze di delphi e, nella forma di 
pertinenza, nelle uses indichi syspdf
 
Ciao
Daniele