Я уже целую вечность рву на себе волосы, поэтому подумал, что попытаюсь получить некоторую помощь ... Я работаю с PDFsharp (может быть или не быть значительным) и пытаюсь поставить водяной знак в pdf document, когда он загружается через мое веб-приложение asp.net.
Моя проблема связана с тем, что пользователь должен иметь возможность определять текст в водяном знаке, поэтому я не могу использовать фиксированный размер текста, а также размер страницы PDF может измениться.
Предполагая, что я использую Arial и полужирный шрифт и могу найти ширину страницы в см/мм/дюймах/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);