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 :
et
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;
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 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;
... et on constate que le bord 0,0 est en bas à gauche et non en haut à gauche dans ce code.
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.
Quelqu'un bosse avec cette librairie pour me donner de l'info ?
Merciiiiiiii
Partager