2016-12-26 4 views
0

Le code que j'ai utilisé pour filigrane est montré ci-dessous. Pour les deux premières pages, le filigrane est affiché correctement, mais pour la troisième page, le filigrane est affiché dans le coin supérieur gauche. Quand j'ai débogué, il affichait la taille de la page en 692 * 712 environ.Le filigrane sur un pdf est placé dans le coin supérieur gauche au lieu du centre de la page

class Program 
{ 
    static string absoluteFile1Path = "filename1.pdf"; 
    static string absoluteFile2Path = "filename2.pdf"; 
    static string destination = "destinationfilename.pdf"; 

    static void Main(string[] args) 
    { 
     string[] filesPath = new string[] { absoluteFile1Path, absoluteFile2Path }; 

     PdfDocument pdfDoc = new PdfDocument(new PdfWriter(destination));    

     PdfMerger merger = new PdfMerger(pdfDoc); 

     PdfDocument srcDoc1 = new PdfDocument(new PdfReader(absoluteFile1Path)); 
     merger.Merge(srcDoc1, 1, srcDoc1.GetNumberOfPages()); 

     PdfDocument srcDoc2 = new PdfDocument(new PdfReader(absoluteFile2Path)); 
     merger.Merge(srcDoc2, 1, srcDoc2.GetNumberOfPages()); 

     pdfDoc.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkHandler());    

     srcDoc1.Close(); 
     srcDoc2.Close(); 

     pdfDoc.Close(); 

    } 
} 

public class WatermarkHandler : IEventHandler 
{ 
    Color lime, blue; 
    PdfFont helvetica; 
    PdfFont font; 

    public WatermarkHandler() 
    { 
     //helvetica = PdfFontFactory.CreateFont(FontConstants.HELVETICA); 
     //lime = new DeviceCmyk(0.208f, 0, 0.584f, 0); 
     //blue = new DeviceCmyk(0.445f, 0.0546f, 0, 0.0667f); 
     font = PdfFontFactory.CreateFont(FontConstants.HELVETICA); 
    } 

    public void HandleEvent(Event @event) 
    { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent)@event; 

     PdfDocument pdf = docEvent.GetDocument(); 
     PdfPage page = docEvent.GetPage(); 
     int pageNumber = pdf.GetPageNumber(page); 
     Rectangle pageSize = page.GetPageSize(); 

     PdfCanvas canvas = new PdfCanvas(page.NewContentStreamAfter(), page.GetResources(), pdf); 
     PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.9f).SetStrokeOpacity(0.3f); 
     canvas.SetExtGState(gs1); 
     new Canvas(canvas, pdf, new iText.Kernel.Geom.Rectangle(page.GetPageSize().GetWidth()/2, page.GetPageSize().GetHeight()/2)) 
       .SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY) 
       .SetFontSize(26) 
       .SetFont(font) 
       .ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 375, pdf.GetPageNumber(page), 
         TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 

     canvas.Release(); 
    } 
} 
} 
+2

Montrez-nous les fichiers PDF. Peut-être que le coin inférieur gauche de la page a une coordonnée différente de 'x = 0; y = 0'. Vous ne prenez pas en compte cette compensation. –

+0

La hauteur de la page ou la largeur de la page peuvent ne pas être divisibles par 2 de manière égale (c'est-à-dire par un nombre impair) et est à l'origine d'un problème? – mike510a

Répondre

0

Sans avoir vu le pdf Je ne peux pas être sûr, mais cela est très probablement dû à l'une des pages étant mis en rotation (90 ou 270 degrés si votre 3ème page a sa largeur et sa hauteur retournée) et donc la coordonnées absolues pour montrer votre filigrane sont un peu sur les pages tournées.

Vous pouvez obtenir la rotation d'une page avec PdfPage#getRotation() et écrire une logique supplémentaire pour calculer les x et y pivotés en fonction de la valeur récupérée. There's some info on the coordinate system used in pdfs in chapter 2 of the iText7 jumpstart tutorial.