我现在已经把头发拉了好几年了,所以以为我会试着帮忙... 我正在使用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);
答案 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;
}