6

PDFSharpは、長いテキスト部分を描画するときに自動テキスト折り返しをサポートします。

textFormatter.DrawString(text, font, XBrushes.Black, new XRect(x, y, textAreaWidth, 1000), XStringFormats.TopLeft);

。より長い場合、これによりテキストが折り返されますtextAreaWidth

描画したばかりのテキストの高さを取得するにはどうすればよいですか?

で試してみましたgfx.MeasureString()が、最大幅の指定をサポートするオーバーロードはありません。gfx.MeasureString()テキストを折り返すことなくテキストのサイズを返します。

ヒントをありがとう。

4

3 に答える 3

6

PdfSharpのこの拡張機能は、私にはうまく機能しませんでした。理由はわかりませんが、予想よりも高い高さを維持していました(必要な高さのほぼ2倍)。そこで、maxWidthを指定してソフト改行を内部的に計算できるXGraphicsオブジェクトの拡張メソッドを作成することにしました。コードはXGraphics.MeasureString(string, XFont)、インライン化されたテキストのデフォルトの幅を使用し、テキストの単語を集約して改行を計算します。ソフト改行を計算するコードは次のようになります。

/// <summary>
/// Calculate the number of soft line breaks
/// </summary>
private static int GetSplittedLineCount(this XGraphics gfx, string content, XFont font, double maxWidth)
{
    //handy function for creating list of string
    Func<string, IList<string>> listFor = val => new List<string> { val };
    // string.IsNullOrEmpty is too long :p
    Func <string, bool> nOe = str => string.IsNullOrEmpty(str);
    // return a space for an empty string (sIe = Space if Empty)
    Func<string, string> sIe = str => nOe(str) ? " " : str;
    // check if we can fit a text in the maxWidth
    Func<string, string, bool> canFitText = (t1, t2) => gfx.MeasureString($"{(nOe(t1) ? "" : $"{t1} ")}{sIe(t2)}", font).Width <= maxWidth;

    Func<IList<string>, string, IList<string>> appendtoLast =
            (list, val) => list.Take(list.Count - 1)
                               .Concat(listFor($"{(nOe(list.Last()) ? "" : $"{list.Last()} ")}{sIe(val)}"))
                               .ToList();

    var splitted = content.Split(' ');

    var lines = splitted.Aggregate(listFor(""),
            (lfeed, next) => canFitText(lfeed.Last(), next) ? appendtoLast(lfeed, next) : lfeed.Concat(listFor(next)).ToList(),
            list => list.Count());

    return lines;
}

完全なコードについては、次の要点を参照してください:https ://gist.github.com/erichillah/d198f4a1c9e8f7df0739b955b245512a

于 2016-10-11T09:53:26.193 に答える
3

XTextFormatterクラス(PDFsharpに含まれているソースコード)は、始めるためのものです。ニーズに合わない場合は変更してください。

XTextFormatterは内部でY位置を保持するため、描画されたばかりのテキストの高さを返すのはかなり簡単な変更になります。

XTextFormatterを変更する代わりに、代わりにMigraDoc Foundation(これも含まれています)の使用を検討してください。

于 2013-03-18T14:09:45.933 に答える
1

PdfSharpのこの拡張機能が、この問題の答えであることがわかりました。

http://developer.th-soft.com/developer/2015/07/17/pdfsharp-improving-the-xtextformatter-class-measuring-the-height-of-the-text/

ここで、関連するコードのクローンを作成またはフォークできます。

https://github.com/yolpsoftware/PdfSharp/tree/measure-text-height

于 2016-09-08T14:59:39.037 に答える