使用 iTextSharp 获取页面的精确坐标以添加具有不同页面旋转的水印

Get exact cordinates of the page to add a watermark with different page rotation using iTextSharp

我一直在尝试使用 iTextSharp 在 PDF 文件上定位文本水印,但我正在努力寻找每一页上的坐标。当 pdf 文件中的所有页面旋转相同时,它工作正常,但如果旋转不同,则坐标完全不同。

PdfImportedPage page = stamper.GetImportedPage(pdfReader, i);
var rotationValue = page.Rotation;

并添加水印

cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is WaterMark 1", 20, 20, 90f);

此代码无法找到页面上的 X 和 Y 位置。 我怎样才能得到我想要添加水印的确切位置?

这个问题在一篇用法语写的文章中得到了回答,该文章基于我用英语回答的几个 Whosebug 问题:Comment créer un filigrane transparent en PDF?

此博客 post 基于的问题是:

  • (这对你来说很重要,因为它处理页面旋转!)
  • How to add a watermark to a PDF file?
  • How to extend the page size of a PDF to add a watermark?

这些问题及其答案可以在 The Best iText Questions on Whosebug 中找到,这是一本可以从 iText 站点下载的免费电子书。它还包含一些从未在 Whosebug 上发布的答案。

你不应该导入页面来找出旋转。还有其他方法可以获取该信息。您会注意到,您可以使用 getPageSize()GetPageSizeWithRotation() 方法,具体取决于您是否想要随旋转一起获取页面大小(还有一个 GetRotation() 方法)。

此外,您应该尝试 RotateContents 属性:

stamper.RotateContents = false;

我不太清楚你是想让水印跟着旋转还是忽略旋转,但是GetPageSize()GetPageSizeWithRotation()方法,你可以避免使用 x = 20; y = 20 等硬编码值(如您的代码片段中所做的那样)。如果你想要页面的中间坐标i,你可以使用这个代码:

Rectangle pagesize = reader.GetPageSizeWithRotation(i);
x = (pagesize.Left + pagesize.Right) / 2;
y = (pagesize.Top + pagesize.Bottom) / 2;