Добавить водяной знак поверх полей формы

#c# #pdf #itext

#c# #PDF #itext

Вопрос:

У меня есть этот код, который добавит водяной знак на каждую страницу:

 string watermarkLocation = AppDomain.CurrentDomain.BaseDirectory   "Watermark.png";

Document document = new Document();
PdfReader pdfReader = new PdfReader(fileLocation);
PdfStamper stamp = new PdfStamper(pdfReader, new FileStream(fileLocation.Replace(".pdf", "_marked.pdf"), FileMode.Create));

iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(watermarkLocation);
img.ScaleToFit(document.PageSize);
img.SetAbsolutePosition(0, 100); 

PdfContentByte waterMark;
for (int page = 1; page <= pdfReader.NumberOfPages; page  )
{
    waterMark = stamp.GetOverContent(page);
    waterMark.AddImage(img);
}
stamp.FormFlattening = true;
stamp.Close();
return fileLocation.Replace(".pdf", "_marked.pdf");
  

Но в PDF-файлах с текстовыми полями изображение будет находиться за текстовым полем / формой. Я думал, что выравнивание файла исправит это, но это не работает.

Скриншот

Я использовал полное изображение в качестве теста, но водяной знак в конце будет прозрачным.

Комментарии:

1. «думал, что сглаживание файла исправит это, но это не работает». — сглаживание исправит это, но вы должны сгладить в первом проходе и применить водяной знак во втором проходе.

2. @mkl Я добавил кодовое решение, но ваше предложение сработало. Я сглаживал его перед добавлением штампа, но у меня получилось создать отдельный штамп для сглаживания, а затем еще один для добавления водяного знака.

Ответ №1:

Вот окончательный код, который я использую. Как упоминалось в моем комментарии, в основном есть 2 считывателя / штампа, один для выравнивания файла, а другой для добавления водяного знака.

Сгладить файл:

 private byte[] FlattenPdfFormToBytes(PdfReader reader)
{
    var memStream = new MemoryStream();
    var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
    stamper.Close();
    return memStream.ToArray();
}
  

Добавить водяной знак (который вызовет FlattenPdfFormToBytes):

     public string AddWatermark(string fileLocation)
    {
        string watermarkLocation = AppDomain.CurrentDomain.BaseDirectory   "Watermark.png";

        Document document = new Document();
        PdfReader pdfReader = new PdfReader(fileLocation);
        PdfReader pdfFlatten = new PdfReader(FlattenPdfFormToBytes(pdfReader)); // The secret sauce is this!!!

        PdfStamper stamp = new PdfStamper(pdfFlatten, new FileStream(fileLocation.Replace(".pdf", "_marked.pdf"), FileMode.Create));

        iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(watermarkLocation);
        img.ScaleToFit(document.PageSize);
        img.SetAbsolutePosition(0, 100);

        PdfContentByte waterMark;
        for (int page = 1; page <= pdfFlatten.NumberOfPages; page  )
        {
            waterMark = stamp.GetOverContent(page);
            waterMark.AddImage(img);
        }

        stamp.Close();
        return fileLocation.Replace(".pdf", "_marked.pdf");
    }