答案 0 :(得分:20)
PdfSharp.Drawing.XGraphics对象有一个MeasureString方法,可以返回您需要的内容。
var pdfDoc = new PdfSharp.Pdf.PdfDocument();
var pdfPage = pdfDoc.AddPage();
var pdfGfx = PdfSharp.Drawing.XGraphics.FromPdfPage(pdfPage);
var pdfFont = new PdfSharp.Drawing.XFont("Helvetica", 20);
while (pdfGfx.MeasureString("Hello World!").Width > pdfPage.Width)
--pdfFont.Size;
pdfGfx.DrawString("Hello World!", pdfFont
, PdfSharp.Drawing.XBrushes.Black
, new PdfSharp.Drawing.XPoint(100, 100));
这应该对你有所帮助。请考虑我没有测试此代码,因为我是动态编写的,以便提供帮助。它可能包含一些编译时错误,但您可能会有这个想法。
答案 1 :(得分:10)
在.NET中你可以打电话 Graphics.MeasureString找出方法 大的绘制文本将会是。
是的,但在使用PDFsharp时,您可以调用XGraphics.MeasureString。
答案 2 :(得分:6)
我有类似的问题所以我实现了这个扩展方法:
public static double MeasureHeight(this PdfSharp.Drawing.XGraphics gfx, string text, PdfSharp.Drawing.XFont font, int width)
{
var lines = text.Split('\n');
double totalHeight = 0;
foreach (string line in lines)
{
var size = gfx.MeasureString(line, font);
double height = size.Height + (size.Height * Math.Floor(size.Width / width));
totalHeight += height;
}
return totalHeight;
}
答案 3 :(得分:5)
在.NET中,您可以调用Graphics.MeasureString来查看绘制文本的大小。
答案 4 :(得分:1)
我为XGraphic对象写了一个小扩展方法来做到这一点:通过指定maxWidth来计算确切的文本高度(和宽度)。 请参阅以下要点:https://gist.github.com/erichillah/d198f4a1c9e8f7df0739b955b245512a
答案 5 :(得分:0)
OP询问如何根据可用宽度和字体计算文本高度。 Windows .NET为此提供了一个API调用,它接受一个宽度参数;我正在使用的PDFsharp版本(0.9.653,.NET 1.1)没有。
我的解决方案 - 使用.NET API调用和为自定义创建的Bitmap对象分配的Graphics对象来获得答案。
对我有用的是使用具有100 DPI分辨率(严重)的Bitmap,恰好是Portrait页面的大小(可能不太重要)。
然后我问.NET在该位图上绘制的像素大小是多少。
您可能希望将单位从1/100英寸转换为点数(对于PDFsharp)。
''' Adapted Code - this not tested or even compiled - Caveat Emptor! ''' Target: Visual Basic, .NET 1.1 (VS2003) [adapt as necessary] ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' GraphicsAlt.MeasureString() does substantially what System.Drawing MeasureString(...,Integer) does. ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Public Module GraphicsAlt ' ' Static data used Only to compute MeasureString() below. ' ' Cache a single copy of these two objects, to address an otherwise unexplained intermittent exception. ' Private Shared myImage As Bitmap = Nothing Private Shared myGraphics As Graphics = Nothing Public Shared Function GetMeasureGraphics() As Graphics If myImage Is Nothing Then myImage = New Bitmap(1700, 2200) '' ... Specify 8.5x11 myImage.SetResolution(100, 100) '' ... and 100 DPI (if you want different units, you might change this) myGraphics = Graphics.FromImage(myImage) End If Return myGraphics End Function 'Given 1/100TH inch max width, return Rect to hold with units 1/100TH inch ' Public Function MeasureString(ByVal text As String, ByVal aFont As System.Drawing.Font, ByVal width As Integer) As System.Drawing.SizeF Return (GraphicsAlt.GetMeasureGraphics()).MeasureString(text, aFont, width) End Function End Module
答案 6 :(得分:0)
如果有人仍想找到答案,我已经实施了一个相当容易理解的方法来找出结果文本的高度。
Public Function PrintString(text As String, ft As XFont, rect As XRect, graph As XGraphics, b As SolidBrush, Optional tf As XTextFormatter = Nothing) As Integer
If Not IsNothing(tf) Then
tf.DrawString(text, ft, b, rect)
Else
Dim drawLeft As New XStringFormat
drawLeft.Alignment = XStringAlignment.Near
graph.DrawString(text, ft, b, rect, drawLeft)
End If
Dim width As Double = graph.MeasureString(text, ft).Width
Dim multiplier As Integer = 0
While width > 0
multiplier += 1
width -= rect.Width
End While
Dim height As Double = (graph.MeasureString(text, ft).Height) * multiplier
Return height
End Function
解释代码:
首先,打印文本。我包含了一个名为tf的可选XTextFormatter,因为我在我的应用程序中可以交替使用XGraphics或XTextFormatters。
然后,通过MeasureString()计算文本的长度。宽度。
然后,计算出有多少行文字。这是通过将先前找到的文本的总长度除以打印税的提供的矩形(框)的宽度来完成的。我在这里做了一个while循环。
将文本的高度(使用graph.MeasureString()。Height)乘以有的行数。这是文本的最终高度。
返回高度值。现在,调用PrintString()函数将打印提供的文本,同时返回打印文本的高度。
答案 7 :(得分:0)
PDFsharp包含一个类XTextFormatter,可用于绘制带有换行符的文本。
然而,它无法确定文本所需的高度。受到@ Wakka02评论的启发,我改进了这个类,生成了类XTextFormatterEx 在我看来,它也回答了原来的问题,因此我发了一个答案 我知道这是一个老问题,答案可能无法帮助OP,但这是一个经常被问到的问题,答案可能对其他人有所帮助。
新课程有500行代码 - 我认为这对于这篇文章来说太过分了。
源代码可以在PDFsharp论坛上找到:
http://forum.pdfsharp.net/viewtopic.php?p=9213#p9213
也可以在我不起眼的博客中找到:
http://developer.th-soft.com/developer/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/
使用新课程时,您可以先致电PrepareDrawString
,了解文字的适合程度以及拟合文字的高度。然后,您的解码器可以绘制准备好的文本或准备另一个文本或使用不同的矩形准备相同的文本。
我的新班上课: XTextFormatterEx tf = new XTextFormatterEx(gfx); int lastCharIndex; double neededHeight;
// Draw the text in a box with the optimal height
// (magic: we know that one page is enough).
XRect rect = new XRect(40, 100, 250, double.MaxValue);
//tf.Alignment = ParagraphAlignment.Left;
tf.PrepareDrawString(text, font, rect,
out lastCharIndex, out neededHeight);
rect = new XRect(40, 100, 250, neededHeight);
gfx.DrawRectangle(XBrushes.SeaShell, rect);
// Both variants should look the same.
// Optimized version: draw the prepared string.
tf.DrawString(XBrushes.Black, XStringFormats.TopLeft);
准备文本会多次调用MeasureString。之后,可以在不重新调用MeasureString的情况下绘制准备好的文本。
截至今天(Juli 17,2015),类XTextFormatterEx(与原始XTextFormatter一样)使用XFont类的内部字段。这需要在编写课程时进行特殊处理。我下载了完整的PDFsharp 1.32源代码包后,决定将我的XTextFormatterEx类复制到PDFsharp文件夹中。
任何试图修改XTextFormatter或XTextFormatterEx类的人都将面临同样的问题
我希望将来的PDFsharp版本可以解决这个问题,允许这些类的修改版本包含在应用程序项目中。