HTMLExport.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  1. using FastReport.Utils;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Globalization;
  6. using System.IO;
  7. using System.Text;
  8. namespace FastReport.Export.Html
  9. {
  10. /// <summary>
  11. /// Represents the HTML export filter.
  12. /// </summary>
  13. public partial class HTMLExport : ExportBase
  14. {
  15. /// <summary>
  16. /// Draw any custom controls
  17. /// </summary>
  18. public event EventHandler<CustomDrawEventArgs> CustomDraw;
  19. /// <summary>
  20. /// Draw any custom controls.
  21. /// </summary>
  22. /// <param name="e"></param>
  23. private void OnCustomDraw(CustomDrawEventArgs e)
  24. {
  25. if (CustomDraw != null)
  26. {
  27. CustomDraw(this, e);
  28. }
  29. }
  30. #region Private fields
  31. #if READONLY_STRUCTS
  32. private readonly struct HTMLData
  33. #else
  34. private struct HTMLData
  35. #endif
  36. {
  37. public readonly int ReportPage;
  38. public readonly int PageNumber;
  39. public readonly int CurrentPage;
  40. public readonly ReportPage page;
  41. public readonly Stream PagesStream;
  42. public HTMLData(int reportPage, int pageNumber, int currentPage, ReportPage page, Stream pagesStream)
  43. {
  44. ReportPage = reportPage;
  45. PageNumber = pageNumber;
  46. CurrentPage = currentPage;
  47. this.page = page;
  48. PagesStream = pagesStream;
  49. }
  50. }
  51. #if READONLY_STRUCTS
  52. private readonly struct PicsArchiveItem
  53. #else
  54. private struct PicsArchiveItem
  55. #endif
  56. {
  57. public readonly string FileName;
  58. public readonly MemoryStream Stream;
  59. public PicsArchiveItem(string fileName, MemoryStream stream)
  60. {
  61. FileName = fileName;
  62. Stream = stream;
  63. }
  64. }
  65. /// <summary>
  66. /// Types of html export
  67. /// </summary>
  68. public enum ExportType
  69. {
  70. /// <summary>
  71. /// Simple export
  72. /// </summary>
  73. Export,
  74. /// <summary>
  75. /// Web preview mode
  76. /// </summary>
  77. WebPreview,
  78. /// <summary>
  79. /// Web print mode
  80. /// </summary>
  81. WebPrint
  82. }
  83. private bool layers;
  84. private bool wysiwyg;
  85. private bool notRotateLandscapePage;
  86. private bool highQualitySVG;
  87. private readonly MyRes res;
  88. private readonly HtmlTemplates templates;
  89. private string targetPath;
  90. private string targetIndexPath;
  91. private string targetFileName;
  92. private string fileName;
  93. private string navFileName;
  94. //private string FOutlineFileName;
  95. private int pagesCount;
  96. private string documentTitle;
  97. private ImageFormat imageFormat;
  98. private bool subFolder;
  99. private bool navigator;
  100. private bool singlePage;
  101. private bool pictures;
  102. private bool embedPictures;
  103. private bool webMode;
  104. private List<HTMLPageData> pages;
  105. private HTMLPageData printPageData;
  106. private int count;
  107. private string webImagePrefix;
  108. private string webImageSuffix;
  109. private string stylePrefix;
  110. private string prevWatermarkName;
  111. private long prevWatermarkSize;
  112. private HtmlSizeUnits widthUnits;
  113. private HtmlSizeUnits heightUnits;
  114. private string singlePageFileName;
  115. private string subFolderPath;
  116. private HTMLExportFormat format;
  117. private MemoryStream mimeStream;
  118. private String boundary;
  119. private List<PicsArchiveItem> picsArchive;
  120. private List<ExportIEMStyle> prevStyleList;
  121. private int prevStyleListIndex;
  122. private bool pageBreaks;
  123. private bool print;
  124. private bool preview;
  125. private readonly List<string> cssStyles;
  126. private float hPos;
  127. private string pageStyleName;
  128. private bool saveStreams;
  129. private string onClickTemplate = String.Empty;
  130. private string reportID;
  131. private const string BODY_BEGIN = "</head>\r\n<body bgcolor=\"#FFFFFF\" text=\"#000000\">";
  132. private const string BODY_END = "</body>";
  133. private const string PRINT_JS = "<script language=\"javascript\" type=\"text/javascript\"> parent.focus(); parent.print(); window.addEventListener('afterprint', function(event) { window.close(); })</script>";
  134. private const string NBSP = "&nbsp;";
  135. private int currentPage = 0;
  136. private HTMLData d;
  137. private IGraphics htmlMeasureGraphics;
  138. private float maxWidth, maxHeight;
  139. private readonly FastString css = new FastString();
  140. private readonly FastString htmlPage = new FastString();
  141. private float leftMargin, topMargin;
  142. private bool enableMargins = false;
  143. private ExportType exportMode;
  144. private bool enableVectorObjects = true;
  145. /// <summary>
  146. /// hash:base64Image
  147. /// </summary>
  148. private Dictionary<string, string> embeddedImages;
  149. #endregion Private fields
  150. #region Public properties
  151. /// <summary>
  152. /// Gets or sets images, embedded in html (hash:base64Image)
  153. /// </summary>
  154. public Dictionary<string, string> EmbeddedImages
  155. {
  156. get { return embeddedImages; }
  157. set { embeddedImages = value; }
  158. }
  159. /// <summary>
  160. /// Sets a ID of report
  161. /// </summary>
  162. public string ReportID
  163. {
  164. get { return reportID; }
  165. set { reportID = value; }
  166. }
  167. /// <summary>
  168. /// Sets an onclick template
  169. /// </summary>
  170. public string OnClickTemplate
  171. {
  172. get { return onClickTemplate; }
  173. set { onClickTemplate = value; }
  174. }
  175. /// <summary>
  176. /// Enable or disable layers export mode
  177. /// </summary>
  178. public bool Layers
  179. {
  180. get { return layers; }
  181. set { layers = value; }
  182. }
  183. /// <summary>
  184. /// For internal use only.
  185. /// </summary>
  186. public string StylePrefix
  187. {
  188. get { return stylePrefix; }
  189. set { stylePrefix = value; }
  190. }
  191. /// <summary>
  192. /// For internal use only.
  193. /// </summary>
  194. public string WebImagePrefix
  195. {
  196. get { return webImagePrefix; }
  197. set { webImagePrefix = value; }
  198. }
  199. /// <summary>
  200. /// For internal use only.
  201. /// </summary>
  202. public string WebImageSuffix
  203. {
  204. get { return webImageSuffix; }
  205. set { webImageSuffix = value; }
  206. }
  207. /// <summary>
  208. /// For internal use only.
  209. /// </summary>
  210. public int Count
  211. {
  212. get { return count; }
  213. }
  214. /// <summary>
  215. /// For internal use only.
  216. /// </summary>
  217. public List<HTMLPageData> PreparedPages
  218. {
  219. get { return pages; }
  220. }
  221. /// <summary>
  222. /// Enable or disable showing of print dialog in browser when html document is opened
  223. /// </summary>
  224. public bool Print
  225. {
  226. get { return print; }
  227. set { print = value; }
  228. }
  229. /// <summary>
  230. /// Enable or disable a picture optimization.
  231. /// </summary>
  232. public bool HighQualitySVG
  233. {
  234. get { return highQualitySVG; }
  235. set { highQualitySVG = value; }
  236. }
  237. /// <summary>
  238. /// Enable or disable preview in Web settings
  239. /// </summary>
  240. public bool Preview
  241. {
  242. get { return preview; }
  243. set { preview = value; }
  244. }
  245. /// <summary>
  246. /// Enable or disable the breaks between pages in print preview when single page mode is enabled
  247. /// </summary>
  248. public bool PageBreaks
  249. {
  250. get { return pageBreaks; }
  251. set { pageBreaks = value; }
  252. }
  253. /// <summary>
  254. /// Specifies the output format
  255. /// </summary>
  256. public HTMLExportFormat Format
  257. {
  258. get { return format; }
  259. set { format = value; }
  260. }
  261. /// <summary>
  262. /// Specifies the width units in HTML export
  263. /// </summary>
  264. public HtmlSizeUnits WidthUnits
  265. {
  266. get { return widthUnits; }
  267. set { widthUnits = value; }
  268. }
  269. /// <summary>
  270. /// Specifies the height units in HTML export
  271. /// </summary>
  272. public HtmlSizeUnits HeightUnits
  273. {
  274. get { return heightUnits; }
  275. set { heightUnits = value; }
  276. }
  277. /// <summary>
  278. /// Enable or disable the pictures in HTML export
  279. /// </summary>
  280. public bool Pictures
  281. {
  282. get { return pictures; }
  283. set { pictures = value; }
  284. }
  285. /// <summary>
  286. /// Enable or disable embedding pictures in HTML export
  287. /// </summary>
  288. public bool EmbedPictures
  289. {
  290. get { return embedPictures; }
  291. set { embedPictures = value; }
  292. }
  293. /// <summary>
  294. /// Enable or disable the WEB mode in HTML export
  295. /// </summary>
  296. internal bool WebMode
  297. {
  298. get { return webMode; }
  299. set { webMode = value; }
  300. }
  301. /// <summary>
  302. /// Gets or sets html export mode
  303. /// </summary>
  304. public ExportType ExportMode
  305. {
  306. get { return exportMode; }
  307. set { exportMode = value; }
  308. }
  309. /// <summary>
  310. /// Enable or disable the single HTML page creation
  311. /// </summary>
  312. public bool SinglePage
  313. {
  314. get { return singlePage; }
  315. set { singlePage = value; }
  316. }
  317. /// <summary>
  318. /// Enable or disable the page navigator in html export
  319. /// </summary>
  320. public bool Navigator
  321. {
  322. get { return navigator; }
  323. set { navigator = value; }
  324. }
  325. /// <summary>
  326. /// Enable or disable the sub-folder for files of export
  327. /// </summary>
  328. public bool SubFolder
  329. {
  330. get { return subFolder; }
  331. set { subFolder = value; }
  332. }
  333. /// <summary>
  334. /// Gets or sets the WYSIWYG quality of export
  335. /// </summary>
  336. public bool Wysiwyg
  337. {
  338. get { return wysiwyg; }
  339. set { wysiwyg = value; }
  340. }
  341. /// <summary>
  342. /// Gets or sets the image format.
  343. /// </summary>
  344. public ImageFormat ImageFormat
  345. {
  346. get { return imageFormat; }
  347. set { imageFormat = value; }
  348. }
  349. /// <summary>
  350. /// Gets print page data
  351. /// </summary>
  352. public HTMLPageData PrintPageData
  353. {
  354. get { return printPageData; }
  355. }
  356. /// <summary>
  357. /// Enable or disable saving streams in GeneratedStreams collection.
  358. /// </summary>
  359. public bool SaveStreams
  360. {
  361. get { return saveStreams; }
  362. set { saveStreams = value; }
  363. }
  364. /// <summary>
  365. /// Enable or disable margins for pages. Works only for Layers-mode.
  366. /// </summary>
  367. public bool EnableMargins
  368. {
  369. get { return enableMargins; }
  370. set { enableMargins = value; }
  371. }
  372. /// <summary>
  373. /// Enable or disable export of vector objects such as Barcodes in SVG format.
  374. /// </summary>
  375. public bool EnableVectorObjects
  376. {
  377. get { return enableVectorObjects; }
  378. set { enableVectorObjects = value; }
  379. }
  380. /// <summary>
  381. /// Not rotate landscape page when print.
  382. /// </summary>
  383. public bool NotRotateLandscapePage
  384. {
  385. get { return notRotateLandscapePage; }
  386. set { notRotateLandscapePage = value; }
  387. }
  388. #endregion Public properties
  389. #region Private methods
  390. private void GeneratedUpdate(string filename, Stream stream)
  391. {
  392. int i = GeneratedFiles.IndexOf(filename);
  393. if (i == -1)
  394. {
  395. GeneratedFiles.Add(filename);
  396. GeneratedStreams.Add(stream);
  397. }
  398. else
  399. {
  400. GeneratedStreams[i] = stream;
  401. }
  402. }
  403. private void ExportHTMLPageStart(FastString Page, int PageNumber, int CurrentPage)
  404. {
  405. if (webMode)
  406. {
  407. if (!layers)
  408. {
  409. pages[CurrentPage].CSSText = Page.ToString();
  410. Page.Clear();
  411. }
  412. pages[CurrentPage].PageNumber = PageNumber;
  413. }
  414. if (!webMode && !singlePage)
  415. {
  416. Page.AppendLine(BODY_BEGIN);
  417. }
  418. }
  419. private void ExportHTMLPageFinal(FastString CSS, FastString Page, HTMLData d, float MaxWidth, float MaxHeight)
  420. {
  421. if (!webMode)
  422. {
  423. if (!singlePage)
  424. Page.AppendLine(BODY_END);
  425. if (d.PagesStream == null)
  426. {
  427. string pageFileName = targetIndexPath + targetFileName + d.PageNumber.ToString() + ".html";
  428. if (saveStreams)
  429. {
  430. string fileName = singlePage ? singlePageFileName : pageFileName;
  431. int i = GeneratedFiles.IndexOf(fileName);
  432. Stream outStream = (i == -1) ? new MemoryStream() : GeneratedStreams[i];
  433. DoPage(outStream, documentTitle, CSS, Page);
  434. GeneratedUpdate(fileName, outStream);
  435. }
  436. else
  437. {
  438. GeneratedFiles.Add(pageFileName);
  439. using (FileStream outStream = new FileStream(pageFileName, FileMode.Create))
  440. {
  441. DoPage(outStream, documentTitle, CSS, Page);
  442. }
  443. }
  444. }
  445. else
  446. {
  447. DoPage(d.PagesStream, documentTitle, CSS, Page);
  448. }
  449. }
  450. else
  451. {
  452. ExportHTMLPageFinalWeb(CSS, Page, d, MaxWidth, MaxHeight);
  453. }
  454. }
  455. private void ExportHTMLPageFinalWeb(FastString CSS, FastString Page, HTMLData d, float MaxWidth, float MaxHeight)
  456. {
  457. CalcPageSize(pages[d.CurrentPage], MaxWidth, MaxHeight);
  458. if (Page != null)
  459. {
  460. pages[d.CurrentPage].PageText = Page.ToString();
  461. Page.Clear();
  462. }
  463. if (CSS != null)
  464. {
  465. pages[d.CurrentPage].CSSText = CSS.ToString();
  466. CSS.Clear();
  467. }
  468. pages[d.CurrentPage].PageEvent.Set();
  469. }
  470. private void CalcPageSize(HTMLPageData page, float MaxWidth, float MaxHeight)
  471. {
  472. if (!layers)
  473. {
  474. page.Width = MaxWidth / Zoom;
  475. page.Height = MaxHeight / Zoom;
  476. }
  477. else
  478. {
  479. page.Width = MaxWidth;
  480. page.Height = MaxHeight;
  481. }
  482. }
  483. private void DoPage(Stream stream, string documentTitle, FastString CSS, FastString Page)
  484. {
  485. if (!singlePage)
  486. ExportUtils.Write(stream, String.Format(templates.PageTemplateTitle, documentTitle));
  487. if (CSS != null)
  488. {
  489. ExportUtils.Write(stream, CSS.ToString());
  490. CSS.Clear();
  491. }
  492. if (Page != null)
  493. {
  494. ExportUtils.Write(stream, Page.ToString());
  495. Page.Clear();
  496. }
  497. if (!singlePage)
  498. ExportUtils.Write(stream, templates.PageTemplateFooter);
  499. }
  500. private void ExportHTMLOutline(Stream OutStream)
  501. {
  502. if (!webMode)
  503. {
  504. // under construction
  505. }
  506. else
  507. {
  508. // under construction
  509. }
  510. }
  511. private void DoPageStart(Stream stream, string documentTitle, bool print)
  512. {
  513. ExportUtils.Write(stream, String.Format(templates.PageTemplateTitle, documentTitle));
  514. if (print)
  515. ExportUtils.WriteLn(stream, PRINT_JS);
  516. ExportUtils.WriteLn(stream, BODY_BEGIN);
  517. }
  518. private void DoPageEnd(Stream stream)
  519. {
  520. ExportUtils.WriteLn(stream, BODY_END);
  521. ExportUtils.Write(stream, templates.PageTemplateFooter);
  522. }
  523. private void ExportHTMLIndex(Stream stream)
  524. {
  525. ExportUtils.Write(stream, String.Format(templates.IndexTemplate,
  526. documentTitle, ExportUtils.HtmlURL(navFileName),
  527. ExportUtils.HtmlURL(targetFileName +
  528. (singlePage ? ".main" : "1") + ".html")));
  529. }
  530. private void ExportHTMLNavigator(Stream stream)
  531. {
  532. string prefix = ExportUtils.HtmlURL(fileName);
  533. // {0} - pages count {1} - name of report {2} multipage document {3} prefix of pages
  534. // {4} first caption {5} previous caption {6} next caption {7} last caption
  535. // {8} total caption
  536. ExportUtils.Write(stream, String.Format(templates.NavigatorTemplate,
  537. pagesCount.ToString(),
  538. documentTitle, (singlePage ? "0" : "1"),
  539. prefix, res.Get("First"), res.Get("Prev"),
  540. res.Get("Next"), res.Get("Last"), res.Get("Total")));
  541. }
  542. private void Init()
  543. {
  544. htmlMeasureGraphics = Report.MeasureGraphics;
  545. cssStyles.Clear();
  546. hPos = 0;
  547. count = Report.PreparedPages.Count;
  548. pagesCount = 0;
  549. prevWatermarkName = String.Empty;
  550. prevWatermarkSize = 0;
  551. prevStyleList = null;
  552. prevStyleListIndex = 0;
  553. picsArchive = new List<PicsArchiveItem>();
  554. GeneratedStreams = new List<Stream>();
  555. }
  556. private void StartMHT()
  557. {
  558. subFolder = false;
  559. singlePage = true;
  560. navigator = false;
  561. mimeStream = new MemoryStream();
  562. boundary = ExportUtils.GetID();
  563. }
  564. private void StartWeb()
  565. {
  566. pages.Clear();
  567. for (int i = 0; i < count; i++)
  568. pages.Add(new HTMLPageData());
  569. }
  570. private void StartSaveStreams()
  571. {
  572. if (singlePage)
  573. GeneratedUpdate("index.html", null);
  574. subFolder = false;
  575. navigator = false;
  576. }
  577. private void FinishMHT()
  578. {
  579. DoPageEnd(mimeStream);
  580. WriteMHTHeader(Stream, FileName);
  581. WriteMimePart(mimeStream, "text/html", "utf-8", "index.html");
  582. for (int i = 0; i < picsArchive.Count; i++)
  583. {
  584. string imagename = picsArchive[i].FileName;
  585. WriteMimePart(picsArchive[i].Stream, "image/" + imagename.Substring(imagename.LastIndexOf('.') + 1), "utf-8", imagename);
  586. }
  587. string last = "--" + boundary + "--";
  588. Stream.Write(Encoding.ASCII.GetBytes(last), 0, last.Length);
  589. }
  590. private void FinishSaveStreams()
  591. {
  592. // do append in memory stream
  593. int fileIndex = GeneratedFiles.IndexOf(singlePageFileName);
  594. ExportHTMLIndex(GeneratedStreams[fileIndex]);
  595. MemoryStream outStream = new MemoryStream();
  596. ExportHTMLNavigator(outStream);
  597. GeneratedUpdate(targetIndexPath + navFileName, outStream);
  598. }
  599. #endregion Private methods
  600. #region Protected methods
  601. /// <inheritdoc/>
  602. protected override string GetFileFilter()
  603. {
  604. if (Format == HTMLExportFormat.HTML)
  605. return new MyRes("FileFilters").Get("HtmlFile");
  606. else
  607. return new MyRes("FileFilters").Get("MhtFile");
  608. }
  609. /// <inheritdoc/>
  610. protected override void Start()
  611. {
  612. base.Start();
  613. Init();
  614. if (saveStreams)
  615. {
  616. StartSaveStreams();
  617. }
  618. if (!webMode)
  619. {
  620. if (format == HTMLExportFormat.MessageHTML)
  621. {
  622. StartMHT();
  623. }
  624. if (FileName == "" && Stream != null)
  625. {
  626. targetFileName = "html";
  627. singlePage = true;
  628. subFolder = false;
  629. navigator = false;
  630. if (ExportMode == ExportType.WebPrint)
  631. {
  632. NotRotateLandscapePage = true;
  633. for (int i = 0; i < Report.PreparedPages.Count; i++)
  634. {
  635. if (!Report.PreparedPages.GetPage(i).Landscape)
  636. {
  637. NotRotateLandscapePage = false;
  638. break;
  639. }
  640. }
  641. }
  642. if (format == HTMLExportFormat.HTML && !embedPictures)
  643. pictures = false;
  644. }
  645. else
  646. {
  647. targetFileName = Path.GetFileNameWithoutExtension(FileName);
  648. fileName = targetFileName;
  649. targetIndexPath = !String.IsNullOrEmpty(FileName) ? Path.GetDirectoryName(FileName) : FileName;
  650. }
  651. if (!String.IsNullOrEmpty(targetIndexPath))
  652. targetIndexPath += Path.DirectorySeparatorChar;
  653. if (preview)
  654. {
  655. pictures = true;
  656. printPageData = new HTMLPageData();
  657. }
  658. else if (subFolder)
  659. {
  660. subFolderPath = targetFileName + ".files" + Path.DirectorySeparatorChar;
  661. targetPath = targetIndexPath + subFolderPath;
  662. targetFileName = subFolderPath + targetFileName;
  663. if (!Directory.Exists(targetPath))
  664. Directory.CreateDirectory(targetPath);
  665. }
  666. else
  667. targetPath = targetIndexPath;
  668. navFileName = targetFileName + ".nav.html";
  669. //FOutlineFileName = FTargetFileName + ".outline.html";
  670. documentTitle = (!String.IsNullOrEmpty(Report.ReportInfo.Name) ?
  671. Report.ReportInfo.Name : Path.GetFileNameWithoutExtension(FileName));
  672. if (singlePage)
  673. {
  674. if (navigator)
  675. {
  676. singlePageFileName = targetIndexPath + targetFileName + ".main.html";
  677. if (saveStreams)
  678. {
  679. MemoryStream pageStream = new MemoryStream();
  680. DoPageStart(pageStream, documentTitle, print);
  681. GeneratedUpdate(singlePageFileName, pageStream);
  682. }
  683. else
  684. {
  685. using (Stream pageStream = new FileStream(singlePageFileName,
  686. FileMode.Create))
  687. {
  688. DoPageStart(pageStream, documentTitle, print);
  689. }
  690. }
  691. }
  692. else
  693. {
  694. singlePageFileName = String.IsNullOrEmpty(FileName) ? "index.html" : FileName;
  695. if (saveStreams)
  696. {
  697. GeneratedUpdate(singlePageFileName, new MemoryStream());
  698. }
  699. DoPageStart((format == HTMLExportFormat.HTML) ? Stream : mimeStream, documentTitle, print);
  700. }
  701. }
  702. }
  703. else
  704. {
  705. StartWeb();
  706. }
  707. }
  708. /// <inheritdoc/>
  709. protected override void ExportPageBegin(ReportPage page)
  710. {
  711. if (ExportMode == ExportType.Export)
  712. base.ExportPageBegin(page);
  713. pagesCount++;
  714. if (!WebMode)
  715. {
  716. if (singlePage)
  717. {
  718. Stream stream;
  719. if (navigator)
  720. {
  721. if (saveStreams)
  722. stream = new MemoryStream();
  723. else
  724. stream = new FileStream(singlePageFileName, FileMode.Append);
  725. d = new HTMLData(pagesCount, pagesCount, 0, page, stream);
  726. ExportHTMLPageBegin(d);
  727. }
  728. else
  729. {
  730. if (format == HTMLExportFormat.HTML)
  731. stream = Stream;
  732. else
  733. stream = mimeStream;
  734. d = new HTMLData(pagesCount, pagesCount, 0, page, stream);
  735. ExportHTMLPageBegin(d);
  736. }
  737. }
  738. else
  739. ProcessPageBegin(pagesCount - 1, pagesCount, page);
  740. }
  741. else
  742. // Web
  743. ProcessPageBegin(pagesCount - 1, pagesCount, page);
  744. }
  745. /// <inheritdoc/>
  746. protected override void ExportPageEnd(ReportPage page)
  747. {
  748. if (!WebMode)
  749. {
  750. if (singlePage)
  751. {
  752. if (navigator)
  753. {
  754. if (saveStreams)
  755. {
  756. ExportHTMLPageEnd(d);
  757. GeneratedUpdate(singlePageFileName, d.PagesStream);
  758. }
  759. else
  760. {
  761. ExportHTMLPageEnd(d);
  762. d.PagesStream.Close();
  763. d.PagesStream.Dispose();
  764. }
  765. }
  766. else
  767. {
  768. ExportHTMLPageEnd(d);
  769. }
  770. }
  771. else
  772. ProcessPageEnd(pagesCount - 1, pagesCount);
  773. }
  774. else
  775. // Web
  776. ProcessPageEnd(pagesCount - 1, pagesCount);
  777. }
  778. /// <summary>
  779. /// Process Page with number p and real page ReportPage
  780. /// </summary>
  781. /// <param name="p"></param>
  782. /// <param name="ReportPage"></param>
  783. /// <param name="page"></param>
  784. public void ProcessPageBegin(int p, int ReportPage, ReportPage page)
  785. {
  786. d = new HTMLData(ReportPage, pagesCount, p, page, null);
  787. ExportHTMLPageBegin(d);
  788. }
  789. /// <summary>
  790. /// Process Page with number p and real page ReportPage
  791. /// </summary>
  792. /// <param name="p"></param>
  793. /// <param name="ReportPage"></param>
  794. public void ProcessPageEnd(int p, int ReportPage)
  795. {
  796. ExportHTMLPageEnd(d);
  797. }
  798. /// <inheritdoc/>
  799. protected override void Finish()
  800. {
  801. if (!webMode)
  802. {
  803. if (navigator)
  804. {
  805. if (saveStreams)
  806. {
  807. FinishSaveStreams();
  808. }
  809. else
  810. {
  811. if (singlePage)
  812. {
  813. //if (saveStreams) // Commented because saveStreams is always false!!
  814. //{
  815. // int fileIndex = GeneratedFiles.IndexOf(singlePageFileName);
  816. // DoPageEnd(generatedStreams[fileIndex]);
  817. //}
  818. //else
  819. //{
  820. using (Stream pageStream = new FileStream(singlePageFileName, FileMode.Append))
  821. {
  822. DoPageEnd(pageStream);
  823. }
  824. //} // Commented because saveStreams is always false!!
  825. }
  826. ExportHTMLIndex(Stream);
  827. GeneratedFiles.Add(targetIndexPath + navFileName);
  828. using (FileStream outStream = new FileStream(targetIndexPath + navFileName, FileMode.Create))
  829. {
  830. ExportHTMLNavigator(outStream);
  831. }
  832. //GeneratedFiles.Add(FTargetIndexPath + FOutlineFileName);
  833. //using (FileStream OutStream = new FileStream(FTargetIndexPath + FOutlineFileName, FileMode.Create))
  834. // ExportHTMLOutline(OutStream);
  835. }
  836. }
  837. else if (format == HTMLExportFormat.MessageHTML)
  838. {
  839. FinishMHT();
  840. }
  841. else
  842. {
  843. if (saveStreams)
  844. {
  845. if (!String.IsNullOrEmpty(singlePageFileName))
  846. {
  847. int fileIndex = GeneratedFiles.IndexOf(singlePageFileName);
  848. DoPageEnd(GeneratedStreams[fileIndex]);
  849. }
  850. }
  851. else
  852. {
  853. if (!singlePage)
  854. {
  855. DoPageStart(Stream, documentTitle, false);
  856. int pageCounter = 0;
  857. foreach (string genFile in GeneratedFiles)
  858. {
  859. string ext = Path.GetExtension(genFile);
  860. if (ext == ".html" && genFile != FileName)
  861. {
  862. string file = Path.GetFileName(genFile);
  863. if (subFolder)
  864. file = Path.Combine(subFolderPath, file);
  865. ExportUtils.WriteLn(Stream, String.Format("<a href=\"{0}\">Page {1}</a><br />", file, ++pageCounter));
  866. }
  867. }
  868. }
  869. DoPageEnd(Stream);
  870. }
  871. }
  872. }
  873. }
  874. #endregion Protected methods
  875. /// <inheritdoc/>
  876. public override void Serialize(FRWriter writer)
  877. {
  878. base.Serialize(writer);
  879. writer.WriteBool("Layers", Layers);
  880. writer.WriteBool("Wysiwyg", Wysiwyg);
  881. writer.WriteBool("Pictures", Pictures);
  882. writer.WriteBool("EmbedPictures", EmbedPictures);
  883. writer.WriteBool("SubFolder", SubFolder);
  884. writer.WriteBool("Navigator", Navigator);
  885. writer.WriteBool("SinglePage", SinglePage);
  886. writer.WriteBool("NotRotateLandscapePage", NotRotateLandscapePage);
  887. writer.WriteBool("HighQualitySVG", HighQualitySVG);
  888. }
  889. /// <summary>
  890. /// For internal use only.
  891. /// </summary>
  892. public void Init_WebMode()
  893. {
  894. subFolder = false;
  895. navigator = false;
  896. ShowProgress = false;
  897. pages = new List<HTMLPageData>();
  898. webMode = true;
  899. OpenAfterExport = false;
  900. }
  901. internal void Finish_WebMode()
  902. {
  903. pages.Clear();
  904. }
  905. /// <summary>
  906. /// Initializes a new instance of the <see cref="HTMLExport"/> class.
  907. /// </summary>
  908. public HTMLExport()
  909. {
  910. Zoom = 1.0f;
  911. HasMultipleFiles = true;
  912. layers = true;
  913. wysiwyg = true;
  914. pictures = true;
  915. webMode = false;
  916. subFolder = true;
  917. navigator = true;
  918. singlePage = false;
  919. widthUnits = HtmlSizeUnits.Pixel;
  920. heightUnits = HtmlSizeUnits.Pixel;
  921. imageFormat = ImageFormat.Png;
  922. templates = new HtmlTemplates();
  923. format = HTMLExportFormat.HTML;
  924. prevStyleList = null;
  925. prevStyleListIndex = 0;
  926. pageBreaks = true;
  927. print = false;
  928. preview = false;
  929. saveStreams = false;
  930. cssStyles = new List<string>();
  931. exportMode = ExportType.Export;
  932. res = new MyRes("Export,Html");
  933. embeddedImages = new Dictionary<string, string>();
  934. notRotateLandscapePage = false;
  935. highQualitySVG = false;
  936. }
  937. /// <summary>
  938. /// Initializes a new instance of the <see cref="HTMLExport"/> class for WebPreview mode.
  939. /// </summary>
  940. public HTMLExport(bool webPreview) : this()
  941. {
  942. this.webPreview = webPreview;
  943. if (webPreview)
  944. exportMode = ExportType.WebPreview;
  945. }
  946. }
  947. /// <summary>
  948. /// Event arguments for custom drawing of report objects.
  949. /// </summary>
  950. public class CustomDrawEventArgs : EventArgs
  951. {
  952. /// <summary>
  953. /// Report object
  954. /// </summary>
  955. public Report report;
  956. /// <summary>
  957. /// ReportObject.
  958. /// </summary>
  959. public ReportComponentBase reportObject;
  960. /// <summary>
  961. /// Resulting successful drawing flag.
  962. /// </summary>
  963. public bool done = false;
  964. /// <summary>
  965. /// Resulting HTML string.
  966. /// </summary>
  967. public string html;
  968. /// <summary>
  969. /// Resulting CSS string.
  970. /// </summary>
  971. public string css;
  972. /// <summary>
  973. /// Layers mode when true or Table mode when false.
  974. /// </summary>
  975. public bool layers;
  976. /// <summary>
  977. /// Zoom value for scale position and sizes.
  978. /// </summary>
  979. public float zoom;
  980. /// <summary>
  981. /// Left position.
  982. /// </summary>
  983. public float left;
  984. /// <summary>
  985. /// Top position.
  986. /// </summary>
  987. public float top;
  988. /// <summary>
  989. /// Width of object.
  990. /// </summary>
  991. public float width;
  992. /// <summary>
  993. /// Height of object.
  994. /// </summary>
  995. public float height;
  996. }
  997. }