iText 7-在PDF上添加和删除水印

iText 7-在PDF上添加和删除水印,pdf,itext,watermark,itext7,Pdf,Itext,Watermark,Itext7,我想使用iText 7在PDF中添加和删除水印。我可以添加水印,但无法再次删除它。我只能找到与iText 5相关的代码/示例。谢谢你的指点 这就是我添加水印的方式(使用层): pdfDoc=新的PdfDocument(新的PdfReader(sourceFile)、新的PdfWriter(destinationPath)); var numberOfPages=pdfDoc.GetNumberOfPages(); PageSize ps=pdfDoc.GetDefaultPageSize();

我想使用iText 7在PDF中添加和删除水印。我可以添加水印,但无法再次删除它。我只能找到与iText 5相关的代码/示例。谢谢你的指点

这就是我添加水印的方式(使用层):

pdfDoc=新的PdfDocument(新的PdfReader(sourceFile)、新的PdfWriter(destinationPath));
var numberOfPages=pdfDoc.GetNumberOfPages();
PageSize ps=pdfDoc.GetDefaultPageSize();

对于(var i=1;i,在iText的帮助下,我能够解决这个问题。 如果以后要删除水印,则需要将其添加为“PDF水印批注”

要在每页上添加水印,请执行以下操作:

    public void WatermarkPDF(string sourceFile, string destinationPath)
    {
        float watermarkTrimmingRectangleWidth = 300;
        float watermarkTrimmingRectangleHeight = 300;

        float formWidth = 300;
        float formHeight = 300;
        float formXOffset = 0;
        float formYOffset = 0;

        float xTranslation = 50;
        float yTranslation = 25;

        double rotationInRads = Math.PI / 3;

        PdfFont font = PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN);
        float fontSize = 50;

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(sourceFile), new PdfWriter(destinationPath));
        var numberOfPages = pdfDoc.GetNumberOfPages();
        PdfPage page = null;

        for (var i = 1; i <= numberOfPages; i++)
        {
            page = pdfDoc.GetPage(i);
            Rectangle ps = page.GetPageSize();

            //Center the annotation
            float bottomLeftX = ps.GetWidth() / 2 - watermarkTrimmingRectangleWidth / 2;
            float bottomLeftY = ps.GetHeight() / 2 - watermarkTrimmingRectangleHeight / 2;
            Rectangle watermarkTrimmingRectangle = new Rectangle(bottomLeftX, bottomLeftY, watermarkTrimmingRectangleWidth, watermarkTrimmingRectangleHeight);

            PdfWatermarkAnnotation watermark = new PdfWatermarkAnnotation(watermarkTrimmingRectangle);

            //Apply linear algebra rotation math
            //Create identity matrix
            AffineTransform transform = new AffineTransform();//No-args constructor creates the identity transform
            //Apply translation
            transform.Translate(xTranslation, yTranslation);
            //Apply rotation
            transform.Rotate(rotationInRads);

            PdfFixedPrint fixedPrint = new PdfFixedPrint();
            watermark.SetFixedPrint(fixedPrint);
            //Create appearance
            Rectangle formRectangle = new Rectangle(formXOffset, formYOffset, formWidth, formHeight);

            //Observation: font XObject will be resized to fit inside the watermark rectangle
            PdfFormXObject form = new PdfFormXObject(formRectangle);
            PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.6f);
            PdfCanvas canvas = new PdfCanvas(form, pdfDoc);

            float[] transformValues = new float[6];
            transform.GetMatrix(transformValues);
            canvas.SaveState()
                .BeginText().SetColor(Color.GRAY, true).SetExtGState(gs1)
                .SetTextMatrix(transformValues[0], transformValues[1], transformValues[2], transformValues[3], transformValues[4], transformValues[5])
                .SetFontAndSize(font, fontSize)
                .ShowText("watermark text")
                .EndText()
                .RestoreState();

            canvas.Release();

            watermark.SetAppearance(PdfName.N, new PdfAnnotationAppearance(form.GetPdfObject()));
            watermark.SetFlags(PdfAnnotation.PRINT);

            page.AddAnnotation(watermark);

        }
        page?.Flush();
        pdfDoc.Close();
    } 
对于我的用例,我检查了水印文本的长度,并据此调整了参数,例如:

        if (watermarkText.Length <= 14)
        {
            watermarkTrimmingRectangleWidth = 200;
            watermarkTrimmingRectangleHeight = 200;
            formWidth = 200;
            formHeight = 200;
            formXOffset = 0;
            fontSize = 30;
        }
        else if (watermarkText.Length <= 22)
        {
            watermarkTrimmingRectangleWidth = 300;
            watermarkTrimmingRectangleHeight = 300;
            formWidth = 300;
            formHeight = 300;
            formXOffset = 0;
            fontSize = 30;
        }
        else if (...)
        {
         ...           
        }
        .
        .
        etc.
        .
        .
        else if (watermarkText.Length <= 62)
        {
            watermarkTrimmingRectangleWidth = 600;
            watermarkTrimmingRectangleHeight = 600;
            formWidth = 600;
            formHeight = 600;
            formXOffset = -100;
            fontSize = 20;
        }

