0

我已经把头发拉出来很久了,所以我想我会尝试获得一些帮助......我正在使用 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);
4

2 回答 2

1

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

然后水印会更小 - 如果您计算 30 "@" 的宽度并且用户只需输入 "Top Secret" ...

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

于 2013-07-30T11:57:43.750 回答
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;
            }
于 2013-07-30T12:01:24.600 回答