iText7 PDF 在 Adob​​e 中呈现正确但打印不正确 Reader

iText7 PDF renders correctly but prints incorrect in Adobe Reader

我的任务是为很多现有的 PDF 添加水印,我在 C# 中使用 iText7 来完成这项工作。结果可以在这张图片中看到(使用空白 pdf)

它在任何地方都可以很好地渲染,并且可以从 Chrome 和 Edge 完美打印。但是,当从 Adob​​e Acrobat Reader 打印时,会发生以下情况:

有谁比我更了解PDF,谁能帮忙解决这个问题?我正在使用 iText 的 7.1.13 版本。

测试 pdf 可在此处获得:

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

C#代码:

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

您在注释中使用 FixedPrint 词典:

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

Watermark 注释的附加条目指定了在打印期间如何相对于目标媒体的尺寸绘制此注释。因此,您要求打印时对水印进行特殊处理

因此,如果您确实需要在打印期间进行特殊处理(只是不是当前处理),只需相应地设置 PdfFixedPrint 属性即可。

如果您不想在打印过程中进行任何特殊处理,则根本不要设置 PdfFixedPrint 对象。