首页 > 解决方案 > iText7 PDF 正确呈现但在 Adob​​e Reader 中打印不正确

问题描述

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

屏幕上的 PDF

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

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

标签: c#pdfitext7watermark

解决方案


您在注释中使用FixedPrint字典:

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

水印注释的这个附加条目指定了在打印期间如何相对于目标介质的尺寸绘制此注释。因此,您要求在打印过程中对水印进行特殊处理

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

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


推荐阅读