我已经把头发拉出来很久了,所以我想我会尝试获得一些帮助......我正在使用 PDFsharp(可能很重要,也可能不重要)并试图在 pdf 中添加水印通过我的 asp.net 网络应用程序下载它时的文档。
我的问题是用户需要能够定义水印中的文本,所以我不能使用固定的文本大小,而且 pdf 页面大小可以改变。
假设我使用 Arial 和粗体,并且可以找到以 cm/mm/inch/pt 为单位的页面宽度,我如何计算所需的字体 emSize,以便输入的任何文本都会增长/缩小以填充宽度?
PDFsharp XFont 构造函数采用字体名称和 emSize。
编辑:非常感谢各位的建议,这就是我最终实现的:
PdfDocument doc = PdfReader.Open(stream, PdfDocumentOpenMode.Modify);
foreach (PdfPage page in doc.Pages)
{
double watermarkWidth = (Math.Sqrt(Math.Pow(page.Height.Point, 2) + Math.Pow(page.Width.Point, 2)));
//reduce by 10% so that the wording doesn't go right into the corners
watermarkWidth -= (watermarkWidth / 10);
XGraphics gfx = XGraphics.FromPdfPage(page, XGraphicsPdfPageOptions.Prepend);
double emSize = 150;
XFont font = new XFont("Arial", emSize, XFontStyle.Bold);
XSize size = gfx.MeasureString(watermark, font);
while (size.Width > watermarkWidth && emSize > 10)
{
emSize -= 5;
font = new XFont("Arial", emSize, XFontStyle.Bold);
size = gfx.MeasureString(watermark, font);
}
gfx.TranslateTransform(page.Width / 2, page.Height / 2);
gfx.RotateTransform(-Math.Atan(page.Height / page.Width) * 180 / Math.PI);
gfx.TranslateTransform(-page.Width / 2, -page.Height / 2);
XGraphicsPath path = new XGraphicsPath();
path.AddString(watermark, font.FontFamily, XFontStyle.Bold, emSize,
new XPoint((page.Width - size.Width) / 2, (page.Height - size.Height) / 2),
XStringFormats.Default);
XPen pen = new XPen(XColor.FromArgb(75, 255, 0, 0), 2);
gfx.DrawPath(pen, path);
}
doc.Save(stream, false);