2016-12-22 7 views
0

Я использую приведенный ниже код для добавления водяного знака в мой pdf.Добавление текста в качестве водяного знака с использованием 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); 
    } 

Но я получаю водяной знак только на последней странице, которая слишком скрыта под содержимым. Не могли бы вы изменить этот код, чтобы я мог получить водяной знак на всех страницах и показать содержимое.

+0

В коде есть много неправильных вещей. Например: вам не нужны два экземпляра 'PdfDocument'. Одного достаточно. –

+0

Пожалуйста, укажите краткую инструкцию. Параметры не очень хорошо объяснены. Пожалуйста, приложите немного больше усилий для объяснения вопроса. Это поможет другим людям дать вам лучший и полезный ответ. Всего наилучшего!! –

ответ

0

Пожалуйста, взгляните на iText 7 for C# jump-start tutorial, а точнее Chapter 5: Manipulating an existing PDF document. Выделите ту часть, где он говорит: «Добавление верхнего колонтитула, и водяной знак» и посмотрите на пример:

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(); 

Как вы можете видеть, нам нужно только один PdfDocument экземпляр, но вместо передачи только a PdfWriter, мы также передаем экземпляр PdfReader. Мы будем читать файл с пустым src, и мы напишем файл с контуром dest.

Вы хотите добавить информацию к каждой странице. Это означает, что вам нужно перебирать каждую страницу (от 1 до n). Получите объект PdfPage для каждой страницы i и замените строку //Draw header text тем, что вы хотите сделать.

В вашем случае вы добавляете изображение под существующего контента. Это нормальная вещь, но вы говорите, что водяной знак покрыт существующим контентом. Это происходит, например, когда фактическое содержимое состоит из изображений (например, отсканированных страниц). Если вы добавите водяной знак под страницами PDF, который состоит из отсканированных страниц, вы никогда не увидите водяной знак.

В этом случае, вы должны добавить содержание поверх существующего контента, но это лучше сделать водяной знак прозрачный:

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(); 

Обратите внимание, что в учебнике, мы используем pageSize.GetWidth()/2 и pageSize.GetHeight()/2 в качестве координат, что означает, что мы предполагаем, что нижний левый угол страницы имеет координату (0, 0). Это может быть не так. Возможно, вам придется добавить смещение x и y-offset к этому значению.

+0

* «Лучше всего сделать водяной знак прозрачным» * - примерно так же, как прозрачность лучше всего, режим смешивания темнее. – mkl