如何更正用于创建 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,但矩形将打印 下方 页面上的正常文本和 垂直翻转(镜像).
- 那么,如何调整线条才不会过时,并且仍然打印顶部的矩形呢?
另外,请注意 pageSize
的 .MoveUp(4)
。值 4 是将矩形移动到页面绝对顶部的经验值。如果省略,矩形将被放置在页面顶部的一个小缺口处。这个花言巧语与字体大小无关。
- 所以,为什么 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
此代码使用 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,但矩形将打印 下方 页面上的正常文本和 垂直翻转(镜像).
- 那么,如何调整线条才不会过时,并且仍然打印顶部的矩形呢?
另外,请注意 pageSize
的 .MoveUp(4)
。值 4 是将矩形移动到页面绝对顶部的经验值。如果省略,矩形将被放置在页面顶部的一个小缺口处。这个花言巧语与字体大小无关。
- 所以,为什么 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