2009-08-27 36 views
2

XTextFormatterを使用するかどうかにかかわらず、LayoutRectangleの高さを0にするなど、同じエラーが発生します。PdfSharp:テキストの高さ/配置の問題

new PdfSharp.Drawing.Layout.XTextFormatter(_gfx).DrawString(text 
    , new PdfSharp.Drawing.XFont(fontName, fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle) 
    , new PdfSharp.Drawing.XSolidBrush(PdfSharp.Drawing.XColor.FromArgb(foreColour)) 
    , new PdfSharp.Drawing.XRect(new PdfSharp.Drawing.XPoint(xPos, yPos), new PdfSharp.Drawing.XPoint(xLimit, yLimit)) 
    , PdfSharp.Drawing.XStringFormats.Default); 

のfontStyleは型System.Drawing.FontStyleのforeColour 私はオリエンテーション=風景、サイズとPdfPageから_gfx既に事前定義されたを有するタイプのSystem.Drawing.Color あります=レター XPOSは、double型のパラメータ、XLIと同様であるYPOS mitおよびyLimit


私は矩形が高さを有することを意図している定義パー


... LayoutRectangleは ゼロ(0)の高さを持たなければならないことをランタイムエラーを取得しますそうでなければ、それをラインと呼んでください!私はそれを得ることはありません!...

私はXGraphics.DrawString()メソッドで直接試してみましたが、同じエラーが発生します。私はLayoutRectangleを使用することはできませんが、テキストを手動で目的の領域に収まるように管理する必要があるようです。

var textFont = new PdfSharp.Drawing.XFont(fontName, fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle); 

while (xPos + _gfx.MeasureString(text, textFont).Width > xLimit) 
    textFont = new PdfSharp.Drawing.XFont(fontName, --fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle); 

while (yPos + _gfx.MeasureString(text, textFont).Height > yLimit && fontSize > 0) 
    textFont = new PdfSharp.Drawing.XFont(fontName, --fontSize, (PdfSharp.Drawing.XFontStyle)fontStyle); 

_gfx.DrawString(text 
    , textFont 
    , new PdfSharp.Drawing.XSolidBrush(PdfSharp.Drawing.XColor.FromArgb(foreColour)) 
    , new PdfSharp.Drawing.XPoint(xPos, yPos)); 

yPosの変数の値はまったく同じ値ですが、

* YPOS = Page.Height * 0.4093、いずれかのページの高さの40,93%*

私がやろう何の同封例:。

の「Hello World ! " "こんにちは ワールド!"

そして、ここで私が得るものです:

     "Hello World!" 

の "Hello World!"

とが異なるため、印字領域の制限やフォントと異なるフォントスタイルのサイズの

、私はちょうどスペースの正確な数を含む1つの単文にこれらを記述することはできません。

答えて

6

引用符で囲まれたエラーメッセージは、他の人があなたを助けるのに役立ちます。

エラーメッセージが表示されます。 "DrawString:XLineAlignment.BaseLineを使用すると、レイアウト矩形の高さは0にする必要があります。 テキストは1行に整列されるため、高さは0にする必要があります。はい、それは行です。 長方形を指定する場合、別の配置を使用します。

TextLayoutサンプルは、テキストの書式設定方法を示しています。
編集:Graphicsサンプルでは、​​テキストをレイアウトする方法(テキストの1行、自動改行なし、TextLayoutサンプルに示されているテクニックはXTextFormatterクラスを使用して改行を自動的に処理します)も示しています。

+0

XLineAlignmentプロパティは、実際には** Graphics **サンプルでのみ表示され、TextLayoutサンプルでは表示されません。おそらくTextLayoutサンプルにあるはずですが、ちょっとね! – noelicus

+0

@noelicus:TextLayoutサンプルは、XLineAlignmentを使わないでテキストをレイアウトする方法を示しています。質問はテキストレイアウトに関するものでした。 Graphicsサンプルは、XLineAlignmentを使ったテキストレイアウトの方法も示しています。 –

2

PdfSharpでテキストの配置がどのように機能するかを調べる際に、私が指定したY座標の上にDrawString()メソッドが書き込まれていることに気付きました。

(0,100)(x、y)で書きたい場合、これは左上隅の座標を指していましたが、これは左下隅を指しています。その結果、指定する必要があるテキスト文字列のY座標は100 + string.Height * .6になります。

PdfDocument pdfDoc = new PdfDocument(); 
PdfPage pdfPage = new pdfPage(); 
pdfPage.Size = PageSize.Letter; 
pdfPage.Orientation = Orientation.Landscape; 
pdfDoc.Pages.Add(pdfPage); 

double posX = 0; 
double posY = pdfPage.Height * .4093; 
string helloString = "Hello" 
string worldString = "World!" 

XFont helloFont = new XFont("Helvetica", 25, XFontStyle.Regular); 
XFont worldFont = new XFont("Helvetica", 270, XFontStyle.Bold); 

using(var pdfGfx = XGraphics.FromPdfPage(pdfPage)) { // assuming the default Point UOM 
    XSize helloStringSize = pdfGfx.MeasureString(helloString, helloFont); 
    XSize worldStringSize = pdfGfx.MeasureString(worldString, worldFont); 
pdfGfx.DrawString(helloString 
    , helloFont 
    , XBrushes.Black 
    , posX 
    , posY + helloStringSize.Height * .6 
    , XStringFormats.Default); 
pdfGfx.DrawString(worldString 
    , worldFont 
    , XBrushes.Black 
    , pdfPage.Width * .3978 
    , posY + (worldStringSize.Height + helloStringSize.Height) * .6 
    , XStringFormats.Default); 

}

私は私の文字列が私のYの下に書かれて取得したいとき、私は唯一の座標文字列サイズの60%を追加し、なぜあなたはおそらくだろうか?これは、フォントの高さ全体に何らかの跳躍が含まれているためです。したがって、計算結果は期待どおりではありません。一方、必要な場合は、飛躍を気にする必要はありません。私の特別なケースでは、私は飛躍を必要としないので、私は弦の高さからそれを取る必要があります。

私の説明にもっと正確な情報が必要と思われる場合は、コメントとして追加してください。

ありがとうございます!

関連する問題