2010-07-14 16:17:39 +00:00

161 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using Volian.Svg.Library;
namespace Volian.Print.Library
{
public class PageCount
{
private bool _CanIncrement = true;
public bool CanIncrement
{
get { return _CanIncrement; }
set { _CanIncrement = value; }
}
private int Increment()
{
if (CanIncrement) Total++;
CanIncrement = false;
return Total;
}
private int _Total;
public int Total
{
get { return _Total; }
set { _Total = value; }
}
private PageCountTemplates _MyTemplates; // (for each page that has this key)
internal PageCountTemplates MyTemplates
{
get
{
if (_MyTemplates == null) _MyTemplates = new PageCountTemplates();
return _MyTemplates;
}
set
{
_MyTemplates = value;
}
}
public void DrawTemplates()
{
foreach (PageCountTemplate pct in MyTemplates)
{
string fstr = pct.Text.Replace("{OF}", _Total.ToString());
// use font from pct
string fontFace = pct.MyFont.Name;
int fontStyle = (pct.MyFont.Bold ? iTextSharp.text.Font.BOLD : 0) + (pct.MyFont.Italic ? iTextSharp.text.Font.ITALIC : 0);
Font itextFont = Volian.Svg.Library.Svg.GetFont(fontFace, pct.MyFont.Size, fontStyle, pct.MyColor);
ColumnText columnText = new ColumnText(pct.MyTemplate);
float textSize = itextFont.BaseFont.GetWidthPoint(fstr, pct.MyFont.Size);
float flly = itextFont.BaseFont.GetDescentPoint("g", pct.MyFont.Size);
float lead = columnText.Leading;
columnText.Alignment = pct.Alignment;
Chunk chk = new Chunk(fstr, itextFont);
float width = chk.GetWidthPoint();
// justification:
float left = 0;
float right = width * 1.01F;
switch (pct.Alignment)
{
case Element.ALIGN_CENTER:
left = -.5F * width;
right = .51F * width;
break;
case Element.ALIGN_RIGHT:
left = -1.01F * width;
right = 0;
break;
}
pct.MyTemplate.BoundingBox = new Rectangle(left, 2 * flly, right, columnText.Leading); //2*flly account for descenders
columnText.SetSimpleColumn(left, 0, right, columnText.Leading);
columnText.SetText(new Phrase(chk));
columnText.Go();
}
}
public PdfTemplate AddToTemplateList(PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color)
{
Increment();
PageCountTemplate retTemplate = new PageCountTemplate(pdfWriter, text.Replace("{PAGE}",Total.ToString()), myFont, alignment, color);
MyTemplates.Add(retTemplate);
return retTemplate.MyTemplate;
}
}
public class PageCounts : Dictionary<string, PageCount>
{
public bool CanIncrement
{
set
{
foreach (PageCount pc in this.Values)
{
pc.CanIncrement = value;
}
}
}
public PdfTemplate AddToTemplateList(string key, PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color)
{
if (!this.ContainsKey(key)) this.Add(key, new PageCount());
return (this[key].AddToTemplateList(pdfWriter, text, myFont, alignment,color));
}
public void DrawTemplates()
{
foreach (PageCount pc in this.Values)
{
pc.DrawTemplates();
}
}
}
public class PageCountTemplate
{
private string _Text;
public string Text // "Page 1 of {OF}"
{
get { return _Text; }
set { _Text = value; }
}
private System.Drawing.Font _MyFont;
public System.Drawing.Font MyFont
{
get { return _MyFont; }
set { _MyFont = value; }
}
private int _Alignment; // iTextSharp Element.<XYZ>
public int Alignment
{
get { return _Alignment; }
set { _Alignment = value; }
}
private System.Drawing.Color _MyColor;
public System.Drawing.Color MyColor
{
get { return _MyColor; }
set { _MyColor = value; }
}
private PdfTemplate _MyTemplate;
public PdfTemplate MyTemplate
{
get { return _MyTemplate; }
set { _MyTemplate = value; }
}
public PageCountTemplate(PdfWriter pdfWriter, string text, System.Drawing.Font myFont, int alignment, System.Drawing.Color color)
{
// Create Template can be called with a small, i.e. 1, width/height because when
// it is actually drawn, the bounding box overrides the CreateTemplate values.
_MyTemplate = pdfWriter.DirectContent.CreateTemplate(1, 1);
_Text = text;
_MyFont = myFont;
_MyColor = color;
_Alignment = alignment;
}
}
public class PageCountTemplates : List<PageCountTemplate>
{
}
}