using System; using System.Drawing; using System.IO; using FastReport.Utils; using System.Windows.Forms; namespace FastReport.Export.Html { public partial class HTMLExport : ExportBase { private void HTMLFontStyle(FastString FFontDesc, Font font, float LineHeight) { FFontDesc.Append((((font.Style & FontStyle.Bold) > 0) ? "font-weight:bold;" : String.Empty) + (((font.Style & FontStyle.Italic) > 0) ? "font-style:italic;" : "font-style:normal;")); if ((font.Style & FontStyle.Underline) > 0 && (font.Style & FontStyle.Strikeout) > 0) FFontDesc.Append("text-decoration:underline|line-through;"); else if ((font.Style & FontStyle.Underline) > 0) FFontDesc.Append("text-decoration:underline;"); else if ((font.Style & FontStyle.Strikeout) > 0) FFontDesc.Append("text-decoration:line-through;"); FFontDesc.Append("font-family:").Append(font.Name).Append(";"); FFontDesc.Append("font-size:").Append(Px(font.Size * 96 / 72)); if (LineHeight > 0) FFontDesc.Append("line-height:").Append(Px(LineHeight)).Append(";"); } private void HTMLPadding(FastString PaddingDesc, Padding padding, float ParagraphOffset) { PaddingDesc.Append("text-indent:").Append(Px(ParagraphOffset)); PaddingDesc.Append("padding-left:").Append(Px(padding.Left)); PaddingDesc.Append("padding-right:").Append(Px(padding.Right)); PaddingDesc.Append("padding-top:").Append(Px(padding.Top)); PaddingDesc.Append("padding-bottom:").Append(Px(padding.Bottom)); } private string HTMLBorderStyle(BorderLine line) { switch (line.Style) { case LineStyle.Dash: case LineStyle.DashDot: case LineStyle.DashDotDot: return "dashed"; case LineStyle.Dot: return "dotted"; case LineStyle.Double: return "double"; default: return "solid"; } } private float HTMLBorderWidth(BorderLine line) { if (line.Style == LineStyle.Double) return (line.Width * 3 * Zoom); else return line.Width * Zoom; } private string HTMLBorderWidthPx(BorderLine line) { if (line.Style != LineStyle.Double && line.Width == 1 && Zoom == 1) return "1px;"; float width; if (line.Style == LineStyle.Double) width = line.Width * 3 * Zoom; else if (layers) width = line.Width * Zoom; else width = line.Width; return ExportUtils.FloatToString(width) + "px;"; } private void HTMLBorder(FastString BorderDesc, Border border) { if (!layers) BorderDesc.Append("border-collapse: separate;"); if (border.Lines > 0) { // bottom if ((border.Lines & BorderLines.Bottom) > 0) BorderDesc.Append("border-bottom-width:"). Append(HTMLBorderWidthPx(border.BottomLine)). Append("border-bottom-color:"). Append(ExportUtils.HTMLColor(border.BottomLine.Color)).Append(";border-bottom-style:"). Append(HTMLBorderStyle(border.BottomLine)).Append(";"); else BorderDesc.Append("border-bottom:none;"); // top if ((border.Lines & BorderLines.Top) > 0) BorderDesc.Append("border-top-width:"). Append(HTMLBorderWidthPx(border.TopLine)). Append("border-top-color:"). Append(ExportUtils.HTMLColor(border.TopLine.Color)).Append(";border-top-style:"). Append(HTMLBorderStyle(border.TopLine)).Append(";"); else BorderDesc.Append("border-top:none;"); // left if ((border.Lines & BorderLines.Left) > 0) BorderDesc.Append("border-left-width:"). Append(HTMLBorderWidthPx(border.LeftLine)). Append("border-left-color:"). Append(ExportUtils.HTMLColor(border.LeftLine.Color)).Append(";border-left-style:"). Append(HTMLBorderStyle(border.LeftLine)).Append(";"); else BorderDesc.Append("border-left:none;"); // right if ((border.Lines & BorderLines.Right) > 0) BorderDesc.Append("border-right-width:"). Append(HTMLBorderWidthPx(border.RightLine)). Append("border-right-color:"). Append(ExportUtils.HTMLColor(border.RightLine.Color)).Append(";border-right-style:"). Append(HTMLBorderStyle(border.RightLine)).Append(";"); else BorderDesc.Append("border-right:none;"); } else BorderDesc.Append("border:none;"); } private bool HTMLBorderWidthValues(ReportComponentBase obj, out float left, out float top, out float right, out float bottom) { Border border = obj.Border; left = 0; top = 0; right = 0; bottom = 0; if (border.Lines > 0) { if ((border.Lines & BorderLines.Left) > 0) left += HTMLBorderWidth(border.LeftLine); if ((border.Lines & BorderLines.Right) > 0) right += HTMLBorderWidth(border.RightLine); if ((border.Lines & BorderLines.Top) > 0) top += HTMLBorderWidth(border.TopLine); if ((border.Lines & BorderLines.Bottom) > 0) bottom += HTMLBorderWidth(border.BottomLine); return true; } return false; } private void HTMLAlign(FastString sb, HorzAlign horzAlign, VertAlign vertAlign, bool wordWrap) { sb.Append("text-align:"); if (horzAlign == HorzAlign.Left) sb.Append("Left"); else if (horzAlign == HorzAlign.Right) sb.Append("Right"); else if (horzAlign == HorzAlign.Center) sb.Append("Center"); else if (horzAlign == HorzAlign.Justify) sb.Append("Justify"); sb.Append(";vertical-align:"); if (vertAlign == VertAlign.Top) sb.Append("Top"); else if (vertAlign == VertAlign.Bottom) sb.Append("Bottom"); else if (vertAlign == VertAlign.Center) sb.Append("Middle"); if (wordWrap) sb.Append(";word-wrap:break-word"); sb.Append(";overflow:hidden;"); } private void HTMLRtl(FastString sb, bool rtl) { if (rtl) sb.Append("direction:rtl;"); } private string HTMLGetStylesHeader() { return ""); } } private string HTMLGetStyleHeader(long index, long subindex) { FastString header = new FastString(); return header.Append("."). Append(stylePrefix). Append("s"). Append(index.ToString()). Append((singlePage || layers) ? String.Empty : String.Concat("-", subindex.ToString())). Append(" { ").ToString(); } private void HTMLGetStyle(FastString style, Font Font, Color TextColor, Color FillColor, HorzAlign HAlign, VertAlign VAlign, Border Border, Padding Padding, bool RTL, bool wordWrap, float LineHeight, float ParagraphOffset) { HTMLFontStyle(style, Font, LineHeight); style.Append("color:").Append(ExportUtils.HTMLColor(TextColor)).Append(";"); style.Append("background-color:"); style.Append(FillColor.A == 0 ? "transparent" : ExportUtils.HTMLColor(FillColor)).Append(";"); HTMLAlign(style, HAlign, VAlign, wordWrap); HTMLBorder(style, Border); HTMLPadding(style, Padding, ParagraphOffset); HTMLRtl(style, RTL); style.AppendLine("}"); } private string HTMLGetStylesFooter() { return "-->"; } private string HTMLGetAncor(string ancorName) { FastString ancor = new FastString(); return ancor.Append("").ToString(); } private string HTMLGetImageTag(string file) { return "\"\"/"; } private string HTMLGetImage(int PageNumber, int CurrentPage, int ImageNumber, string hash, bool Base, System.Drawing.Image Metafile, MemoryStream PictureStream, bool isSvg) { if (pictures) { System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Bmp; if (imageFormat == ImageFormat.Png) format = System.Drawing.Imaging.ImageFormat.Png; else if (imageFormat == ImageFormat.Jpeg) format = System.Drawing.Imaging.ImageFormat.Jpeg; else if (imageFormat == ImageFormat.Gif) format = System.Drawing.Imaging.ImageFormat.Gif; string formatNm = isSvg ? "svg" : format.ToString().ToLower(); string embedImgType = isSvg ? "svg+xml" : format.ToString(); string embedPreffix = "data:image/" + embedImgType + ";base64,"; FastString ImageFileNameBuilder = new FastString(48); string ImageFileName; if (!saveStreams) ImageFileNameBuilder.Append(Path.GetFileName(targetFileName)).Append("."); ImageFileNameBuilder.Append(hash). Append(".").Append(formatNm); ImageFileName = ImageFileNameBuilder.ToString(); if (!webMode && !(preview || print)) { if (Base) { if (Metafile != null && !EmbedPictures) { if (saveStreams) { MemoryStream ImageFileStream = new MemoryStream(); Metafile.Save(ImageFileStream, format); GeneratedUpdate(targetPath + ImageFileName, ImageFileStream); } else { using (FileStream ImageFileStream = new FileStream(targetPath + ImageFileName, FileMode.Create)) Metafile.Save(ImageFileStream, format); } } else if (PictureStream != null && !EmbedPictures) { if (this.format == HTMLExportFormat.HTML) { string fileName = targetPath + ImageFileName; FileInfo info = new FileInfo(fileName); if (!(info.Exists && info.Length == PictureStream.Length)) { if (saveStreams) { GeneratedUpdate(targetPath + ImageFileName, PictureStream); } else { using (FileStream ImageFileStream = new FileStream(fileName, FileMode.Create)) PictureStream.WriteTo(ImageFileStream); } } } else { PicsArchiveItem item = new PicsArchiveItem(ImageFileName, PictureStream); bool founded = false; for (int i = 0; i < picsArchive.Count; i++) if (item.FileName == picsArchive[i].FileName) { founded = true; break; } if (!founded) picsArchive.Add(item); } } if (!saveStreams) GeneratedFiles.Add(targetPath + ImageFileName); } if (EmbedPictures && PictureStream != null) { return embedPreffix + GetBase64Image(PictureStream, hash); } else if (subFolder && singlePage && !navigator) return ExportUtils.HtmlURL(subFolderPath + ImageFileName); else return ExportUtils.HtmlURL(ImageFileName); } else { if (EmbedPictures) { return embedPreffix + GetBase64Image(PictureStream, hash); } else { if (print || preview) { printPageData.Pictures.Add(PictureStream); printPageData.Guids.Add(hash); } else if (Base) { pages[CurrentPage].Pictures.Add(PictureStream); pages[CurrentPage].Guids.Add(hash); } return webImagePrefix + "=" + hash + webImageSuffix; } } } else return String.Empty; } private string GetBase64Image(MemoryStream PictureStream, string hash) { string base64Image = String.Empty; if (!EmbeddedImages.TryGetValue(hash, out base64Image)) { base64Image = Convert.ToBase64String(PictureStream.ToArray()); EmbeddedImages.Add(hash, base64Image); } return base64Image; } } }