if(watermarkText.Length)感谢您的努力。
    public void WatermarkPDF(string sourceFile, string destinationPath)
    {
        float watermarkTrimmingRectangleWidth = 300;
        float watermarkTrimmingRectangleHeight = 300;

        float formWidth = 300;
        float formHeight = 300;
        float formXOffset = 0;
        float formYOffset = 0;

        float xTranslation = 50;
        float yTranslation = 25;

        double rotationInRads = Math.PI / 3;

        PdfFont font = PdfFontFactory.CreateFont(FontConstants.TIMES_ROMAN);
        float fontSize = 50;

        PdfDocument pdfDoc = new PdfDocument(new PdfReader(sourceFile), new PdfWriter(destinationPath));
        var numberOfPages = pdfDoc.GetNumberOfPages();
        PdfPage page = null;

        for (var i = 1; i <= numberOfPages; i++)
        {
            page = pdfDoc.GetPage(i);
            Rectangle ps = page.GetPageSize();

            //Center the annotation
            float bottomLeftX = ps.GetWidth() / 2 - watermarkTrimmingRectangleWidth / 2;
            float bottomLeftY = ps.GetHeight() / 2 - watermarkTrimmingRectangleHeight / 2;
            Rectangle watermarkTrimmingRectangle = new Rectangle(bottomLeftX, bottomLeftY, watermarkTrimmingRectangleWidth, watermarkTrimmingRectangleHeight);

            PdfWatermarkAnnotation watermark = new PdfWatermarkAnnotation(watermarkTrimmingRectangle);

            //Apply linear algebra rotation math
            //Create identity matrix
            AffineTransform transform = new AffineTransform();//No-args constructor creates the identity transform
            //Apply translation
            transform.Translate(xTranslation, yTranslation);
            //Apply rotation
            transform.Rotate(rotationInRads);

            PdfFixedPrint fixedPrint = new PdfFixedPrint();
            watermark.SetFixedPrint(fixedPrint);
            //Create appearance
            Rectangle formRectangle = new Rectangle(formXOffset, formYOffset, formWidth, formHeight);

            //Observation: font XObject will be resized to fit inside the watermark rectangle
            PdfFormXObject form = new PdfFormXObject(formRectangle);
            PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.6f);
            PdfCanvas canvas = new PdfCanvas(form, pdfDoc);

            float[] transformValues = new float[6];
            transform.GetMatrix(transformValues);
            canvas.SaveState()
                .BeginText().SetColor(Color.GRAY, true).SetExtGState(gs1)
                .SetTextMatrix(transformValues[0], transformValues[1], transformValues[2], transformValues[3], transformValues[4], transformValues[5])
                .SetFontAndSize(font, fontSize)
                .ShowText("watermark text")
                .EndText()
                .RestoreState();

            canvas.Release();

            watermark.SetAppearance(PdfName.N, new PdfAnnotationAppearance(form.GetPdfObject()));
            watermark.SetFlags(PdfAnnotation.PRINT);

            page.AddAnnotation(watermark);

        }
        page?.Flush();
        pdfDoc.Close();
    } 
    public void RemovetWatermarkPDF(string sourceFile, string destinationPath)
    {
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(sourceFile), new PdfWriter(destinationPath));
        var numberOfPages = pdfDoc.GetNumberOfPages();

        for (var i = 1; i <= numberOfPages; i++)
        {
            // PdfAnnotation 
            PdfDictionary pageDict = pdfDoc.GetPage(i).GetPdfObject();
            PdfArray annots = pageDict.GetAsArray(PdfName.Annots);
            for (int j = 0; j < annots.Size(); j++)
            {
                PdfDictionary annotation = annots.GetAsDictionary(j);
                if (PdfName.Watermark.Equals(annotation.GetAsName(PdfName.Subtype)))
                {
                    annotation.Clear();
                }
            }
        }
        pdfDoc.Close();
    }
float watermarkTrimmingRectangleWidth = 600;
float watermarkTrimmingRectangleHeight = 600;
float formWidth = 600;
float formHeight = 600;
float formXOffset = -100;
float fontSize = 30;
        if (watermarkText.Length <= 14)
        {
            watermarkTrimmingRectangleWidth = 200;
            watermarkTrimmingRectangleHeight = 200;
            formWidth = 200;
            formHeight = 200;
            formXOffset = 0;
            fontSize = 30;
        }
        else if (watermarkText.Length <= 22)
        {
            watermarkTrimmingRectangleWidth = 300;
            watermarkTrimmingRectangleHeight = 300;
            formWidth = 300;
            formHeight = 300;
            formXOffset = 0;
            fontSize = 30;
        }
        else if (...)
        {
         ...           
        }
        .
        .
        etc.
        .
        .
        else if (watermarkText.Length <= 62)
        {
            watermarkTrimmingRectangleWidth = 600;
            watermarkTrimmingRectangleHeight = 600;
            formWidth = 600;
            formHeight = 600;
            formXOffset = -100;
            fontSize = 20;
        }