Search code examples
c#pdfitext7watermark

iText7 PDF renders correctly but prints incorrect in Adobe Reader


I have a task of adding watermarks to a lot of existing PDFs and I use iText7 for this in C#. The result can be seen in this picture (Blank pdf used)

PDF on screen

It renders fine everywhere and prints perfectly from both Chrome and Edge. However, when printed from Adobe Acrobat Reader, this is what happens:

Print preview in Adobe reader

Anyone knowing more about PDF than I, who can help with this issue? I am using version 7.1.13 of iText.

The test pdf is available here:

https://potanteststorage.blob.core.windows.net/pdf/Test.pdf

C# Code:

public static void AddProductionWatermarks(string sourceFile, string destinationPath)
{
    float watermarkTrimmingRectangleWidth = 75;
    float watermarkTrimmingRectangleHeight = 250;

    //Custom text
    float formWidth = 75;
    float formHeight = 250;
    float formXOffset = 0;
    float formYOffset = 0;

    float xTranslation = 50;
    float yTranslation = 0;

    double rotationInRads = Math.PI / 2;

    PdfFont font = PdfFontFactory.CreateFont(StandardFonts.TIMES_ROMAN);
    float fontSize = 12;

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

        //PRODUCTION watermark -------------------------------------------------------
        float prodBottomLeftX = -20;
        float prodBottomLeftY = ps.GetHeight() / 2;

        Rectangle prodWatermarkTrimmingRectangle = new Rectangle(prodBottomLeftX, prodBottomLeftY, watermarkTrimmingRectangleWidth, watermarkTrimmingRectangleHeight);
        PdfWatermarkAnnotation prodWatermark = new PdfWatermarkAnnotation(prodWatermarkTrimmingRectangle);

        AffineTransform transform2 = new AffineTransform();
        transform2.Translate(xTranslation, yTranslation);
        transform2.Rotate(rotationInRads);

        PdfFixedPrint fixedPrint2 = new PdfFixedPrint();
        prodWatermark.SetFixedPrint(fixedPrint2);

        PdfFormXObject form2 = new PdfFormXObject(formRectangle);
        PdfCanvas canvas2 = new PdfCanvas(form2, pdfDoc);

        transform2.GetMatrix(transformValues);
        canvas2.SaveState()
            .BeginText().SetColor(new DeviceRgb(255, 36, 0), true)
            .SetTextMatrix(transformValues[0], transformValues[1], transformValues[2], transformValues[3], transformValues[4], transformValues[5])
            .SetFontAndSize(font, fontSize)
            .ShowText("PRODUCTION")
            .EndText()
            .RestoreState();

        canvas2.Release();

        prodWatermark.SetAppearance(PdfName.N, new PdfAnnotationAppearance(form2.GetPdfObject()));
        prodWatermark.SetFlags(PdfAnnotation.PRINT);
        page.AddAnnotation(prodWatermark);
    }

    page?.Flush();
    pdfDoc.Close();
}

Solution

  • You use FixedPrint dictionaries in your annotations:

    PdfFixedPrint fixedPrint2 = new PdfFixedPrint();
    prodWatermark.SetFixedPrint(fixedPrint2);
    

    This additional entry for Watermark annotations specifies how this annotation shall be drawn relative to the dimensions of the target media during printing. Thus, you ask for special treatment of the watermark during printing.

    So if you indeed want special treatment during printing (merely not the current treatment), simply set the PdfFixedPrint properties accordingly.

    If you don't want any special treatment during printing, don't set a PdfFixedPrint object at all.