Bonjour à tous,
Bon, aujourd'hui (depuis longtemps) j'ai un soucis avec l'utilisation de synPDF.
C'est vrai que ce n'est pas un composant VCL mais je ne savais pas trop ou mettre ma discussion ...
C'est un outil qui a l'air super pour faire des PDF (gratuit, open source, communautaire ...) mais j'ai un soucis avec :
... et a priori je ne suis pas le seul : https://synopse.info/forum/viewtopic.php?id=1658

Je génère une facture avec printer.canvas, tout va bien, cela fonctionne très bien avec l'imprimante ou une imprimante PDF virtuelle quelconque.
J'ai décidé de travailler avec synPDF pour fabriquer directement un PDF, on travaille aussi avec un canvas, donc, peu de modif au niveau du code.
Par contre, quand je travaille avec, l'impression ne se fait pas à la même échelle, c'est bien plus gros avec synPDF que sur les autres imprimantes.

J'ai voulu travailler avec les paramètres donnés par l'API GetDeviceCaps (je travaille avec ça pour les imprimantes réelles et virtuelles) mais pour synPDF, GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH) donne la valeur 0
idem pour PHYSICALHEIGHT. Donc impossible de faire quoi que ce soit avec.
La déclaration de l'objet est faite comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
           //https://www.youtube.com/watch?v=hD6e6iGvBYE
 Var
   FichierEtat:String;
begin
          lPdf:=TPdfDocumentGDI.Create(false,0,false);
           lPdf.GeneratePDF15File := true;
           lPdf.DefaultPaperSize := psA4;
           lPdf.DefaultPageLandscape := false;
           lPdf.CompressionMethod := cmFlateDecode;
           lPdfPage:=lPdf.AddPage;
           aCanvas:=lPdf.VCLCanvas;
           GetPrinterParameters(aCanvas);
end;
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.GetPrinterParameters(aCanvas : TCanvas);
begin
   sPixelParPouceHorizontal := GetDeviceCaps(aCanvas.Handle, LOGPIXELSX);  // DPIx
   sPixelParPouceVertical   := GetDeviceCaps(aCanvas.Handle, LOGPIXELSY);  // DPIy
 
   sPixelParPouceHorizontalEcran := Screen.PixelsPerInch;  // DPIx
   sPixelParPouceVerticalEcran   := Screen.PixelsPerInch;  // DPIy
 
   sDimensionPixelZoneImpressionUtileHorizontale := GetDeviceCaps(aCanvas.Handle, HORZRES);
   sDimensionPixelZoneImpressionUtileVerticale   := GetDeviceCaps(aCanvas.Handle, VERTRES);
 
   sDimensionMilimetreZoneImpressionUtileHorizontale := GetDeviceCaps(aCanvas.Handle, HORZSIZE);
   sDimensionMilimetreZoneImpressionUtileVerticale := GetDeviceCaps(aCanvas.Handle, VERTSIZE);
 
   sLargeurPixelPagePhysique := GetDeviceCaps(aCanvas.Handle, PHYSICALWIDTH);
   sHauteurPixelPagePhysique := GetDeviceCaps(aCanvas.Handle, PHYSICALHEIGHT);
 
   sEchelleX := GetDeviceCaps(aCanvas.Handle, SCALINGFACTORX);
   sEchelleY := GetDeviceCaps(aCanvas.Handle, SCALINGFACTORY);
 
   sMargeGauche := GetDeviceCaps(aCanvas.Handle, PHYSICALOFFSETX);
   sMargeHaute := GetDeviceCaps(aCanvas.Handle, PHYSICALOFFSETY);
   sMargeDroite := sLargeurPixelPagePhysique - sDimensionPixelZoneImpressionUtileHorizontale - sMargeGauche;
   sMargeBasse :=  sHauteurPixelPagePhysique - sDimensionPixelZoneImpressionUtileVerticale - sMargeHaute;
 
end;
Cet après midi j'ai trouvé un bout de code sur le net, j'ai fait des essais et en tâtonnant j'ai trouvé les bords de la feuille A4 virtuelle de synPDF :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Math, DateUtils, SynCommons, SynPDF,
  Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 lPdf   : TPdfDocument;
 lPage  : TPdfPage;
begin
  lPdf := TPdfDocument.Create;
  try
    lPdf.Info.Author        := 'Tester';
    lPdf.Info.CreationDate  := Now;
    lPdf.Info.Creator       := 'Tester';
    lPdf.DefaultPaperSize   := psA4;
    lPage := lPDF.AddPage;
    lPDF.Canvas.SetFont('Helvetica',10.0,[]);
    lPDF.Canvas.SetLeading(lPDF.Canvas.Page.FontSize);
    lPDF.Canvas.SetLineWidth(0.1);
 
    //lPdf.Canvas.BeginText;             //                       
    lPdf.Canvas.TextOut( 0, 0,  '1');    // Gauche Bas        
    lPdf.Canvas.TextOut( 0, 835,  '2');  // Gauche Haut       
    lPdf.Canvas.TextOut( 590, 835,  '3');// Droite Haut      
    lPdf.Canvas.TextOut( 590, 0,  '4');  // Droite Bas      
                                         //                   
    lPdf.Canvas.TextOut( 295, 418,  'X');// Milieu           
 
    //lPdf.Canvas.EndText;
    lPdf.SaveToFile('c:\temp\test.pdf');
  finally
    lPdf.Free;
  end;
end;
end.
... et on constate que le bord 0,0 est en bas à gauche et non en haut à gauche dans ce code.


Quelqu'un bosse avec cette librairie pour me donner de l'info ?
Merciiiiiiii