GoodsReturnForm.cs
//
// このコードは、DioDocs for PDF のサンプルの一部として提供されています。
// © MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using GrapeCity.Documents.Common;
using GrapeCity.Documents.Drawing;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Pdf.Annotations;
using GrapeCity.Documents.Pdf.AcroForms;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;
namespace DsPdfWeb.Demos.OrderReturnForm
{
// 複数の入力項目と複雑なレイアウトを持つ「商品返品または交換フォーム」 AcroForm を作成します。
public class GoodsReturnForm
{
// ページの余白。
const float MarginLeft = 32;
const float MarginTop = 32;
const float MarginRight = 32;
const float MarginBottom = 32;
//
const float TableCaptionHeight = 20;
readonly float TableSampleHeight = Textbox.Height;
const float SmallTextVOff = -0.5f;
// 区切り線。
float CaptionLineThickness = 2.5f;
// テキストスタイルを保持する構造体。
struct TextStyle
{
public GCTEXT.Font Font;
public float FontSize;
public Color ForeColor;
public float GlyphAdvanceFactor;
}
// フォーム全体で使用されるさまざまなスタイル。
static TextStyle TsTitle = new TextStyle()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "SitkaB.ttc")),
FontSize = 30,
ForeColor = Color.FromArgb(0xff, 0x3b, 0x5c, 0xaa),
GlyphAdvanceFactor = 0.93f,
};
static TextStyle TsCaption = new TextStyle()
{
Font = TsTitle.Font,
FontSize = 14,
ForeColor = Color.FromArgb(0xff, 0x3b, 0x5c, 0xaa),
GlyphAdvanceFactor = 0.93f,
};
static TextStyle TsBold = new TextStyle()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arialbd.ttf")),
FontSize = 9,
ForeColor = Color.Black,
GlyphAdvanceFactor = 1,
};
static TextStyle TsNormal = new TextStyle()
{
Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "arial.ttf")),
FontSize = 8f,
ForeColor = Color.Black,
GlyphAdvanceFactor = 0.922f,
};
static TextStyle TsSmall = new TextStyle()
{
Font = TsNormal.Font,
FontSize = 5,
ForeColor = Color.FromArgb(0x0F, 0x0F, 0x0F),
GlyphAdvanceFactor = 1.1f,
};
// 入力フィールドスタイル。
struct Textbox
{
static public GCTEXT.Font Font = TsNormal.Font;
static public float FontSize = 12;
static public float Height;
static public float BaselineOffset;
static public float LabelSpacing = 2;
}
struct Checkbox
{
static public GCTEXT.Font Font = TsNormal.Font;
static public float FontSize = TsNormal.FontSize - 2;
static public float Height;
static public float BaselineOffset;
static public float LabelSpacing = 3;
}
// 作成されるドキュメント。
private GcPdfDocument _doc;
// 挿入位置。
private PointF _ip = new PointF(MarginLeft, MarginTop);
// null でない場合、DrawText はテキストを最後のベースラインに揃えるためにこれを使用します
private float? _lastBaselineOffset = null;
// 現在の値へのショートカット。
private int CurrPageIdx => _doc.Pages.Count - 1;
private Page CurrPage => _doc.Pages[CurrPageIdx];
private GcGraphics CurrGraphics => CurrPage.Graphics;
// 静的コンストラクタ。
static GoodsReturnForm()
{
// テキストボックスの初期化。
GCTEXT.TextLayout tl = new GCTEXT.TextLayout(72);
tl.Append("Qwerty");
tl.DefaultFormat.Font = Textbox.Font;
tl.DefaultFormat.FontSize = Textbox.FontSize;
tl.PerformLayout(true);
Textbox.Height = tl.ContentHeight;
Textbox.BaselineOffset = tl.Lines[0].GlyphRuns[0].BaselineOffset;
// チェックボックスの初期化。
tl.Clear();
tl.Append("Qwerty");
tl.DefaultFormat.Font = Checkbox.Font;
tl.DefaultFormat.FontSize = Checkbox.FontSize;
tl.PerformLayout(true);
Checkbox.Height = tl.ContentHeight;
Checkbox.BaselineOffset = tl.Lines[0].GlyphRuns[0].BaselineOffset;
}
// メインエントリポイント。
public int CreatePDF(Stream stream)
{
Acme();
_doc.Save(stream);
return _doc.Pages.Count;
}
// 挿入位置を垂直に設定または進めます。
private void SetY(float? abs, float? offset)
{
if (abs.HasValue)
_ip.Y = abs.Value;
if (offset.HasValue)
_ip.Y += offset.Value;
_lastBaselineOffset = null;
}
// PDF フォームを作成します。
private void Acme()
{
_doc = new GcPdfDocument();
_doc.NewPage();
var pageWidth = CurrPage.Size.Width;
// メインキャプション。
SetY(null, -2);
var cr = DrawText("ACME Inc.", TsTitle);
SetY(null, _lastBaselineOffset - CaptionLineThickness / 2);
DrawGreenLine(MarginLeft, cr.Left - CaptionLineThickness);
DrawGreenLine(cr.Right + CaptionLineThickness, pageWidth - MarginRight);
// '返品と交換フォーム'。
SetY(cr.Bottom, 10);
cr = DrawText("Return and Exchange Form", TsCaption);
SetY(null, CaptionLineThickness + 14);
cr = DrawText("Please type in the appropriate information below, then print this form.", TsBold);
_ip.X = pageWidth - 150;
cr = DrawText("Have Any Questions?", TsBold);
SetY(null, 10);
_ip.X = MarginLeft;
cr = DrawText("(Or you may print the form and complete it by hand.)", TsNormal);
_ip.X = pageWidth - 150;
cr = DrawText("Please call us at 800-123-4567.", TsNormal);
// Step 1 - 1行目:
SetY(null, 18);
_ip.X = MarginLeft;
cr = DrawText("Step 1", TsCaption);
_ip.X = cr.Right + 10;
cr = DrawText("Original Order #", TsBold);
_ip.X = cr.Right + 4;
cr = DrawText("(if available):", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(120);
_ip.X = cr.Right + 6;
cr = DrawText("Estimated Order Date:", TsBold);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
SetY(null, 17);
DrawGreenLine();
// Step 1 - 2行目:
SetY(null, 10);
_ip.X = MarginLeft;
cr = DrawText("Originally Purchased by:", TsBold);
_ip.X = cr.Right + 20;
cr = DrawCheckbox("Address Change");
float col1right = pageWidth / 2 - 10;
float col2left = col1right + 20;
_ip.X = col2left;
cr = DrawText("Send Refund or Exchange to:", TsBold);
_ip.X = cr.Right + 2;
cr = DrawText("(If different from left)", TsNormal);
// Step 1 - 3行目:
SetY(cr.Bottom, 10);
_ip.X = MarginLeft;
cr = DrawText("Name:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(col1right - _ip.X);
_ip.X = col2left;
cr = DrawText("Name:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// Step 1 - 4行目:
SetY(cr.Bottom, 4 + 4);
_ip.X = MarginLeft;
cr = DrawText("Address:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(col1right - _ip.X);
_ip.X = col2left;
cr = DrawText("Address:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// Step 1 - 5行目:
SetY(cr.Bottom, 4 + 0.5f);
_ip.X = MarginLeft;
cr = DrawTextbox(col1right - _ip.X);
_ip.X = col2left;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// Step 1 - 6行目 (city state zip):
SetY(cr.Bottom, 4 + 0.5f);
_ip.X = MarginLeft;
cr = DrawTextbox(160);
_ip.X = cr.Right + 4;
float oState = _ip.X - MarginLeft;
cr = DrawTextbox(40);
_ip.X = cr.Right + 4;
float oZip = _ip.X - MarginLeft;
cr = DrawTextbox(col1right - _ip.X);
//
_ip.X = col2left;
cr = DrawTextbox(160);
_ip.X = cr.Right + 4;
cr = DrawTextbox(40);
_ip.X = cr.Right + 4;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// 小文字
SetY(cr.Bottom, SmallTextVOff);
_ip.X = MarginLeft;
cr = DrawText("(City)", TsSmall);
_ip.X = MarginLeft + oState;
cr = DrawText("(State)", TsSmall);
_ip.X = MarginLeft + oZip;
cr = DrawText("(Zip)", TsSmall);
//
_ip.X = col2left;
cr = DrawText("(City)", TsSmall);
_ip.X = col2left + oState;
cr = DrawText("(State)", TsSmall);
_ip.X = col2left + oZip;
cr = DrawText("(Zip)", TsSmall);
// Step 1 - 7行目 (daytime):
SetY(cr.Bottom, 4 - 0.5f);
_ip.X = MarginLeft;
cr = DrawText("Phone: (", TsNormal);
_ip.X = cr.Right;
cr = DrawTextbox(30);
_ip.X = cr.Right;
cr = DrawText(")", TsNormal);
_ip.X += 3;
cr = DrawTextbox(80);
float oDay = cr.Left - MarginLeft + 10;
// (evening)
_ip.X = cr.Right + 3;
cr = DrawText("(", TsNormal);
_ip.X = cr.Right;
cr = DrawTextbox(30);
_ip.X = cr.Right;
cr = DrawText(")", TsNormal);
_ip.X += 3;
cr = DrawTextbox(col1right - _ip.X);
float oEve = cr.Left - MarginLeft + 10;
//
_ip.X = col2left;
cr = DrawText("Phone: (", TsNormal);
_ip.X = cr.Right;
cr = DrawTextbox(30);
_ip.X = cr.Right;
cr = DrawText(")", TsNormal);
_ip.X += 3;
cr = DrawTextbox(80);
// (evening)
_ip.X = cr.Right + 3;
cr = DrawText("(", TsNormal);
_ip.X = cr.Right;
cr = DrawTextbox(30);
_ip.X = cr.Right;
cr = DrawText(")", TsNormal);
_ip.X += 3;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// 小文字
SetY(cr.Bottom, SmallTextVOff);
_ip.X = MarginLeft + oDay;
cr = DrawText("(Daytime)", TsSmall);
_ip.X = MarginLeft + oEve;
cr = DrawText("(Evening)", TsSmall);
_ip.X = col2left + oDay;
cr = DrawText("(Daytime)", TsSmall);
_ip.X = col2left + oEve;
cr = DrawText("(Evening)", TsSmall);
// Step 1 - email
SetY(cr.Bottom, 4 - 0.5f);
_ip.X = MarginLeft;
cr = DrawText("Email Address:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(col1right - _ip.X);
_ip.X = col2left;
cr = DrawText("Email Address:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// Options:
SetY(null, 16);
_ip.X = MarginLeft;
cr = DrawText("Please select one of the following options:", TsBold);
SetY(cr.Bottom, 2);
cr = DrawCheckbox("Exchange for another item(s).");
SetY(cr.Bottom, 2);
cr = DrawCheckbox("Send me an ACME Gift Card for the amount of the refund.");
SetY(cr.Bottom, 2);
cr = DrawCheckbox("Reimburse my original method of payment. " +
"(Gift recipients who select this option will receive a merchandise only gift card.)");
// Step 2:
SetY(null, 18);
_ip.X = MarginLeft;
cr = DrawText("Step 2–Returns", TsCaption);
_ip.X = cr.Right + 10;
cr = DrawText("In the form below please indicate the item(s) you are returning, " +
"including a reason code.", TsNormal);
SetY(null, 17);
DrawGreenLine();
SetY(null, 10);
cr = DrawReturnsTable();
SetY(cr.Bottom, 10);
cr = DrawReasonCodes();
// Step 3:
SetY(null, 25);
_ip.X = MarginLeft;
cr = DrawText("Step 3–Exchanges", TsCaption);
_ip.X = cr.Right + 10;
SetY(null, -5);
cr = DrawText(
"For the fastest service, call Customer Service at 800-123-4567 to request a QuickExchange " +
"or place a new order online or by phone. We'll ship your new item right away. " +
"Note: If you use our QuickExchange option, you do not need to fill out Step 3.",
TsNormal);
SetY(null, 22);
DrawGreenLine();
SetY(null, 10);
cr = DrawExchangesTable();
// Step 4:
SetY(null, 18);
_ip.X = MarginLeft;
cr = DrawText("Step 4", TsCaption);
SetY(null, 17);
DrawGreenLine();
SetY(null, 10);
_ip.X = MarginLeft;
float oCc = col2left - 30;
cr = DrawText("Method of Payment:", TsBold);
_ip.X = oCc;
cr = DrawText("Credit Card Information:", TsBold);
SetY(cr.Bottom, 2);
_ip.X = MarginLeft;
cr = DrawText("If the total of your exchange or new order exceeds the value of your\r\n" +
"return, please provide a method of payment. (Select one)", TsNormal);
_ip.X = oCc;
cr = DrawCheckbox("ACME® Visa®");
float oCcOff = 90;
_ip.X += oCcOff;
cr = DrawCheckbox("MasterCard®");
_ip.X += oCcOff;
cr = DrawCheckbox("JCB Card™");
SetY(cr.Bottom, 2);
_ip.X = oCc;
cr = DrawCheckbox("VISA");
_ip.X += oCcOff;
cr = DrawCheckbox("American Express");
_ip.X += oCcOff;
cr = DrawCheckbox("Discover®/Novus® Cards");
SetY(cr.Bottom, 4);
_ip.X = MarginLeft;
cr = DrawCheckbox("Credit Card");
SetY(cr.Bottom, 2);
cr = DrawCheckbox("Check or Money Order enclosed");
SetY(cr.Bottom, 2);
cr = DrawCheckbox("Gift Card, Gift Certificate or ACME Visa coupon dollars.\r\n" +
"Enter # below (for Gift Cards, please include PIN).");
_ip.X = oCc;
cr = DrawText("Card Number:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(180);
_ip.X = cr.Right + 4;
cr = DrawTextbox(pageWidth - MarginRight - _ip.X);
// 小文字
SetY(cr.Bottom, SmallTextVOff);
_ip.X = cr.Left;
cr = DrawText("Exp. Date (MM/YY)", TsSmall);
SetY(cr.Bottom, 10);
_ip.X = MarginLeft;
cr = DrawText("Number:", TsNormal);
_ip.X = cr.Right + Textbox.LabelSpacing;
cr = DrawTextbox(140);
float tbBottom = cr.Bottom;
_ip.X = cr.Right + 4;
cr = DrawTextbox(60);
float oPin = cr.Left;
_ip.X = oCc;
cr = DrawText("Signature:", TsNormal);
CurrGraphics.DrawLine(new PointF(cr.Right, cr.Bottom),
new PointF(pageWidth - MarginRight, cr.Bottom), Color.Black, 0.5f);
// 小文字
SetY(tbBottom, SmallTextVOff);
_ip.X = oPin;
cr = DrawText("PIN", TsSmall);
}
private void DrawGreenLine(float? from = null, float? to = null)
{
var page = CurrPage;
if (!from.HasValue)
from = MarginLeft;
if (!to.HasValue)
to = page.Size.Width - MarginRight;
var g = page.Graphics;
var pen = new GCDRAW.Pen(TsTitle.ForeColor, CaptionLineThickness);
g.DrawLine(new PointF(from.Value, _ip.Y), new PointF(to.Value, _ip.Y), pen);
}
private RectangleF DrawText(string text, TextStyle ts)
{
var page = CurrPage;
GCTEXT.TextLayout tl = page.Graphics.CreateTextLayout();
tl.MaxWidth = page.Size.Width - MarginRight - _ip.X;
if (ts.FontSize == TsTitle.FontSize) // patch
tl.TextAlignment = GCTEXT.TextAlignment.Center;
tl.DefaultFormat.Font = ts.Font;
tl.DefaultFormat.FontSize = ts.FontSize;
tl.DefaultFormat.GlyphAdvanceFactor = ts.GlyphAdvanceFactor;
tl.DefaultFormat.ForeColor = ts.ForeColor;
tl.Append(text);
tl.PerformLayout(true);
var line = tl.Lines[tl.Lines.Count - 1];
var run = line.GlyphRuns[0];
var baselineOffset = run.BaselineOffset;
var p = _lastBaselineOffset.HasValue ?
new PointF(_ip.X, _ip.Y + _lastBaselineOffset.Value - baselineOffset) : _ip;
page.Graphics.DrawTextLayout(tl, p);
if (!_lastBaselineOffset.HasValue)
_lastBaselineOffset = baselineOffset; //#34 within one 'line', keep using the first offset
return new RectangleF(_ip.X + tl.ContentX, _ip.Y + tl.ContentY, tl.ContentWidth, tl.ContentHeight);
}
private RectangleF DrawTextbox(float width, bool inTable = false)
{
var fld = new TextField();
fld.Widget.Page = CurrPage;
var p = _lastBaselineOffset.HasValue ?
new PointF(_ip.X, _ip.Y + _lastBaselineOffset.Value - Textbox.BaselineOffset) : _ip;
fld.Widget.Rect = new RectangleF(p.X, p.Y, width, Textbox.Height);
if (inTable)
fld.Widget.Border = null;
else
fld.Widget.Border.Style = BorderStyle.Underline;
fld.Widget.DefaultAppearance.Font = Textbox.Font;
fld.Widget.DefaultAppearance.FontSize = Textbox.FontSize;
_doc.AcroForm.Fields.Add(fld);
if (!_lastBaselineOffset.HasValue)
_lastBaselineOffset = Textbox.BaselineOffset;
return fld.Widget.Rect;
}
private RectangleF DrawCheckbox(string text)
{
var fld = new CheckBoxField();
fld.Widget.Page = CurrPage;
var p = _lastBaselineOffset.HasValue ?
new PointF(_ip.X, _ip.Y + _lastBaselineOffset.Value - Checkbox.BaselineOffset) : _ip;
fld.Widget.Rect = new RectangleF(p.X, p.Y, Checkbox.Height, Checkbox.Height);
_doc.AcroForm.Fields.Add(fld);
if (!_lastBaselineOffset.HasValue)
_lastBaselineOffset = Checkbox.BaselineOffset;
var pSave = _ip;
_ip.X = fld.Widget.Rect.Right + Checkbox.LabelSpacing;
var r = DrawText(text, TsNormal);
_ip = pSave;
return new RectangleF(fld.Widget.Rect.X, r.Y, r.Right - fld.Widget.Rect.Left, r.Height);
}
private RectangleF DrawReturnsTable()
{
float[] widths = new float[]
{
55,
60,
60,
35,
35,
200,
50,
0
};
string[] captions = new string[]
{
"Reason Code",
"Item #",
"Color",
"Size",
"Quantity",
"Item Name",
"Pirce",
"Total",
};
string[] samples = new string[]
{
"23",
"KK123456",
"Navy",
"8",
"1",
"Example Item Only",
"59.00",
"59.00",
};
return DrawTable(widths, captions, samples, 4);
}
private RectangleF DrawExchangesTable()
{
// この表には、2つの列にまたがる2つの特別なタイトルがあります。
// これを実現するには、次のようにします。
// - これらの4つの列の列タイトルを「第2段落」として印刷し、スパンタイトルに
// 空の行を残します。
// - スパンタイトルを特別な場合としてここに表示します。
float[] widths = new float[]
{
50,
25,
25,
25,
25,
60,
150,
50,
40,
25,
35,
0
};
string[] captions = new string[]
{
"Item",
"Style",
"\r\n1st",
"\r\n2nd",
"Size",
"Sleeve Length\r\n& Inseam",
"Item Name",
"\r\nCharacters",
"\r\nStyle",
"Qty.",
"Price",
"Total"
};
string[] samples = new string[]
{
"LH123456",
"Plain",
"Tan",
"Olive",
"8",
"28",
"Example Item Only",
"Amanda",
"Block",
"1",
"49.95",
"49.95"
};
var cr = DrawTable(widths, captions, samples, 4);
// 2つのスパンタイトルを印刷します。
var g = CurrGraphics;
GCTEXT.TextLayout tl = g.CreateTextLayout();
tl.ParagraphAlignment = GCTEXT.ParagraphAlignment.Near;
tl.TextAlignment = GCTEXT.TextAlignment.Center;
tl.DefaultFormat.Font = TsNormal.Font;
tl.DefaultFormat.FontSize = TsNormal.FontSize;
tl.DefaultFormat.GlyphAdvanceFactor = TsNormal.GlyphAdvanceFactor;
tl.DefaultFormat.ForeColor = Color.White;
tl.WrapMode = GCTEXT.WrapMode.NoWrap;
// Color Choice
var width = widths[2] + widths[3];
tl.MaxWidth = width;
tl.Append("Color Choice");
tl.PerformLayout(true);
var pt = new PointF(cr.Left + widths[0] + widths[1], cr.Top);
g.DrawTextLayout(tl, pt);
var pen = new GCDRAW.Pen(Color.White, 0.5f);
var pt1 = new PointF(pt.X + 0.5f, pt.Y + TableCaptionHeight / 2);
var pt2 = new PointF(pt1.X + width, pt1.Y);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + widths[2] + 0.5f, pt.Y + TableCaptionHeight / 2);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + 0.5f, pt.Y);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + width + 0.5f, pt.Y);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
// Monogramming
width = widths[7] + widths[8];
tl.Inlines.Clear();
tl.MaxWidth = width;
tl.Append("Monogramming");
tl.PerformLayout(true);
pt = new PointF(cr.Left + widths[0] + widths[1] + widths[2] + widths[3] + widths[4] + widths[5] + widths[6], cr.Top);
g.DrawTextLayout(tl, pt);
pt1 = new PointF(pt.X + 0.5f, pt.Y + TableCaptionHeight / 2);
pt2 = new PointF(pt1.X + width, pt1.Y);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + widths[7] + 0.5f, pt.Y + TableCaptionHeight / 2);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + 0.5f, pt.Y);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
pt1 = new PointF(pt.X + width + 0.5f, pt.Y);
pt2 = new PointF(pt1.X, pt.Y + TableCaptionHeight);
g.DrawLine(pt1, pt2, pen);
return cr;
}
private RectangleF DrawTable(float[] widths, string[] captions, string[] samples, int rowCount)
{
System.Diagnostics.Debug.Assert(captions.Length == widths.Length && samples.Length == widths.Length);
var ipSave = _ip;
var p = new GCDRAW.Pen(Color.Black, 0.5f);
var g = CurrGraphics;
GCTEXT.TextLayout tl = g.CreateTextLayout();
tl.ParagraphAlignment = GCTEXT.ParagraphAlignment.Center;
tl.TextAlignment = GCTEXT.TextAlignment.Center;
tl.DefaultFormat.Font = TsNormal.Font;
tl.DefaultFormat.FontSize = TsNormal.FontSize;
tl.DefaultFormat.GlyphAdvanceFactor = TsNormal.GlyphAdvanceFactor;
tl.DefaultFormat.ForeColor = Color.White;
tl.WrapMode = GCTEXT.WrapMode.NoWrap;
tl.MaxHeight = TableCaptionHeight;
float totW = 0;
for (int i = 0; i < widths.Length; ++i)
{
if (i == widths.Length - 1)
{
widths[i] = CurrPage.Size.Width - MarginLeft - MarginRight - totW - 1;
totW += 1;
}
totW += widths[i];
}
g.FillRectangle(new RectangleF(MarginLeft, _ip.Y, totW, TableCaptionHeight), Color.Black);
var pt = new PointF(MarginLeft, _ip.Y);
for (int i = 0; i < widths.Length; ++i)
{
tl.MaxWidth = widths[i];
tl.Append(captions[i]);
tl.PerformLayout(true);
g.DrawTextLayout(tl, pt);
pt.X = pt.X + widths[i];
tl.Inlines.Clear();
}
tl.DefaultFormat.ForeColor = Color.Teal;
tl.MaxHeight = TableSampleHeight;
pt = new PointF(MarginLeft, _ip.Y + TableCaptionHeight);
for (int i = 0; i < widths.Length; ++i)
{
tl.MaxWidth = widths[i];
tl.Append(samples[i]);
tl.PerformLayout(true);
g.DrawTextLayout(tl, pt);
pt.X = pt.X + widths[i];
tl.Inlines.Clear();
}
SetY(_ip.Y + TableCaptionHeight + TableSampleHeight, 0.5f);
for (int row = 0; row < rowCount; ++row)
{
_ip.X = MarginLeft + 1;
for (int i = 0; i < widths.Length; ++i)
{
var cr = DrawTextbox(widths[i] - 1, true);
_ip.X = cr.Right + 1;
}
g.DrawLine(new PointF(MarginLeft, _ip.Y - 0.5f), new PointF(MarginLeft + totW, _ip.Y - 0.5f), p);
SetY(null, Textbox.Height + 1);
}
var totH = TableCaptionHeight + TableSampleHeight + (Textbox.Height + 1) * rowCount;
_ip.X = MarginLeft + 0.5f;
for (int i = 0; i < widths.Length - 1; ++i)
{
_ip.X += widths[i];
g.DrawLine(new PointF(_ip.X, ipSave.Y), new PointF(_ip.X, ipSave.Y + totH), p);
}
var rect = new RectangleF(MarginLeft, ipSave.Y, totW, totH);
g.DrawRectangle(rect, p);
return rect;
}
private RectangleF DrawReasonCodes()
{
float startX = 150;
float capOff = 16;
float colOff = 110;
var ipSave = _ip;
_ip.X = startX;
var cr = DrawText("01", TsNormal);
_ip.X += capOff;
cr = DrawText("Unsatisfactory", TsNormal);
_ip.X = startX + colOff;
cr = DrawText("33", TsNormal);
_ip.X += capOff;
cr = DrawText("Did not like color", TsNormal);
_ip.X = startX + colOff * 2;
cr = DrawText("23", TsNormal);
_ip.X += capOff;
cr = DrawText("Ordered wrong size", TsNormal);
_ip.X = startX + colOff * 3;
cr = DrawText("51", TsNormal);
_ip.X += capOff;
cr = DrawText("Shipping damage", TsNormal);
SetY(null, TsNormal.FontSize + 2);
_ip.X = startX;
cr = DrawText("02", TsNormal);
_ip.X += capOff;
cr = DrawText("Defective construction", TsNormal);
_ip.X = startX + colOff;
cr = DrawText("21", TsNormal);
_ip.X += capOff;
cr = DrawText("Too small", TsNormal);
_ip.X = startX + colOff * 2;
cr = DrawText("25", TsNormal);
_ip.X += capOff;
cr = DrawText("Too short", TsNormal);
_ip.X = startX + colOff * 3;
cr = DrawText("52", TsNormal);
_ip.X += capOff;
cr = DrawText("Wrong item shipped", TsNormal);
_ip.X = MarginLeft + 10;
cr = DrawText("Reason Codes", TsBold);
float lineX = cr.Right + 20;
SetY(null, TsNormal.FontSize + 2);
_ip.X = startX;
cr = DrawText("31", TsNormal);
_ip.X += capOff;
cr = DrawText("Did not like styling", TsNormal);
_ip.X = startX + colOff;
cr = DrawText("22", TsNormal);
_ip.X += capOff;
cr = DrawText("Too large", TsNormal);
_ip.X = startX + colOff * 2;
cr = DrawText("36", TsNormal);
_ip.X += capOff;
cr = DrawText("Too long", TsNormal);
var rect = new RectangleF(MarginLeft, ipSave.Y, CurrPage.Size.Width, cr.Bottom - ipSave.Y);
CurrGraphics.DrawLine(lineX, rect.Top, lineX, rect.Bottom, Color.Black, 0.5f);
return rect;
}
}
}