Bonjour,

Je développe une application en C# avec iTextSharp.

J'ai développé une classe LabelPDFPoint qui doit permettre de créer des documents avec iTextSharp en définissant les positions des éléments graphique en mm., cette classe se chargeant de réaliser la conversion en points, qui est l'unité utilisée par défaut par iTextSharp.

Elle dérive d'une classe LabelPoint qui me permet de faire de la programmation générique en gérant d'autres formats.

Le code de la classe est le suivant :

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
 
namespace Utilities
{
 
    public class LabelPDFPoint : LabelPoint
    {
 
        public static float InitX = -1;
        public static float InitY = -1;
 
        public  float Xmm
        {
            get
            {
 
                return xmm;
            }
            set
            {
                xmm = value;
            }
        }
 
        public  float Ymm
        {
            get
            {
 
                return ymm;
            }
            set
            {
                ymm = value;
            }
        }
 
        public  float XLabel
        {
            get
            {
                xLabel = (float)(InitX + iTextSharp.text.Utilities.MillimetersToPoints(xmm));
 
                return xLabel;
            }
            set
            {
                xLabel = value;
            }
        }
 
        public  float YLabel
        {
            get
            {
 
               yLabel = (float)(InitY - iTextSharp.text.Utilities.MillimetersToPoints(ymm)) ;
 
                return yLabel;
            }
            set
            {
                yLabel = value;
            }
        }
 
 
        public LabelPDFPoint(float x, float y):base( x,  y)
        {
 
                Xmm = x;
                Ymm = y;
 
                xLabel = (float)(InitX + iTextSharp.text.Utilities.MillimetersToPoints(xmm));
                yLabel = (float)(InitY - iTextSharp.text.Utilities.MillimetersToPoints(ymm));
 
        }
 
         public LabelPDFPoint(LabelPoint tlp )
         {
             this.xmm = tlp.xmm;    
             this.ymm = tlp.ymm;
 
            xLabel = (float)(InitX + iTextSharp.text.Utilities.MillimetersToPoints(xmm));
            yLabel = (float)(InitY - iTextSharp.text.Utilities.MillimetersToPoints(ymm)) ;
 
 
         }
    }
}
InitX et IntY sont des valeurs en Point me permettant d'initialiser la position d'origine de mon document dans la page.

Xmm et Ymm sont les coordonnées que je fournis dans mon code en mm., et XLabel et YLabel sont censées être les coordonnées calculées en Points qui sont utilisées par iTextSharp.

L'utilisation du code se fait de la façon suivante :

Méthode servant à dessiner un rectangle :

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
 
 public override void DrawRectangleAt(LabelPoint pOrigine, LabelPoint pDestination, LineWidth lineWidth, bool isDashed = false)
        {
 
            LabelPDFPoint pO = new LabelPDFPoint(pOrigine);
            LabelPDFPoint pD = new LabelPDFPoint(pDestination);
 
            float ixOrigine = pO.XLabel;
            float iyOrigine = pO.YLabel;
            float ixDestination = pD.XLabel;
            float iyDestination = pD.YLabel;
 
 
            PdfContentByte cb = writer.DirectContent;
            cb.SetLineDash(0f);
            cb.SetLineWidth((int)lineWidth);
            cb.MoveTo(ixOrigine, iyOrigine);
            cb.LineTo(ixOrigine, iyDestination);
            cb.LineTo(ixDestination, iyDestination);
            cb.LineTo(ixDestination, iyOrigine);
            cb.LineTo(ixOrigine, iyOrigine);
            cb.Stroke();
 
        }

Code servant à générer le document (et utilisant la fonction DrawRectangleAt() :

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
 
            float xOrigineCadre = iTextSharp.text.Utilities.MillimetersToPoints(20);
            float yOrigineCadre = iTextSharp.text.Utilities.MillimetersToPoints(30);
            float xDestCadre = iTextSharp.text.Utilities.MillimetersToPoints(150);
            float yDestCadre = iTextSharp.text.Utilities.MillimetersToPoints(185);
 
            Rectangle rect = PageSize.A4.Rotate();
            Document page = new Document(rect);
            fs = new FileStream("C:\\temp\\document.pdf",FileMode.Create);
            writer = PdfWriter.GetInstance(page, fs);
            page.Open();
 
            LabelPDFPoint.InitX = xOrigineCadre;
            LabelPDFPoint.InitY = yDestCadre;
 
            DrawRectangleAt(new LabelPDFPoint(0, 0), new LabelPDFPoint(100, 150), LineWidth.Thin);
Le problème que je rencontre lorsque j'essaye de créer mon document est que plus mes éléments graphiques sont positionnés dans le bas du document, et plus le décalage entre la position souhaitée et la position obtenu dans le document des éléments est important.

Ainsi, je constate que le rectangle dessiné par la fonction DrawRectangleAt() ne mesure pas 100 x 150 mm (comme je le voudrais). mais plutôt 95 x 145 mm.

Je n'arrive pas à comprendre d'où vient ce décalage. Quelqu'un peut il m'aider ? Merci !