如何更正用于创建 Canvas 的过时代码

How to correct obsolete code for creating Canvas

此代码使用 iText7 运行。它复制一个 PDF 文件,并在副本上在第 1 页的顶部打印一个矩形,文本 ID 或消息周围带有红色边框:

        public static void InsertIdPdf(string sourceFilename, string targetFilename, string idText)
        {
            if (idText.Length > 0)
            {
                PdfDocument sourcePdf = new PdfDocument(new PdfReader(sourceFilename));
                PdfDocument targetPdf = new PdfDocument(new PdfWriter(targetFilename));

                sourcePdf.CopyPagesTo(1, sourcePdf.GetNumberOfPages(), targetPdf);
                Document document = new Document(targetPdf, new PageSize(PageSize.A4));

                PdfPage firstPage = targetPdf.GetFirstPage();
                iText.Kernel.Geom.Rectangle pageSize = firstPage.GetCropBox().MoveUp(4);
                Canvas canvas = new Canvas(new PdfCanvas(firstPage, true), targetPdf, pageSize);

                PdfFont idFont = PdfFontFactory.CreateFont(StandardFonts.HELVETICA);
                Style idStyle = new Style()
                    .SetFont(idFont)
                    .SetFontSize(8)
                    .SetPaddingRight(3)
                    .SetTextAlignment(iText.Layout.Properties.TextAlignment.RIGHT)
                    .SetBackgroundColor(ColorConstants.WHITE);

                Paragraph paragraph = new Paragraph(idText)
                    .SetBorder(new SolidBorder(ColorConstants.RED, (float)0.7))
                    .AddStyle(idStyle);
                IRenderer renderer = paragraph.CreateRendererSubTree();
                renderer.SetParent(document.GetRenderer()).Layout(new LayoutContext(new LayoutArea(1, pageSize)));

                canvas.Add(paragraph);
                document.Close();
                sourcePdf.Close();
                targetPdf.Close();
            }
        }

但是,iText7 声称此行 已过时 因为最后一个参数 Rectangle 可能会在未来的版本中删除:

Canvas canvas = new Canvas(new PdfCanvas(firstPage, true), targetPdf, pageSize);

我已经尝试调整线条,删除 pageSize 以满足 iText7,但矩形将打印 下方 页面上的正常文本和 垂直翻转(镜像).

  1. 那么,如何调整线条才不会过时,并且仍然打印顶部的矩形呢?

另外,请注意 pageSize.MoveUp(4)。值 4 是将矩形移动到页面绝对顶部的经验值。如果省略,矩形将被放置在页面顶部的一个小缺口处。这个花言巧语与字体大小无关。

  1. 所以,为什么 4?我不喜欢神奇的数字,更喜欢计算值。什么表达式可以用来计算这个值?

参考这里的两个问题:

我无法重现这个,但我现在可以了。我认为这与我正在尝试的文档的可打印区域有关。

话虽如此,废弃部分的调整还是很简单的。只是改变

Canvas canvas = new Canvas(new PdfCanvas(firstPage, true), targetPdf, pageSize);

Canvas canvas = new Canvas(new PdfCanvas(firstPage, true), pageSize);

废弃的是 pdfDocument 参数。

关于幻数4。我认为这是关于 DPI,我真的不知道它是什么。但是我能找到的最相关的资源已经在社区中了:Points -> pixels iText (im)precision