Добавьте водяной знак поверх полей формы - PullRequest
0 голосов
/ 08 апреля 2019

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

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-файлах с текстовыми полями изображение будет идти за текстовым полем / формой.Я думал, что выравнивание файла исправит это, но это не работает.

Screenshot

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

1 Ответ

1 голос
/ 09 апреля 2019

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