281 lines
9.1 KiB
C#
281 lines
9.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using iTextSharp.text;
|
|
using iTextSharp.text.pdf;
|
|
using iTextSharp.text.factories;
|
|
using Itenso.Rtf;
|
|
using Itenso.Rtf.Parser;
|
|
using Itenso.Rtf.Interpreter;
|
|
//using Itenso.Rtf.Model;
|
|
using Itenso.Rtf.Support;
|
|
using Microsoft.Win32;
|
|
|
|
namespace Volian.Print.Library
|
|
{
|
|
public partial class PrintOverride
|
|
{
|
|
public static bool CompressSub = false;
|
|
public static bool CompressSuper = false;
|
|
private static System.Drawing.Color _TextColor = System.Drawing.Color.Empty;
|
|
public static System.Drawing.Color TextColor
|
|
{
|
|
get { return _TextColor; }
|
|
set { _TextColor = value; }
|
|
}
|
|
public static System.Drawing.Color OverrideTextColor(System.Drawing.Color color)
|
|
{
|
|
if (_TextColor == System.Drawing.Color.Empty)
|
|
return color;
|
|
return _TextColor;
|
|
}
|
|
private static System.Drawing.Color _SvgColor = System.Drawing.Color.Empty;
|
|
public static System.Drawing.Color SvgColor
|
|
{
|
|
get { return _SvgColor; }
|
|
set { _SvgColor = value; Volian.Svg.Library.Svg.OverrideColor = value; }
|
|
}
|
|
public static System.Drawing.Color OverrideSvgColor(System.Drawing.Color color)
|
|
{
|
|
if (_SvgColor == System.Drawing.Color.Empty)
|
|
return color;
|
|
return _SvgColor;
|
|
}
|
|
private static System.Drawing.Color _BoxColor = System.Drawing.Color.Empty;
|
|
public static System.Drawing.Color BoxColor
|
|
{
|
|
get { return _BoxColor; }
|
|
set { _BoxColor = value; }
|
|
}
|
|
public static System.Drawing.Color OverrideBoxColor(System.Drawing.Color color)
|
|
{
|
|
if (_BoxColor == System.Drawing.Color.Empty)
|
|
return color;
|
|
return _BoxColor;
|
|
}
|
|
private static System.Drawing.Color _ChangeBarColor = System.Drawing.Color.Empty;
|
|
public static System.Drawing.Color ChangeBarColor
|
|
{
|
|
get { return _ChangeBarColor; }
|
|
set { _ChangeBarColor = value; }
|
|
}
|
|
public static System.Drawing.Color OverrideChangeBarColor(System.Drawing.Color color)
|
|
{
|
|
if (_ChangeBarColor == System.Drawing.Color.Empty)
|
|
return color;
|
|
return _ChangeBarColor;
|
|
}
|
|
private static System.Drawing.Color _DebugColor = System.Drawing.Color.Empty;
|
|
public static System.Drawing.Color DebugColor
|
|
{
|
|
get { return _DebugColor; }
|
|
set { _DebugColor = value; }
|
|
}
|
|
public static System.Drawing.Color OverrideDebugColor(System.Drawing.Color color)
|
|
{
|
|
if (_DebugColor == System.Drawing.Color.Empty)
|
|
return color;
|
|
return _DebugColor;
|
|
}
|
|
public static void Reset()
|
|
{
|
|
DebugColor = System.Drawing.Color.Empty;
|
|
TextColor = System.Drawing.Color.Empty;
|
|
SvgColor = System.Drawing.Color.Empty;
|
|
BoxColor = System.Drawing.Color.Empty;
|
|
ChangeBarColor = System.Drawing.Color.Empty;
|
|
}
|
|
}
|
|
public class Rtf2iTextSharp : RtfVisualVisitorBase
|
|
{
|
|
private static bool _DoingComparison = false;
|
|
public static bool DoingComparison
|
|
{
|
|
get { return Rtf2iTextSharp._DoingComparison; }
|
|
set { Rtf2iTextSharp._DoingComparison = value; }
|
|
}
|
|
|
|
private IRtfDocument _RtfDoc;
|
|
private Paragraph _MyParagraph = new Paragraph();
|
|
private iTextSharp.text.Font _MyFont;
|
|
// public Rtf2iTextSharp(IRtfDocument rtfDoc, Document doc, PdfWriter writer)
|
|
public Rtf2iTextSharp(IRtfDocument rtfDoc)
|
|
{
|
|
if (rtfDoc == null)
|
|
throw new ArgumentNullException("rtfDoc");
|
|
|
|
_RtfDoc = rtfDoc;
|
|
}
|
|
public Paragraph Convert()
|
|
{
|
|
_MyParagraph.Clear();
|
|
_MyFont = null;
|
|
foreach (IRtfVisual visual in _RtfDoc.VisualContent)
|
|
visual.Visit(this);
|
|
//_MyParagraph.SetLeading(0, 1);
|
|
return _MyParagraph;
|
|
}
|
|
// ----------------------------------------------------------------------
|
|
protected override void DoVisitBreak(IRtfVisualBreak visualBreak)
|
|
{
|
|
switch (visualBreak.BreakKind)
|
|
{
|
|
case RtfVisualBreakKind.Line:
|
|
_MyParagraph.Add(Chunk.NEWLINE);
|
|
break;
|
|
case RtfVisualBreakKind.Page:
|
|
break;
|
|
case RtfVisualBreakKind.Paragraph:
|
|
_MyParagraph.Add(Chunk.NEWLINE);
|
|
break;
|
|
case RtfVisualBreakKind.Section:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
//_MyParagraph.Add(string.Format("<{0}>", visualBreak.BreakKind.ToString()));
|
|
}
|
|
protected override void DoVisitSpecial(IRtfVisualSpecialChar visualSpecialChar)
|
|
{
|
|
//_MyParagraph.Add(string.Format("<special {0}>", visualSpecialChar.CharKind.ToString()));
|
|
switch (visualSpecialChar.CharKind)
|
|
{
|
|
case RtfVisualSpecialCharKind.Bullet:
|
|
break;
|
|
case RtfVisualSpecialCharKind.EmDash:
|
|
break;
|
|
case RtfVisualSpecialCharKind.EmSpace:
|
|
break;
|
|
case RtfVisualSpecialCharKind.EnDash:
|
|
break;
|
|
case RtfVisualSpecialCharKind.EnSpace:
|
|
break;
|
|
case RtfVisualSpecialCharKind.LeftDoubleQuote:
|
|
break;
|
|
case RtfVisualSpecialCharKind.LeftSingleQuote:
|
|
break;
|
|
case RtfVisualSpecialCharKind.NonBreakingHyphen:
|
|
break;
|
|
case RtfVisualSpecialCharKind.NonBreakingSpace:
|
|
_MyParagraph.Add(new Chunk("\u00A0"));
|
|
break;
|
|
case RtfVisualSpecialCharKind.OptionalHyphen:
|
|
break;
|
|
case RtfVisualSpecialCharKind.ParagraphNumberBegin:
|
|
break;
|
|
case RtfVisualSpecialCharKind.ParagraphNumberEnd:
|
|
break;
|
|
case RtfVisualSpecialCharKind.QmSpace:
|
|
break;
|
|
case RtfVisualSpecialCharKind.RightDoubleQuote:
|
|
break;
|
|
case RtfVisualSpecialCharKind.RightSingleQuote:
|
|
break;
|
|
case RtfVisualSpecialCharKind.Tabulator:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
protected override void DoVisitText(IRtfVisualText visualText)
|
|
{
|
|
if (visualText.Format.IsHidden) return;
|
|
iTextSharp.text.Font font = Volian.Svg.Library.VolianPdf.GetFont(visualText.Format.Font.Name, visualText.Format.FontSize,
|
|
(visualText.Format.IsBold ? iTextSharp.text.Font.BOLD : 0) +
|
|
(visualText.Format.IsItalic ? iTextSharp.text.Font.ITALIC : 0));
|
|
font.Color = new iTextSharp.text.Color(PrintOverride.OverrideTextColor(visualText.Format.ForegroundColor.AsDrawingColor));
|
|
// The following line of code was added to allow for comparisons between the 16bit and 32bit pdf files. Without
|
|
// the size change, the overlays did not match up. It seems that the 16bit font size may be inaccurate
|
|
// and the 16bit conversion to be pdf may be off.
|
|
//if (font.Familyname.StartsWith("Arial") && font.Size == 11 && DoingComparison) font.Size = 11.15f;
|
|
|
|
Chunk chk = new Chunk(visualText.Text, font);
|
|
if(visualText.Format.BackgroundColor.AsDrawingColor.ToArgb() != System.Drawing.Color.White.ToArgb())
|
|
chk.SetBackground(new iTextSharp.text.Color(visualText.Format.BackgroundColor.AsDrawingColor));
|
|
if (visualText.Format.IsStrikeThrough)
|
|
chk.SetUnderline(font.Color, 0, 0.05F, 0, .3F, PdfContentByte.LINE_CAP_ROUND); // Relative Based upon font size
|
|
if (visualText.Format.IsUnderline)
|
|
if (visualText.Format.SuperScript < 0)
|
|
;// Don't Underline Subscripts
|
|
//if (PrintOverride.CompressSub)
|
|
// chk.SetUnderline(font.Color, 0, 0.0666F, 0, -.425F, PdfContentByte.LINE_CAP_ROUND); // Relative Based upon font size
|
|
//else
|
|
// chk.SetUnderline(font.Color, 0, 0.05F, 0, -.381F, PdfContentByte.LINE_CAP_ROUND); // Relative Based upon font size
|
|
else
|
|
chk.SetUnderline(font.Color, 0, 0.05F, 0, -.131F, PdfContentByte.LINE_CAP_ROUND); // Relative Based upon font size
|
|
if (visualText.Format.SuperScript > 0)
|
|
{
|
|
chk.SetTextRise(.25F * chk.Font.Size);
|
|
if (PrintOverride.CompressSuper) chk.Font.Size = 9;
|
|
}
|
|
else if (visualText.Format.SuperScript < 0)
|
|
{
|
|
chk.SetTextRise(-.25F * chk.Font.Size);
|
|
if (PrintOverride.CompressSub) chk.Font.Size = 9;
|
|
}
|
|
else
|
|
chk.SetTextRise(0);
|
|
switch (visualText.Format.Alignment)
|
|
{
|
|
case RtfTextAlignment.Center:
|
|
_MyParagraph.Alignment = Element.ALIGN_CENTER;
|
|
break;
|
|
case RtfTextAlignment.Justify:
|
|
_MyParagraph.Alignment = Element.ALIGN_JUSTIFIED;
|
|
break;
|
|
case RtfTextAlignment.Left:
|
|
_MyParagraph.Alignment = Element.ALIGN_LEFT;
|
|
break;
|
|
case RtfTextAlignment.Right:
|
|
_MyParagraph.Alignment = Element.ALIGN_RIGHT;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (_MyFont == null)
|
|
{
|
|
_MyFont = font;
|
|
_MyParagraph.Font = _MyFont;
|
|
}
|
|
_MyParagraph.Add(chk);
|
|
|
|
}
|
|
|
|
private string ShowSpecialCharacters(string p)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
foreach (char c in p)
|
|
{
|
|
int i = (int)c;
|
|
if (i < 20 || i > 127)
|
|
sb.Append(string.Format("<{0:x}>", i));
|
|
else
|
|
sb.Append(c);
|
|
}
|
|
return sb.ToString();
|
|
}// DoVisitText
|
|
|
|
|
|
// ----------------------------------------------------------------------
|
|
protected override void DoVisitImage(IRtfVisualImage visualImage)
|
|
{
|
|
_MyParagraph.Add(new Chunk("<Image>"));
|
|
//WriteStartElement("rtfVisualImage");
|
|
|
|
//WriteElementString("format", visualImage.Format.ToString());
|
|
//WriteElementString("width", visualImage.Width.ToString());
|
|
//WriteElementString("height", visualImage.Height.ToString());
|
|
//WriteElementString("desiredWidth", visualImage.DesiredWidth.ToString());
|
|
//WriteElementString("desiredHeight", visualImage.DesiredHeight.ToString());
|
|
//WriteElementString("scaleWidthPercent", visualImage.ScaleWidthPercent.ToString());
|
|
//WriteElementString("scaleHeightPercent", visualImage.ScaleHeightPercent.ToString());
|
|
//WriteElementString("alignment", visualImage.Alignment.ToString());
|
|
|
|
//WriteElementString("image", visualImage.ImageDataHex.ToString());
|
|
|
|
//WriteEndElement();
|
|
} // DoVisitImage
|
|
|
|
}
|
|
}
|