123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- 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 "<style type=\"text/css\"><!-- ";
- }
- private void PrintPageStyle(FastString sb)
- {
- if (singlePage && pageBreaks)
- {
- sb.AppendLine("<style type=\"text/css\" media=\"print\"><!--");
- sb.Append("div.").Append(pageStyleName)
- .Append(" { break-after: always; page-break-inside: avoid; ");
- if (d.page.Landscape && !NotRotateLandscapePage)
- {
- sb.Append("width:").Append(Px(maxHeight * Zoom).Replace(";", " !important;"))
- .Append("transform: rotate(90deg); -webkit-transform: rotate(90deg)");
- }
- sb.AppendLine("}")
- .AppendLine("--></style>");
- }
- }
- 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 "--></style>";
- }
- private string HTMLGetAncor(string ancorName)
- {
- FastString ancor = new FastString();
- return ancor.Append("<a name=\"PageN").Append(ancorName).Append("\" style=\"padding:0;margin:0;font-size:1px;\"></a>").ToString();
- }
- private string HTMLGetImageTag(string file)
- {
- return "<img src=\"" + file + "\" alt=\"\"/>";
- }
- 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;
- }
- }
- }
|