计算字体的emSize值,以便文本填充区域

时间:2013-07-30 11:38:01

标签: c# asp.net pdf fonts pdfsharp

我现在已经把头发拉了好几年了,所以以为我会试着帮忙... 我正在使用PDFsharp(可能或可能不重要)并尝试在通过我的asp.net网络应用程序下载时将水印放入pdf文档。

我的问题是用户需要能够在水印中定义文本,所以我不能使用固定的文本大小,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);

2 个答案:

答案 0 :(得分:1)

水印的长度(以字符为单位)是否有限?如果是这样,您可以使用允许的字符数并计算字符串的宽度,如“@@@ ...”,“WWW ...”和“MMM ...”,在循环中减小字体大小,直到它适合。
然后,您将拥有一个可用于所有文本的字体大小。

水印将会更小 - 如果您计算宽度为30“@”且用户只需输入“最高机密”......

更好的方法:让用户输入水印,然后使用减少字体大小的循环,直到所需的文本适合可用空间。

答案 1 :(得分:1)

也许这样(我不知道PDFsharp是如何工作的,但是在正常的Forms或Wpf中,这段代码会提供最大可能的字体)

public Font GetFont(Panel Wathermark, string textToPaint)
        {
                Font result = new Font("Bold", 1);
                using (Graphics measure = Wathermark.CreateGraphics())
                {
                    SizeF tempSize;
                    tempSize = measure.MeasureString(textToPaint, result);

                    while (tempSize.Width < Wathermark.Width && tempSize.Height < Wathermark.Height)
                    {
                        tempSize = measure.MeasureString(textToPrint, result);
                        var tempSizeToIncrease = result.Size; //writeprotected
                        result = new Font(result.Name, tempSizeToIncrease += 0.1f);
                    }
                }
                return result;
            }