2016-12-22 2 views
0

J'utilise le code ci-dessous pour ajouter un filigrane à mon pdf.Ajout de texte en tant que filigrane en utilisant itext7 C#

private void Merge(List<string> src, string dest) 
    { 
     iTextKernel.PdfWriter writer = new iTextKernel.PdfWriter(dest); 
     iTextKernel.PdfDocument pdfDocument1 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[0]), writer); 
     pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, new WatermarkingEventHandler()); 

     for (int i = 1, max = src.Count; i < max; i++) 
     { 
      iTextKernel.PdfDocument pdfDocument2 = new iTextKernel.PdfDocument(new iTextKernel.PdfReader(src[i])); 
      var pagesCount = pdfDocument2.GetNumberOfPages(); 
      pdfDocument2.CopyPagesTo(1, pagesCount, pdfDocument1); 
      pdfDocument2.Close(); 
     } 
     pdfDocument1.Close(); 
    protected class WatermarkingEventHandler : IEventHandler { 

     public void HandleEvent(Event e) { 
     PdfDocumentEvent docEvent = (PdfDocumentEvent) e; 
     iTextKernel.PdfDocument pdfDoc = docEvent.GetDocument(); 
     iTextKernel.PdfPage page = docEvent.GetPage(); 
     iText.Kernel.Font.PdfFont font = null; 
     try { 
      font = PdfFontFactory.CreateFont(FontConstants.HELVETICA_BOLD); 
     } catch (IOException ex) { 
      //_log.Error(ex); 
     } 
     PdfCanvas canvas = new PdfCanvas(page.NewContentStreamBefore(), page.GetResources(), pdfDoc); 
     new Canvas(canvas, pdfDoc, page.GetPageSize()) 
       .SetFontColor(iText.Kernel.Colors.DeviceGray.LIGHT_GRAY) 
       .SetFontSize(60) 
       .SetFont(font) 
       .ShowTextAligned(new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT"), 298, 421, pdfDoc.GetPageNumber(page), 
         TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 
    } 

Mais je n'obtiens le filigrane que sur la dernière page trop cachée sous le contenu. Pourriez-vous s'il vous plaît modifier ce code afin que je puisse obtenir le filigrane sur toutes les pages et affiché sur le contenu.

+0

Il y a beaucoup de problèmes avec votre code. Par exemple: vous n'avez pas besoin de deux instances de 'PdfDocument'. L'un est suffisant. –

+0

Veuillez donner un code concis. Les paramètres ne sont pas bien expliqués. Veuillez mettre un peu plus d'effort pour expliquer la question. Cela aidera les autres personnes à vous donner une réponse meilleure et plus utile. Bonne chance!! –

Répondre

0

S'il vous plaît jeter un oeil à la iText 7 for C# jump-start tutorial, plus précisément Chapter 5: Manipulating an existing PDF document. Faites défiler jusqu'à la partie où il est dit: « Ajout d'un en-tête, pied de page, et le filigrane » et regardez l'exemple:

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest)); 
Document document = new Document(pdfDoc); 
Rectangle pageSize; 
PdfCanvas canvas; 
int n = pdfDoc.GetNumberOfPages(); 
for (int i = 1; i <= n; i++) { 
    PdfPage page = pdfDoc.GetPage(i); 
    pageSize = page.GetPageSize(); 
    canvas = new PdfCanvas(page); 
    //Draw header text 
} 
pdfDoc.close(); 

Comme vous pouvez le voir, nous avons seulement besoin d'un PdfDocument exemple, mais au lieu de passer seulement un PdfWriter, nous passons également une instance PdfReader. Nous allons lire le fichier avec le chemin src et nous écrirons dans un fichier avec le chemin dest.

Vous voulez ajouter du contenu à chaque page. Cela signifie que vous devez parcourir chaque page (de 1 à n). Obtenez l'objet PdfPage pour chaque page i et remplacez la ligne //Draw header text par quoi que ce soit que vous voulez faire.

Dans votre cas, vous ajoutez une image sous le contenu existant. C'est la chose normale à faire, mais vous dites que le filigrane est couvert par le contenu existant. Cela arrive par exemple lorsque le contenu réel est constitué d'images (par exemple des pages numérisées). Si vous ajoutez un filigrane sous les pages d'un document PDF composé de pages numérisées, vous ne verrez jamais le filigrane.

Dans ce cas, vous devez ajouter le contenu au-dessus de le contenu existant, mais il est préférable de faire le filigrane transparent:

Paragraph p = new Paragraph("FOR YOUR RECORDS ONLY: DO NOT SUBMIT").SetFontSize(60); 
canvas.SaveState(); 
PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.2f); 
canvas.SetExtGState(gs1); 
document.ShowTextAligned(p, pageSize.GetWidth()/2, pageSize.GetHeight()/2, pdfDoc.GetPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); 
canvas.RestoreState(); 

Notez que dans le tutoriel, nous utilisons pageSize.GetWidth()/2 et pageSize.GetHeight()/2 comme coordonnées, ce qui signifie que nous supposons que le coin inférieur gauche de la page a la coordonnée (0, 0). Ce n'est peut-être pas le cas. Vous devrez peut-être ajouter le décalage x et le décalage y à cette valeur.

+0

* "il est préférable de rendre le filigrane transparent" * - A peu près aussi souvent que la transparence est meilleure, le mode de fusion darken est. – mkl