using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using FastReport.Utils;
namespace FastReport.Export.Html
{
public partial class HTMLExport : ExportBase
{
private int imagesCount;
private ExportMatrix matrix;
private void ExportPageStyles(FastString styles, ExportMatrix FMatrix, int PageNumber)
{
pageStyleName = "frpage" + currentPage;
PrintPageStyle(styles);
if (FMatrix.StylesCount - prevStyleListIndex > 0)
{
styles.AppendLine(HTMLGetStylesHeader());
for (int i = prevStyleListIndex; i < FMatrix.StylesCount; i++)
{
ExportIEMStyle EStyle = FMatrix.StyleById(i);
styles.Append(HTMLGetStyleHeader(i, PageNumber));
HTMLGetStyle(styles, EStyle.Font, EStyle.TextColor,
EStyle.FillColor, EStyle.HAlign, EStyle.VAlign, EStyle.Border,
EStyle.Padding, EStyle.RTL, EStyle.WordWrap, EStyle.LineHeight, EStyle.ParagraphOffset);
}
styles.AppendLine(HTMLGetStylesFooter());
}
}
private string HTMLSaveImage(ExportIEMObject obj, int PageNumber, int CurrentPage, int ImageNumber, bool isSvg)
{
if (pictures)
return HTMLGetImageTag(HTMLGetImage(PageNumber, CurrentPage, ImageNumber, obj.Hash, obj.Base, obj.Metafile, obj.PictureStream, isSvg));
else
return String.Empty;
}
private void SetUpMatrix(ExportMatrix FMatrix)
{
if (singlePage && prevStyleList != null)
FMatrix.Styles = prevStyleList;
if (wysiwyg)
FMatrix.Inaccuracy = 0.5f;
else
FMatrix.Inaccuracy = 10;
if (webMode)
{
singlePage = false;
navigator = false;
}
FMatrix.Watermarks = true;
FMatrix.HTMLMode = true;
FMatrix.FillAsBitmap = true;
FMatrix.Zoom = Zoom;
FMatrix.RotatedAsImage = true;
FMatrix.PlainRich = true;
FMatrix.CropAreaFill = false;
FMatrix.AreaFill = true;
FMatrix.Report = Report;
FMatrix.FramesOptimization = true;
FMatrix.ShowProgress = false;
FMatrix.FullTrust = false;
FMatrix.PrintOptimized = HighQualitySVG;
}
private void GetColumnSizes(FastString Page, ExportMatrix FMatrix)
{
Page.Append("
");
for (int x = 0; x < FMatrix.Width - 1; x++)
Page.Append(" | ");
if (FMatrix.Width < 2)
Page.Append(" | ");
Page.AppendLine("
");
}
private int GetTableHeader(FastString Page, ExportMatrix FMatrix, int PageNumber, int CurrentPage, int ImagesCount)
{
Page.Append(" 1 && pageBreaks)
Page.Append("\" class=\"page_break");
Page.AppendLine("\" >");
return ImagesCount;
}
private int GetTable(FastString Page, ExportMatrix FMatrix, int PageNumber, int CurrentPage, int ImagesCount)
{
string pgStyle;
if (singlePage)
pgStyle = String.Empty;
else
pgStyle = String.Concat("-", PageNumber.ToString());
for (int y = 0; y < FMatrix.Height - 1; y++)
{
int drow = (int)Math.Round((FMatrix.YPosById(y + 1) - FMatrix.YPosById(y)));
if (drow == 0)
drow = 1;
Page.Append("");
for (int x = 0; x < FMatrix.Width - 1; x++)
{
int i = FMatrix.Cell(x, y);
if (i != -1)
{
ExportIEMObject obj = FMatrix.ObjectById(i);
if (obj.Counter == 0)
{
int fx, fy, dx, dy;
FMatrix.ObjectPos(i, out fx, out fy, out dx, out dy);
obj.Counter = 1;
Page.Append(" 1 ? " colspan=\"" + dx.ToString() + "\"" : String.Empty)).
Append((dy > 1 ? " rowspan=\"" + dy.ToString() + "\"" : String.Empty)).
Append(" class=\"").Append(stylePrefix).Append("s").Append(obj.StyleIndex.ToString()).
Append(pgStyle).
Append("\"");
FastString style = new FastString(256);
if (obj.Text.Length == 0)
style.Append("font-size:1px;");
if (obj.PictureStream != null && obj.IsText)
style.Append("background-image: url(").
Append(HTMLGetImage(PageNumber, CurrentPage, ImagesCount++, obj.Hash, obj.Base, obj.Metafile, obj.PictureStream, false)).
Append(");");
if (style.Length > 0)
Page.Append(" style=\"").Append(style).Append("\"");
if (!obj.Style.WordWrap)
Page.Append(" nowrap ");
Page.Append(">");
// TEXT
if (!String.IsNullOrEmpty(obj.URL))
Page.Append("");
if (obj.IsText)
{
if (obj.Text.Length > 0)
{
switch (obj.TextRenderType)
{
case TextRenderType.HtmlParagraph:
Page.Append(GetHtmlParagraph(obj));
break;
default:
string text = obj.Text;
if (obj.Style.Font.FontFamily.Name == "Wingdings" || obj.Style.Font.FontFamily.Name == "Webdings")
{
text = WingdingsToUnicodeConverter.Convert(text);
}
Page.Append(ExportUtils.HtmlString(text, obj.TextRenderType, Px(Math.Round(obj.Style.Font.Size * 96 / 72))));
break;
}
}
else
Page.Append(NBSP);
}
else if (obj.TextRenderType == TextRenderType.HtmlTags)
{
Page.Append(obj.Text);
}
else
Page.Append(HTMLSaveImage(obj, PageNumber, CurrentPage, ImagesCount++, obj.IsSvg));
if (!String.IsNullOrEmpty(obj.URL))
Page.Append("");
Page.Append(" | ");
}
}
else
Page.Append("");
}
Page.AppendLine("
");
}
return ImagesCount;
}
private string GetHtmlParagraph(ExportIEMObject obj)
{
RectangleF textRect = new RectangleF(0, 0, obj.Width - obj.Style.Padding.Horizontal, obj.Height - obj.Style.Padding.Vertical);
Color color = Color.Black; if (obj.Style.TextFill is SolidFill) color = (obj.Style.TextFill as SolidFill).Color;
StringFormatFlags flags = 0;
float scale = 1;
StringAlignment align = StringAlignment.Near;
if (obj.Style.HAlign == HorzAlign.Center) align = StringAlignment.Center;
else if (obj.Style.HAlign == HorzAlign.Right) align = StringAlignment.Far;
StringAlignment lineAlign = StringAlignment.Near;
if (obj.Style.VAlign == VertAlign.Center) lineAlign = StringAlignment.Center;
else if (obj.Style.VAlign == VertAlign.Bottom) lineAlign = StringAlignment.Far;
if (obj.Style.RTL) flags |= StringFormatFlags.DirectionRightToLeft;
if (!obj.Style.WordWrap) flags |= StringFormatFlags.NoWrap;
flags |= StringFormatFlags.NoClip;
StringFormat format = Report.GraphicCache.GetStringFormat(align, lineAlign, StringTrimming.None, flags, obj.Style.FirstTabOffset * scale, obj.TabWidth * scale);
if (obj.TabPositions != null)
format = Report.GraphicCache.GetStringFormat(align, lineAlign, StringTrimming.None, flags, obj.Style.FirstTabOffset * scale, obj.TabPositions);
if (obj.ParagraphFormat == null) obj.ParagraphFormat = new ParagraphFormat();
using (HtmlTextRenderer renderer = new HtmlTextRenderer(obj.Text, Report.MeasureGraphics, obj.Style.Font.FontFamily, obj.Style.Font.Size * DrawUtils.ScreenDpiFX, obj.Style.Font.Style, color,
obj.Style.TextColor, textRect, obj.Style.Underlines,
format, obj.Style.HAlign, obj.Style.VAlign, obj.ParagraphFormat.MultipleScale(1), obj.Style.ForceJustify,
1, 1, obj.InlineImageCache == null ? new InlineImageCache() : obj.InlineImageCache, IsPrinting, obj.TabPositions != null))
{
return GetHtmlParagraph(renderer).ToString();
}
}
private void GetTableFooter(FastString Page)
{
Page.AppendLine("
");
}
private void ExportHTMLPageTabledBegin(HTMLData d)
{
imagesCount = 0;
matrix = new ExportMatrix();
SetUpMatrix(matrix);
matrix.AddPageBegin(d.page);
}
private void ExportBandTable(BandBase band)
{
matrix.AddBand(band, this);
}
private void ExportHTMLPageTabledEnd(HTMLData d)
{
matrix.AddPageEnd(d.page);
matrix.Prepare();
FastString Page = new FastString(4096);
ExportPageStyles(Page, matrix, d.ReportPage);
if (singlePage)
{
prevStyleListIndex = matrix.StylesCount;
prevStyleList = matrix.Styles;
}
ExportHTMLPageStart(Page, d.PageNumber, d.CurrentPage);
// Ancor
Page.Append(HTMLGetAncor(d.PageNumber.ToString()));
// Table header
imagesCount = GetTableHeader(Page, matrix, d.PageNumber, d.CurrentPage, imagesCount);
// Column sizes
GetColumnSizes(Page, matrix);
// Table
imagesCount = GetTable(Page, matrix, d.ReportPage /*d.PageNumber*/, d.CurrentPage, imagesCount);
// Table footer
GetTableFooter(Page);
ExportHTMLPageFinal(null, Page, d, matrix.MaxWidth, matrix.MaxHeight);
}
}
}