Водяной знак PDF только для печати, программно - PullRequest
3 голосов
/ 07 января 2010

Я могу пометить водяным знаком любой PDF уже, и изображения внутри, все в порядке, но теперь мне нужно, чтобы водяной знак появлялся только при печати PDF ... Возможно ли это? Как?

Конечно, мне нужно сделать это программно.

Ответы [ 4 ]

8 голосов
/ 06 апреля 2012

Для будущих читателей это можно сделать, обернув водяной знак в слой PDF (необязательная группа содержимого), а затем настроив атрибут Использование этого слоя как только для печати. , См. Справочный документ PDF , глава 4- Графика , часть 4.10- Дополнительный контент для получения дополнительной информации.

2 голосов
/ 14 августа 2015

В частности, используя itextsharp, я смог заставить его работать со следующим, в частности - pdf версия 1.7 и SetPrint («Watermark», true)

        string oldfile = @"c:\temp\oldfile.pdf";
        string newFile = @"c:\temp\newfile.pdf";
        PdfReader pdfReaderS = new PdfReader(oldfile);
        Document document = new Document(pdfReaderS.GetPageSizeWithRotation(1));
        PdfWriter pdfWriterD = PdfWriter.GetInstance(document, new FileStream(newFile, FileMode.Create, FileAccess.Write));
        pdfWriterD.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
        document.Open();
        PdfContentByte pdfContentByteD = pdfWriterD.DirectContent;

        BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

        int n = pdfReaderS.NumberOfPages;

        string text = "UNCONTROLLED";

        for (int i = 1; i <= n; i++)
        {
            iTextSharp.text.Rectangle pageSizeS = pdfReaderS.GetPageSizeWithRotation(i);
            float pageWidth = pageSizeS.Width / 2;
            float pageheight = pageSizeS.Height / 2;

            document.SetPageSize(pageSizeS);
            document.NewPage();
            PdfImportedPage pdfImportedPage = pdfWriterD.GetImportedPage(pdfReaderS, i);

            PdfLayer layer1 = new PdfLayer("Watermark", pdfWriterD);
            layer1.SetPrint("Watermark", true);
            layer1.View = false;
            layer1.On = false;
            layer1.OnPanel = false;

            pdfContentByteD.BeginLayer(layer1);
            pdfContentByteD.SetColorFill(BaseColor.RED);
            pdfContentByteD.SetFontAndSize(bf, 30);

            ColumnText.ShowTextAligned(pdfContentByteD, Element.ALIGN_CENTER, new Phrase(text), 300, 700, 0);
            pdfContentByteD.EndLayer();

            pdfContentByteD.AddTemplate(pdfImportedPage, 0, 0);//, 0, 1, 0, 0);

        }
        document.Close();
        pdfReaderS.Close();
1 голос
/ 07 января 2010

Вы, вероятно, должны использовать тот факт, что на экране используется RGB и принтер CMYK. Вы должны иметь возможность создать два цвета в CMYK, которые соответствуют одному значению RGB. Этого, конечно, недостаточно против решительного специалиста.

0 голосов
/ 05 февраля 2015

Параметр bOnScreen определяет, будет ли отображаться водяной знак при просмотре PDF на экране компьютера, а bOnPrint определяет, будет ли он отображаться при печати PDF.

- https://acrobatusers.com/tutorials/watermarking-a-pdf-with-javascript

...