XPSExport.cs 101 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164
  1. using FastReport.Table;
  2. using FastReport.Utils;
  3. using System;
  4. using System.Collections;
  5. using System.Drawing;
  6. using System.Globalization;
  7. using System.IO;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. namespace FastReport.Export.OoXML
  11. {
  12. /// <summary>
  13. /// Picture container
  14. /// </summary>
  15. internal class XPS_Picture : OoXMLBase
  16. {
  17. #region "Class overrides"
  18. public override string RelationType { get { return "http://schemas.microsoft.com/xps/2005/06/required-resource"; } }
  19. public override string ContentType { get { return null; } } //"application/vnd.openxmlformats-officedocument.presentationml.slide+xml"; } }
  20. public override string FileName { get { return imageFileName; } }
  21. #endregion
  22. #region "Private fields"
  23. private ReportComponentBase picture;
  24. private string imageFileName;
  25. // private XPSExport FExport;
  26. #endregion
  27. internal string SaveImage(XPSExport export, ReportComponentBase obj, bool ClearBackground)
  28. {
  29. export.picturesCount++;
  30. imageFileName = "/Resources/" + obj.Name + "." + export.picturesCount + ".png";
  31. using (System.Drawing.Image image = new System.Drawing.Bitmap((int)Math.Round(obj.Width), (int)Math.Round(obj.Height)))
  32. {
  33. using (Graphics g = Graphics.FromImage(image))
  34. using (GraphicCache cache = new GraphicCache())
  35. {
  36. g.TranslateTransform(-obj.AbsLeft, -obj.AbsTop);
  37. if (ClearBackground)
  38. {
  39. g.Clear(Color.Transparent);
  40. }
  41. obj.Draw(new FRPaintEventArgs(g, 1, 1, cache));
  42. MemoryStream ms = new MemoryStream();
  43. (image as Bitmap).SetResolution(96, 96);
  44. image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
  45. ms.Position = 0;
  46. export.Zip.AddStream(ExportUtils.TruncLeadSlash(imageFileName), ms);
  47. }
  48. }
  49. return imageFileName;
  50. }
  51. public XPS_Picture(ReportComponentBase obj)
  52. {
  53. picture = obj;
  54. }
  55. }
  56. /// <summary>
  57. /// List of all document fonts
  58. /// </summary>
  59. internal class XPS_FontList : IDisposable
  60. {
  61. private Hashtable fonthash;
  62. internal XPS_Font AddFont(XPSExport export, Font f, out bool FirstOccurrence)
  63. {
  64. int HashCode;
  65. XPS_Font font;
  66. FontStyle style = f.Style & (FontStyle.Bold | FontStyle.Italic);
  67. HashCode = f.Name.GetHashCode() + style.GetHashCode();
  68. if (fonthash.ContainsKey(HashCode) == false)
  69. {
  70. font = new XPS_Font(f);
  71. fonthash.Add(HashCode, font);
  72. FirstOccurrence = true;
  73. }
  74. else
  75. {
  76. font = fonthash[HashCode] as XPS_Font;
  77. font.SourceFont = f;
  78. FirstOccurrence = false;
  79. }
  80. return font;
  81. }
  82. internal XPS_FontList()
  83. {
  84. fonthash = new Hashtable();
  85. }
  86. internal void Export(XPSExport export)
  87. {
  88. foreach (XPS_Font font in fonthash.Values)
  89. {
  90. font.ExportFont(export);
  91. }
  92. }
  93. public void Dispose()
  94. {
  95. foreach (XPS_Font font in fonthash.Values)
  96. font.Dispose();
  97. }
  98. }
  99. /// <summary>
  100. /// Single page export
  101. /// </summary>
  102. internal class XPS_PageContent : OoXMLBase
  103. {
  104. const float FontMultiplier = 1.32805F;
  105. const float MetrixMultiplier = 3.776F;
  106. #region "Class overrides"
  107. public override string RelationType { get { return null; } } // "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"; } }
  108. public override string ContentType { get { return null; } } //"application/vnd.openxmlformats-officedocument.presentationml.slide+xml"; } }
  109. public override string FileName { get { return "/Documents/1/Pages/" + pageNumber + ".fpage"; } }
  110. #endregion
  111. NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat;
  112. #region Private fields
  113. int pageNumber;
  114. int relationCount;
  115. XPSExport export;
  116. private float marginLeft;
  117. private float marginTop;
  118. #endregion
  119. #region Helpers
  120. private string GetAlphaColor(Color color)
  121. {
  122. return Quoted("#" + color.A.ToString("x2") + color.R.ToString("x2") + color.G.ToString("x2") + color.B.ToString("x2"));
  123. }
  124. private string GetColor(Color color)
  125. {
  126. return Quoted("#" + color.R.ToString("x2") + color.G.ToString("x2") + color.B.ToString("x2"));
  127. }
  128. private string TranslateText(string text)
  129. {
  130. StringBuilder TextStrings = new StringBuilder();
  131. int start_idx = 0;
  132. while (true)
  133. {
  134. int idx = text.IndexOfAny("&<>\"".ToCharArray(), start_idx);
  135. if (idx != -1)
  136. {
  137. TextStrings.Append(text.Substring(start_idx, idx - start_idx));
  138. switch (text[idx])
  139. {
  140. case '&': TextStrings.Append("&amp;"); break;
  141. case '<': TextStrings.Append("&lt;"); break;
  142. case '>': TextStrings.Append("&gt;"); break;
  143. case '"': TextStrings.Append("&quot;"); break;
  144. }
  145. start_idx = ++idx;
  146. continue;
  147. }
  148. TextStrings.Append(text.Substring(start_idx));
  149. break;
  150. }
  151. return TextStrings.ToString();
  152. }
  153. private bool CheckGlyph(string text, XPS_Font font)
  154. {
  155. bool empty = true;
  156. foreach (char ch in text)
  157. {
  158. if (empty && !Char.IsWhiteSpace(ch)) empty = false;
  159. }
  160. return empty;
  161. }
  162. private void Add_Glyphs(
  163. Stream Out,
  164. TextObject obj,
  165. XPS_Font fnt,
  166. Color color,
  167. float left, float top, float width, string text)
  168. {
  169. string render_transform = "";
  170. string font_indexes = "";
  171. string unicode_string = "";
  172. string bidi_level = "";
  173. if (!CheckGlyph(text, fnt))
  174. {
  175. if (obj.RightToLeft)
  176. {
  177. ;
  178. }
  179. string remaped_text = fnt.AddString(text, obj.RightToLeft);
  180. if (obj.Angle != 0 || obj.FontWidthRatio != 1)
  181. {
  182. float fix_angle = (float)(obj.Angle * Math.PI / 180);
  183. float c = (float)Math.Round(Math.Cos(fix_angle), 5);
  184. float s = (float)Math.Round(Math.Sin(fix_angle), 5);
  185. float x = 0;
  186. float y = 0;
  187. if (obj.FontWidthRatio == 1)
  188. {
  189. // Fix padding
  190. x = obj.AbsLeft + marginLeft + obj.Width / 2;
  191. y = obj.AbsTop + marginTop + obj.Height / 2;
  192. }
  193. render_transform = "RenderTransform=" + Quoted(
  194. (c * obj.FontWidthRatio).ToString(nfi) + "," + s.ToString(nfi) + "," +
  195. (-s).ToString(nfi) + "," + c.ToString(nfi) + "," +
  196. x.ToString(nfi) + "," + y.ToString(nfi));
  197. }
  198. font_indexes = fnt.GetXpsIndexes(remaped_text);
  199. //if (obj.RightToLeft == true)
  200. //{
  201. // bidi_level = "BidiLevel=" + Quoted(1) + " ";
  202. //}
  203. if (this.export.humanReadable)
  204. {
  205. unicode_string = " UnicodeString=" + Quoted(TranslateText(text));
  206. }
  207. if (obj.TextFill is SolidFill)
  208. {
  209. ExportUtils.WriteLn(Out, "<Glyphs Fill=" + GetAlphaColor(color) +
  210. bidi_level +
  211. " FontUri=" + Quoted(fnt.FileName) +
  212. " FontRenderingEmSize=" + Quoted(fnt.size * FontMultiplier) +
  213. " StyleSimulations=" + Quoted("None") +
  214. " OriginX=" + Quoted(left) +
  215. " OriginY=" + Quoted(top + fnt.size * FontMultiplier) +
  216. font_indexes +
  217. unicode_string +
  218. render_transform +
  219. " />");
  220. }
  221. else if (obj.TextFill is LinearGradientFill)
  222. {
  223. LinearGradientFill fill = obj.TextFill as LinearGradientFill;
  224. float right = marginLeft + obj.AbsRight;
  225. float bottom = top + fnt.size * FontMultiplier;
  226. float x = 0;
  227. ExportUtils.WriteLn(Out, "<Glyphs" +
  228. bidi_level +
  229. " FontUri=" + Quoted(fnt.FileName) +
  230. " FontRenderingEmSize=" + Quoted(fnt.size * FontMultiplier) +
  231. " StyleSimulations=" + Quoted("None") +
  232. " OriginX=" + Quoted(left) +
  233. " OriginY=" + Quoted(top + fnt.size * FontMultiplier) +
  234. font_indexes +
  235. unicode_string +
  236. render_transform + " >");
  237. ExportUtils.Write(Out, "<Glyphs.Fill>" +
  238. "<LinearGradientBrush MappingMode=\"Absolute\" StartPoint=" +
  239. Quoted(x.ToString(nfi) + "," + top.ToString(nfi)) +
  240. " EndPoint=" +
  241. Quoted(x.ToString(nfi) + "," + bottom.ToString(nfi)) + ">" +
  242. "<LinearGradientBrush.GradientStops>" +
  243. "<GradientStop Color=" + GetColor(fill.EndColor) + " Offset=\"0\" />" +
  244. "<GradientStop Color=" + GetColor(fill.StartColor) + " Offset=\"1\" />" +
  245. "</LinearGradientBrush.GradientStops></LinearGradientBrush></Glyphs.Fill>");
  246. ExportUtils.WriteLn(Out, "</Glyphs>");
  247. }
  248. if ((fnt.style & FontStyle.Underline) == FontStyle.Underline)
  249. {
  250. float y = top + (fnt.size + 2) * FontMultiplier;
  251. ExportUtils.Write(Out, "<Path Data=" + Quoted(
  252. "M " + left.ToString(nfi) + "," + y.ToString(nfi) +
  253. " L " + (left + width).ToString(nfi) + "," + y.ToString(nfi)) +
  254. " Stroke=" + GetAlphaColor(color) +
  255. " StrokeThickness=" + Quoted((fnt.size / 16).ToString(nfi)) +
  256. render_transform + " />");
  257. }
  258. if ((fnt.style & FontStyle.Strikeout) == FontStyle.Strikeout)
  259. {
  260. float y = top + (fnt.height / 2) * FontMultiplier;
  261. ExportUtils.Write(Out, "<Path Data=" + Quoted(
  262. "M " + left.ToString(nfi) + "," + y.ToString(nfi) +
  263. " L " + (left + width).ToString(nfi) + "," + y.ToString(nfi)) +
  264. " Stroke=" + GetAlphaColor(color) +
  265. " StrokeThickness=" + Quoted((fnt.size / 32).ToString(nfi)) +
  266. render_transform + " />");
  267. }
  268. }
  269. }
  270. private void FillRectangle(Stream Out, ReportComponentBase obj)
  271. {
  272. float left = marginLeft + obj.AbsLeft;
  273. float right = marginLeft + obj.AbsRight;
  274. float top = marginTop + obj.AbsTop;
  275. float bottom = marginTop + obj.AbsBottom;
  276. if (obj.Fill is SolidFill)
  277. {
  278. if (obj.FillColor.A == 0) return;
  279. ExportUtils.Write(Out, "<Path Data=\"F1 M " + left.ToString(nfi) + "," + top.ToString(nfi) +
  280. " H " + right.ToString(nfi) +
  281. " V " + bottom.ToString(nfi) +
  282. " H " + left.ToString(nfi) +
  283. " z\" Fill=" + GetAlphaColor(obj.FillColor) + " />");
  284. }
  285. else if (obj.Fill is GlassFill)
  286. {
  287. GlassFill fill = obj.Fill as GlassFill;
  288. ExportUtils.Write(Out, "<Path Data=\"F1 M " + left.ToString(nfi) + "," + top.ToString(nfi) +
  289. " H " + right.ToString(nfi) +
  290. " V " + (bottom - obj.Height / 2).ToString(nfi) +
  291. " H " + left.ToString(nfi) +
  292. " z\" Opacity=" + Quoted((1 - fill.Blend).ToString(nfi)) + " Fill=" + GetAlphaColor(fill.Color) + " />");
  293. ExportUtils.Write(Out, "<Path Data=\"F1 M " + left.ToString(nfi) + "," + (top + obj.Height / 2).ToString(nfi) +
  294. " H " + right.ToString(nfi) +
  295. " V " + bottom.ToString(nfi) +
  296. " H " + left.ToString(nfi) +
  297. " z\" Fill=" + GetAlphaColor(fill.Color) + " />");
  298. }
  299. else if (obj.Fill is LinearGradientFill)
  300. {
  301. LinearGradientFill fill = obj.Fill as LinearGradientFill;
  302. float x = 0;
  303. // to do: support focus, contrast
  304. ExportUtils.Write(Out, "<Path>");
  305. ExportUtils.Write(Out, "<Path.Fill>" +
  306. "<LinearGradientBrush MappingMode=\"Absolute\" StartPoint=" +
  307. Quoted(x.ToString(nfi) + "," + top.ToString(nfi)) +
  308. " EndPoint=" +
  309. Quoted(x.ToString(nfi) + "," + bottom.ToString(nfi)) + ">" +
  310. "<LinearGradientBrush.GradientStops>" +
  311. "<GradientStop Color=" + GetColor(fill.EndColor) + " Offset=\"0\" />" +
  312. "<GradientStop Color=" + GetColor(fill.StartColor) + " Offset=\"1\" />" +
  313. "</LinearGradientBrush.GradientStops></LinearGradientBrush></Path.Fill>");
  314. ExportUtils.Write(Out, "<Path.Data><PathGeometry><PathFigure StartPoint=" +
  315. Quoted(left.ToString(nfi) + "," + top.ToString(nfi)) + ">" +
  316. "<PolyLineSegment Points=" +
  317. Quoted(right.ToString(nfi) + "," + top.ToString(nfi) + " " +
  318. right.ToString(nfi) + "," + bottom.ToString(nfi) + " " +
  319. left.ToString(nfi) + "," + bottom.ToString(nfi)) + " />" +
  320. "</PathFigure></PathGeometry></Path.Data>");
  321. ExportUtils.Write(Out, "</Path>");
  322. }
  323. }
  324. private string GetLineStyle(LineStyle style)
  325. {
  326. string result_style = "StrokeDashArray=";
  327. switch (style)
  328. {
  329. case LineStyle.Solid: return "";
  330. case LineStyle.Dot:
  331. result_style += Quoted("1.0 1.0");
  332. break;
  333. case LineStyle.Dash:
  334. result_style += Quoted("2.75 1.0");
  335. break;
  336. case LineStyle.DashDot:
  337. result_style += Quoted("2.75 1.0 1.0 1.0");
  338. break;
  339. case LineStyle.DashDotDot:
  340. result_style += Quoted("2.75 1.0 1.0 1.0 1.0 1.0");
  341. break;
  342. }
  343. return result_style;
  344. }
  345. private void DrawBorder(Stream Out, ReportComponentBase obj)
  346. {
  347. Border b = obj.Border;
  348. if (b.Lines == BorderLines.None) return;
  349. float left = marginLeft + obj.AbsLeft;
  350. float right = marginLeft + obj.AbsRight;
  351. float top = marginTop + obj.AbsTop;
  352. float bottom = marginTop + obj.AbsBottom;
  353. bool same_border =
  354. b.Lines == BorderLines.All &&
  355. (b.BottomLine.Color == b.LeftLine.Color) &&
  356. (b.BottomLine.Color == b.TopLine.Color) &&
  357. (b.BottomLine.Color == b.RightLine.Color) &&
  358. (b.BottomLine.DashStyle == b.LeftLine.DashStyle) &&
  359. (b.BottomLine.DashStyle == b.TopLine.DashStyle) &&
  360. (b.BottomLine.DashStyle == b.RightLine.DashStyle) &&
  361. (b.BottomLine.Width == b.LeftLine.Width) &&
  362. (b.BottomLine.Width == b.TopLine.Width) &&
  363. (b.BottomLine.Width == b.RightLine.Width);
  364. if (same_border)
  365. {
  366. ExportUtils.Write(Out, "<Path Data=\"M " + left.ToString(nfi) + "," + top.ToString(nfi) +
  367. " H " + right.ToString(nfi) +
  368. " V " + bottom.ToString(nfi) +
  369. " H " + left.ToString(nfi) +
  370. " z\" Stroke=" + GetAlphaColor(obj.Border.Color) +
  371. GetLineStyle(obj.Border.Style) +
  372. " StrokeThickness=" + Quoted(obj.Border.Width) + " />");
  373. }
  374. else
  375. {
  376. if ((b.Lines & BorderLines.Left) == BorderLines.Left)
  377. {
  378. ExportUtils.Write(Out, "<Path Data=\"M " + left.ToString(nfi) + "," + top.ToString(nfi) + " V " + bottom.ToString(nfi) +
  379. "\" Stroke=" + GetAlphaColor(b.LeftLine.Color) +
  380. GetLineStyle(b.LeftLine.Style) +
  381. " StrokeThickness=" + Quoted(b.LeftLine.Width) + " />");
  382. }
  383. if ((b.Lines & BorderLines.Bottom) == BorderLines.Bottom)
  384. {
  385. ExportUtils.Write(Out, "<Path Data=\"M " + left.ToString(nfi) + "," + bottom.ToString(nfi) + " H " + right.ToString(nfi) +
  386. "\" Stroke=" + GetAlphaColor(b.BottomLine.Color) +
  387. GetLineStyle(b.BottomLine.Style) +
  388. " StrokeThickness=" + Quoted(b.BottomLine.Width) + " />");
  389. }
  390. if ((b.Lines & BorderLines.Right) == BorderLines.Right)
  391. {
  392. ExportUtils.Write(Out, "<Path Data=\"M " + right.ToString(nfi) + "," + top.ToString(nfi) + " V " + bottom.ToString(nfi) +
  393. "\" Stroke=" + GetAlphaColor(b.RightLine.Color) +
  394. GetLineStyle(b.RightLine.Style) +
  395. " StrokeThickness=" + Quoted(b.RightLine.Width) + " />");
  396. }
  397. if ((b.Lines & BorderLines.Top) == BorderLines.Top)
  398. {
  399. ExportUtils.Write(Out, "<Path Data=\"M " + left.ToString(nfi) + "," + top.ToString(nfi) + " H " + right.ToString(nfi) +
  400. "\" Stroke=" + GetAlphaColor(b.TopLine.Color) +
  401. GetLineStyle(b.TopLine.Style) +
  402. " StrokeThickness=" + Quoted(b.TopLine.Width) + " />");
  403. }
  404. }
  405. }
  406. private void DrawShadow(Stream Out, ReportComponentBase obj)
  407. {
  408. if (obj.Border.Shadow)
  409. {
  410. float x, y, sz;
  411. sz = obj.Border.ShadowWidth;
  412. x = marginLeft + obj.AbsRight;
  413. y = marginTop + obj.AbsTop;
  414. ExportUtils.Write(Out, "<Path Data=\"F1 M " + x.ToString(nfi) + "," + (y + sz).ToString(nfi) +
  415. " H " + (x + sz).ToString(nfi) +
  416. " V " + (y + sz + obj.Height).ToString(nfi) +
  417. " H " + (x + sz - obj.Width).ToString(nfi) +
  418. " V " + (y + obj.Height).ToString(nfi) +
  419. " H " + x.ToString(nfi) +
  420. " z\" Fill=" + GetAlphaColor(obj.Border.ShadowColor) + " />");
  421. }
  422. }
  423. #endregion
  424. private MemoryStream file;
  425. internal void ExportBegin(XPSExport export, ReportPage page)
  426. {
  427. this.export = export;
  428. marginLeft = page.LeftMargin * MetrixMultiplier;
  429. marginTop = page.TopMargin * MetrixMultiplier;
  430. file = new MemoryStream();
  431. ExportUtils.WriteLn(file, "<FixedPage xmlns=\"http://schemas.microsoft.com/xps/2005/06\"" +
  432. " Width=" + Quoted(ExportUtils.GetPageWidth(page) * MetrixMultiplier) +
  433. " Height=" + Quoted(ExportUtils.GetPageHeight(page) * MetrixMultiplier) +
  434. " xml:lang=\"und\">");
  435. // bitmap watermark on bottom
  436. if (page.Watermark.Enabled && !page.Watermark.ShowImageOnTop)
  437. AddBitmapWatermark(file, page);
  438. // text watermark on bottom
  439. if (page.Watermark.Enabled && !page.Watermark.ShowTextOnTop)
  440. AddTextWatermark(file, page);
  441. }
  442. internal void ExportBand(XPSExport export, Base band)
  443. {
  444. if (!((band as BandBase).Fill is TextureFill))
  445. AddBandObject(file, band as BandBase);
  446. else
  447. AddPictureObject(file, rId, band as ReportComponentBase, "ppt/media/FixMeImage");
  448. foreach (Base c in band.ForEachAllConvectedObjects(export))
  449. {
  450. ReportComponentBase obj = c as ReportComponentBase;
  451. if (obj is CellularTextObject)
  452. obj = (obj as CellularTextObject).GetTable();
  453. if (obj is TableCell)
  454. continue;
  455. else if (obj is TableBase)
  456. AddTable(file, obj as TableBase);
  457. else if (obj is TextObject && !(obj as TextObject).TextOutline.Enabled)
  458. AddTextObject(file, obj as TextObject);
  459. else if (obj is BandBase && !(obj.Fill is TextureFill))
  460. AddBandObject(file, obj as BandBase);
  461. else if (obj is LineObject)
  462. AddLine(file, obj as LineObject);
  463. else if (obj is ShapeObject && !(obj.Fill is TextureFill))
  464. AddShape(file, obj as ShapeObject);
  465. else if (obj is PictureObject)
  466. AddPictureObject(file, rId, obj as PictureObject, "ppt/media/image");
  467. else if (obj is Barcode.BarcodeObject)
  468. AddPictureObject(file, rId, obj as ReportComponentBase, "ppt/media/BarcodeImage");
  469. else if (obj is ZipCodeObject)
  470. AddPictureObject(file, rId, obj as ReportComponentBase, "ppt/media/ZipCodeImage");
  471. #if MSCHART
  472. else if (obj is MSChart.MSChartObject)
  473. AddPictureObject(file, rId, obj as ReportComponentBase, "ppt/media/MSChartImage");
  474. #endif
  475. #if !FRCORE
  476. else if (obj is RichObject)
  477. AddPictureObject(file, rId, obj as ReportComponentBase, "ppt/media/RichTextImage");
  478. #endif
  479. else if (obj is CheckBoxObject)
  480. AddCheckboxObject(file, obj as CheckBoxObject);
  481. else if (obj == null)
  482. {
  483. ;
  484. }
  485. else
  486. {
  487. AddPictureObject(file, rId, obj as ReportComponentBase, "ppt/media/FixMeImage");
  488. }
  489. }
  490. }
  491. internal void ExportEnd(XPSExport export, ReportPage page)
  492. {
  493. // bitmap watermark on top
  494. if (page.Watermark.Enabled && page.Watermark.ShowImageOnTop)
  495. AddBitmapWatermark(file, page);
  496. // text watermark on top
  497. if (page.Watermark.Enabled && page.Watermark.ShowTextOnTop)
  498. AddTextWatermark(file, page);
  499. ExportUtils.WriteLn(file, "</FixedPage>");
  500. file.Position = 0;
  501. export.Zip.AddStream(ExportUtils.TruncLeadSlash(FileName), file);
  502. this.ExportRelations(this.export);
  503. }
  504. #region "Export report object primitives"
  505. private void AddCheckboxObject(Stream Out, CheckBoxObject checkBox)
  506. {
  507. if (checkBox.HideIfUnchecked && !checkBox.Checked) return;
  508. RectangleF drawRect = new RectangleF(
  509. marginLeft + checkBox.AbsLeft, marginTop + checkBox.AbsTop, checkBox.Width, checkBox.Height);
  510. FillRectangle(Out, checkBox);
  511. DrawBorder(Out, checkBox);
  512. if (!checkBox.Checked && checkBox.UncheckedSymbol == UncheckedSymbol.None) return;
  513. ExportUtils.Write(Out, "<Path Data=\"");
  514. float ratio = checkBox.Width / (Units.Millimeters * 5);
  515. drawRect.Inflate(-4 * ratio, -4 * ratio);
  516. if (checkBox.Checked)
  517. {
  518. switch (checkBox.CheckedSymbol)
  519. {
  520. case CheckedSymbol.Check:
  521. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," +
  522. (drawRect.Top + drawRect.Height / 10 * 5).ToString(nfi) + " L " +
  523. (drawRect.Left + drawRect.Width / 10 * 4).ToString(nfi) + "," +
  524. (drawRect.Bottom - drawRect.Height / 10).ToString(nfi) + " " +
  525. drawRect.Right.ToString(nfi) + "," +
  526. (drawRect.Top + drawRect.Height / 10).ToString(nfi)
  527. );
  528. break;
  529. case CheckedSymbol.Cross:
  530. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," + drawRect.Top.ToString(nfi) +
  531. " L " + drawRect.Right.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) +
  532. " M " + drawRect.Left.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) +
  533. " L " + drawRect.Right.ToString(nfi) + "," + drawRect.Top.ToString(nfi)
  534. );
  535. break;
  536. case CheckedSymbol.Plus:
  537. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," + (drawRect.Top + drawRect.Height / 2).ToString(nfi) +
  538. " L " + drawRect.Right.ToString(nfi) + "," + (drawRect.Top + drawRect.Height / 2).ToString(nfi) +
  539. " M " + (drawRect.Left + drawRect.Width / 2).ToString(nfi) + "," + drawRect.Top.ToString(nfi) +
  540. " L " + (drawRect.Left + drawRect.Width / 2).ToString(nfi) + "," + drawRect.Bottom.ToString(nfi)
  541. );
  542. break;
  543. case CheckedSymbol.Fill:
  544. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," + drawRect.Top.ToString(nfi) + " L " +
  545. drawRect.Right.ToString(nfi) + "," + drawRect.Top.ToString(nfi) + " " +
  546. drawRect.Right.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) + " " +
  547. drawRect.Left.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) + " z "
  548. );
  549. break;
  550. }
  551. }
  552. else
  553. {
  554. switch (checkBox.UncheckedSymbol)
  555. {
  556. case UncheckedSymbol.Cross:
  557. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," + drawRect.Top.ToString(nfi) +
  558. " L " + drawRect.Right.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) +
  559. " M " + drawRect.Left.ToString(nfi) + "," + drawRect.Bottom.ToString(nfi) +
  560. " L " + drawRect.Right.ToString(nfi) + "," + drawRect.Top.ToString(nfi)
  561. );
  562. break;
  563. case UncheckedSymbol.Minus:
  564. ExportUtils.Write(Out, "M " + drawRect.Left.ToString(nfi) + "," + (drawRect.Top + drawRect.Height / 2).ToString(nfi) +
  565. " L " + drawRect.Right.ToString(nfi) + "," + (drawRect.Top + drawRect.Height / 2).ToString(nfi)
  566. );
  567. break;
  568. }
  569. }
  570. ExportUtils.WriteLn(Out, "\" Stroke=" + GetAlphaColor(checkBox.CheckColor) + " StrokeThickness=" + Quoted(checkBox.Border.Width * 1.5F) + ">");
  571. if (checkBox.Checked && checkBox.CheckedSymbol == CheckedSymbol.Fill)
  572. {
  573. ExportUtils.WriteLn(Out, "<Path.Fill><SolidColorBrush Color=" + GetColor(checkBox.CheckColor) + "/></Path.Fill>");
  574. }
  575. ExportUtils.WriteLn(Out, "</Path>");
  576. }
  577. private void AddPictureObject(Stream Out, object p, ReportComponentBase pictureObject, string ImageNameMask)
  578. {
  579. if (pictureObject.Width > 0 && pictureObject.Height > 0)
  580. {
  581. XPS_Picture xps_picture = new XPS_Picture(pictureObject);
  582. float left = marginLeft + pictureObject.AbsLeft;
  583. float right = marginLeft + pictureObject.AbsRight;
  584. float top = marginTop + pictureObject.AbsTop;
  585. float bottom = marginTop + pictureObject.AbsBottom;
  586. string picturePath = xps_picture.SaveImage(export, pictureObject, true);
  587. ExportUtils.Write(Out, "<Path Data=\"");
  588. ExportUtils.Write(Out, "M " + left.ToString(nfi) + "," + top.ToString(nfi) +
  589. " L " + right.ToString(nfi) + "," + top.ToString(nfi) +
  590. " " + right.ToString(nfi) + "," + bottom.ToString(nfi) +
  591. " " + left.ToString(nfi) + "," + bottom.ToString(nfi) + " z\">");
  592. ExportUtils.WriteLn(Out, "<Path.Fill>");
  593. ExportUtils.Write(Out, "<ImageBrush TileMode=\"None\" ViewboxUnits=\"Absolute\" ViewportUnits=\"Absolute\"");
  594. ExportUtils.Write(Out, " ImageSource=" + Quoted(picturePath));
  595. ExportUtils.Write(Out, " Viewbox=\"0,0," +
  596. pictureObject.Width.ToString(nfi) + "," +
  597. pictureObject.Height.ToString(nfi) + "\"");
  598. ExportUtils.Write(Out, " Viewport=\"" +
  599. left.ToString(nfi) + "," +
  600. top.ToString(nfi) + "," +
  601. pictureObject.Width.ToString(nfi) + "," +
  602. pictureObject.Height.ToString(nfi) + "\" />");
  603. ExportUtils.WriteLn(Out, "</Path.Fill></Path>");
  604. DrawBorder(Out, pictureObject);
  605. if (this.AddRelation(relationCount, xps_picture) == true) relationCount++;
  606. }
  607. }
  608. private void AddShape(Stream Out, ShapeObject shapeObject)
  609. {
  610. float x = marginLeft + (shapeObject.AbsLeft + shapeObject.Border.Width / 2);
  611. float y = marginTop + (shapeObject.AbsTop + shapeObject.Border.Width / 2);
  612. float dx = (shapeObject.Width - shapeObject.Border.Width) - 1;
  613. float dy = (shapeObject.Height - shapeObject.Border.Width) - 1;
  614. float x1 = x + dx;
  615. float y1 = y + dy;
  616. ExportUtils.Write(Out, "<Path Data=\"");
  617. switch (shapeObject.Shape)
  618. {
  619. case ShapeKind.Diamond:
  620. ExportUtils.Write(Out, "M " + (x + dx / 2).ToString(nfi) + "," + y.ToString(nfi) + " L " +
  621. x1.ToString(nfi) + "," + (y + dy / 2).ToString(nfi) + " " +
  622. (x + dx / 2).ToString(nfi) + "," + y1.ToString(nfi) + " " +
  623. x.ToString(nfi) + "," + (y + dy / 2).ToString(nfi) + " ");
  624. break;
  625. case ShapeKind.Ellipse:
  626. x1 = x + dx / 2;
  627. dx /= 2;
  628. dy /= 2;
  629. ExportUtils.Write(Out, "M " + x1.ToString(nfi) + "," + y.ToString(nfi) +
  630. " A " + dx.ToString(nfi) + "," + dy.ToString(nfi) +
  631. " 0 1 0 " + (x1 + 0.1).ToString(nfi) + "," + y.ToString(nfi) + " ");
  632. break;
  633. case ShapeKind.Rectangle:
  634. ExportUtils.Write(Out, "M " + x.ToString(nfi) + "," + y.ToString(nfi) + " L " +
  635. x1.ToString(nfi) + "," + y.ToString(nfi) + " " +
  636. x1.ToString(nfi) + "," + y1.ToString(nfi) + " " +
  637. x.ToString(nfi) + "," + y1.ToString(nfi) + " ");
  638. break;
  639. case ShapeKind.RoundRectangle:
  640. float min = Math.Min(dx, dy);
  641. if (shapeObject.Curve == 0) min = min / 4; else min = Math.Min(min, shapeObject.Curve * 10);
  642. ExportUtils.Write(Out, "M " + (x + min).ToString(nfi) + "," + y.ToString(nfi) + " L " +
  643. (x1 - min).ToString(nfi) + "," + y.ToString(nfi) +
  644. " A " + min.ToString(nfi) + "," + min.ToString(nfi) +
  645. " 0 0 1 " + x1.ToString(nfi) + "," + (y + min).ToString(nfi) +
  646. " L " + x1.ToString(nfi) + "," + (y1 - min).ToString(nfi) +
  647. " A " + min.ToString(nfi) + "," + min.ToString(nfi) +
  648. " 0 0 1 " + (x1 - min).ToString(nfi) + "," + y1.ToString(nfi) +
  649. " L " + (x + min).ToString(nfi) + "," + y1.ToString(nfi) +
  650. " A " + min.ToString(nfi) + "," + min.ToString(nfi) +
  651. " 0 0 1 " + x.ToString(nfi) + "," + (y1 - min).ToString(nfi) +
  652. " L " + x.ToString(nfi) + "," + (y + min).ToString(nfi) +
  653. " A " + min.ToString(nfi) + "," + min.ToString(nfi) +
  654. " 0 0 1 " + (x + min).ToString(nfi) + "," + y.ToString(nfi) + " ");
  655. break;
  656. case ShapeKind.Triangle:
  657. ExportUtils.Write(Out, "M " + x1.ToString(nfi) + "," + y1.ToString(nfi) + " L " +
  658. x.ToString(nfi) + "," + y1.ToString(nfi) + " " +
  659. (x + dx / 2).ToString(nfi) + "," + y.ToString(nfi) + " ");
  660. break;
  661. default: throw new Exception("Unsupported shape kind");
  662. }
  663. ExportUtils.WriteLn(Out, "z\" Stroke=" + GetAlphaColor(shapeObject.Border.Color) + " StrokeThickness=" + Quoted(shapeObject.Border.Width) + " >");
  664. ExportUtils.WriteLn(Out, "</Path>");
  665. }
  666. private void AddLine(Stream Out, LineObject lineObject)
  667. {
  668. float left = marginLeft + lineObject.AbsLeft;
  669. float right = marginLeft + lineObject.AbsRight;
  670. float top = marginTop + lineObject.AbsTop;
  671. float bottom = marginTop + lineObject.AbsBottom;
  672. ExportUtils.Write(Out, "<Path Data=\"");
  673. ExportUtils.Write(Out, "M " + left.ToString(nfi) + "," + top.ToString(nfi) + " L " + right.ToString(nfi) + "," + bottom.ToString(nfi));
  674. ExportUtils.WriteLn(Out, "\" Stroke=" + GetAlphaColor(lineObject.Border.Color) + " StrokeThickness=" + Quoted(lineObject.Border.Width) + " >");
  675. ExportUtils.WriteLn(Out, "</Path>");
  676. }
  677. private void AddBandObject(Stream Out, BandBase bandBase)
  678. {
  679. if (bandBase.HasBorder)
  680. {
  681. DrawBorder(Out, bandBase);
  682. }
  683. if (bandBase.HasFill)
  684. {
  685. FillRectangle(Out, bandBase);
  686. }
  687. }
  688. private void AddTextObject(Stream Out, TextObject obj)
  689. {
  690. float FDpiFX = 96f / DrawUtils.ScreenDpi;
  691. bool FirstOccurrence;
  692. FillRectangle(Out, obj);
  693. DrawShadow(Out, obj);
  694. DrawBorder(Out, obj);
  695. IGraphics g = export.Report.MeasureGraphics;
  696. using (Font f = new Font(obj.Font.FontFamily, obj.Font.Size * FDpiFX, obj.Font.Style))
  697. {
  698. XPS_Font font = export.FontList.AddFont(export, obj.Font, out FirstOccurrence);
  699. if (this.AddRelation(relationCount, font) == true) relationCount++;
  700. using (GraphicCache cache = new GraphicCache())
  701. {
  702. RectangleF textRect = new RectangleF(
  703. marginLeft + obj.AbsLeft + obj.Padding.Left,
  704. marginTop + obj.AbsTop + obj.Padding.Top,
  705. obj.Width - obj.Padding.Horizontal,
  706. obj.Height - obj.Padding.Vertical);
  707. StringFormat format = obj.GetStringFormat(cache, 0);
  708. Brush textBrush = cache.GetBrush(obj.TextColor);
  709. AdvancedTextRenderer renderer = new AdvancedTextRenderer(obj.Text, g, f, textBrush, null,
  710. textRect, format, obj.HorzAlign, obj.VertAlign, obj.LineHeight, obj.Angle, obj.FontWidthRatio,
  711. obj.ForceJustify, obj.Wysiwyg, obj.HasHtmlTags, true, FDpiFX, FDpiFX, obj.InlineImageCache);
  712. foreach (AdvancedTextRenderer.Paragraph paragraph in renderer.Paragraphs)
  713. {
  714. foreach (AdvancedTextRenderer.Line line in paragraph.Lines)
  715. {
  716. foreach (AdvancedTextRenderer.Word word in line.Words)
  717. {
  718. float fix_hpos = f.Height * 0.1f; // to match .net char X offset
  719. // invert offset in case of rtl
  720. if (obj.RightToLeft)
  721. fix_hpos = -fix_hpos;
  722. // we don't need this offset if text is centered
  723. if (obj.HorzAlign == HorzAlign.Center)
  724. fix_hpos = 0;
  725. if (renderer.HtmlTags)
  726. foreach (AdvancedTextRenderer.Run run in word.Runs)
  727. {
  728. Font runFont = run.GetFont();
  729. using (Font htmlFont = new Font(runFont.FontFamily, runFont.Size / FDpiFX, runFont.Style))
  730. {
  731. XPS_Font mod_font = export.FontList.AddFont(export, htmlFont, out FirstOccurrence);
  732. if (this.AddRelation(relationCount, mod_font) == true) relationCount++;
  733. Add_Glyphs(Out, obj, mod_font, run.Style.Color, fix_hpos + run.Left, run.Top, run.Width, run.Text);
  734. }
  735. }
  736. else
  737. Add_Glyphs(Out, obj, font, obj.TextColor, fix_hpos + word.Left, word.Top, word.Width, word.Text);
  738. }
  739. }
  740. }
  741. }
  742. }
  743. }
  744. private void AddTable(Stream Out, TableBase table)
  745. {
  746. TableBase frame = new TableBase();
  747. frame.Assign(table);
  748. frame.Left = table.AbsLeft;
  749. frame.Top = table.AbsTop;
  750. float x = 0;
  751. float y = 0;
  752. for (int j = 0; j < table.Columns.Count; j++)
  753. {
  754. y = 0;
  755. for (int i = 0; i < table.RowCount; i++)
  756. {
  757. if (!table.IsInsideSpan(table[j, i]))
  758. {
  759. TableCell textcell = table[j, i];
  760. textcell.Left = x;
  761. textcell.Top = y;
  762. AddTextObject(Out, textcell);
  763. }
  764. y += (table.Rows[i]).Height;
  765. }
  766. x += (table.Columns[j]).Width;
  767. }
  768. frame.Width = x;
  769. frame.Height = y;
  770. DrawBorder(Out, frame);
  771. }
  772. private void AddTextWatermark(Stream Out, ReportPage page)
  773. {
  774. TextObject obj = page.Watermark.TextObject;
  775. if (obj == null) return;
  776. RectangleF displayRect = new RectangleF(
  777. -marginLeft,
  778. -marginTop,
  779. ExportUtils.GetPageWidth(page) * MetrixMultiplier,
  780. ExportUtils.GetPageHeight(page) * MetrixMultiplier);
  781. obj.Bounds = displayRect;
  782. int angle = 0;
  783. switch (page.Watermark.TextRotation)
  784. {
  785. case WatermarkTextRotation.Horizontal:
  786. angle = 0;
  787. break;
  788. case WatermarkTextRotation.Vertical:
  789. angle = 270;
  790. break;
  791. case WatermarkTextRotation.ForwardDiagonal:
  792. angle = 360 - (int)(Math.Atan(displayRect.Height / displayRect.Width) * (180 / Math.PI));
  793. break;
  794. case WatermarkTextRotation.BackwardDiagonal:
  795. angle = (int)(Math.Atan(displayRect.Height / displayRect.Width) * (180 / Math.PI));
  796. break;
  797. }
  798. obj.Angle = angle;
  799. AddTextObject(Out, obj);
  800. }
  801. private void AddBitmapWatermark(Stream Out, ReportPage page)
  802. {
  803. PictureObject pic = page.Watermark.PictureObject;
  804. if (pic.Image == null) return;
  805. RectangleF displayRect = new RectangleF(
  806. -marginLeft,
  807. -marginTop,
  808. ExportUtils.GetPageWidth(page) * MetrixMultiplier,
  809. ExportUtils.GetPageHeight(page) * MetrixMultiplier);
  810. pic.Bounds = displayRect;
  811. PictureBoxSizeMode sizeMode = PictureBoxSizeMode.Normal;
  812. if (page.Watermark.ImageSize == WatermarkImageSize.Stretch)
  813. sizeMode = PictureBoxSizeMode.StretchImage;
  814. else if (page.Watermark.ImageSize == WatermarkImageSize.Zoom)
  815. sizeMode = PictureBoxSizeMode.Zoom;
  816. else if (page.Watermark.ImageSize == WatermarkImageSize.Center)
  817. sizeMode = PictureBoxSizeMode.CenterImage;
  818. pic.SizeMode = sizeMode;
  819. pic.Tile = page.Watermark.ImageSize == WatermarkImageSize.Tile;
  820. AddPictureObject(Out, rId, pic, "BackgroundPic");
  821. }
  822. #endregion
  823. internal XPS_PageContent(int pageNo)
  824. {
  825. pageNumber = pageNo;
  826. }
  827. }
  828. /// <summary>
  829. /// Document structure descriptor
  830. /// </summary>
  831. internal class XPS_FixedDocument : OoXMLBase
  832. {
  833. #region "Class overrides"
  834. public override string RelationType { get { return null; } } // "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide"; } }
  835. public override string ContentType { get { return null; } } //"application/vnd.openxmlformats-officedocument.presentationml.slide+xml"; } }
  836. public override string FileName { get { return "/Documents/1/FixedDocument.fdoc"; } }
  837. #endregion
  838. #region Private fields
  839. private ArrayList pageList;
  840. #endregion
  841. internal void AddPage(XPS_PageContent page)
  842. {
  843. pageList.Add(page);
  844. }
  845. internal void Export(XPSExport export)
  846. {
  847. MemoryStream file = new MemoryStream();
  848. ExportUtils.WriteLn(file, "<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
  849. ExportUtils.WriteLn(file, "<FixedDocument xmlns=\"http://schemas.microsoft.com/xps/2005/06\">");
  850. foreach (XPS_PageContent page in pageList)
  851. {
  852. ExportUtils.WriteLn(file, "<PageContent Source=" + Quoted(page.FileName) + "/>");
  853. }
  854. ExportUtils.WriteLn(file, "</FixedDocument>");
  855. file.Position = 0;
  856. export.Zip.AddStream(ExportUtils.TruncLeadSlash(FileName), file);
  857. }
  858. internal XPS_FixedDocument()
  859. {
  860. pageList = new ArrayList();
  861. }
  862. }
  863. /// <summary>
  864. /// Main class of XML export
  865. /// </summary>
  866. public partial class XPSExport : OOExportBase, IDisposable
  867. {
  868. #region Private fields
  869. private OoXMLCoreDocumentProperties coreDocProp;
  870. private XPS_FixedDocument fixedDocument;
  871. private XPS_FontList fontList;
  872. #endregion
  873. #region Internal properties
  874. internal XPS_FontList FontList { get { return fontList; } }
  875. #endregion
  876. #region Public fields
  877. /// <summary>
  878. /// PicturesCount
  879. /// </summary>
  880. public int picturesCount;
  881. /// <summary>
  882. /// HumanReadable
  883. /// </summary>
  884. public bool humanReadable;
  885. #endregion
  886. #region Private methods
  887. private void CreateContentTypes()
  888. {
  889. MemoryStream file = new MemoryStream();
  890. ExportUtils.WriteLn(file, xml_header);
  891. ExportUtils.WriteLn(file, "<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">");
  892. ExportUtils.WriteLn(file, "<Default Extension=\"png\" ContentType=\"image/png\" /> ");
  893. ExportUtils.WriteLn(file, "<Default Extension=\"jpeg\" ContentType=\"image/jpg\" /> ");
  894. ExportUtils.WriteLn(file, "<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" /> ");
  895. ExportUtils.WriteLn(file, "<Default Extension=\"xml\" ContentType=\"application/xml\" /> ");
  896. ExportUtils.WriteLn(file, "<Default Extension=\"fdseq\" ContentType=\"application/vnd.ms-package.xps-fixeddocumentsequence+xml\" /> ");
  897. ExportUtils.WriteLn(file, "<Default Extension=\"fpage\" ContentType=\"application/vnd.ms-package.xps-fixedpage+xml\" /> ");
  898. ExportUtils.WriteLn(file, "<Default Extension=\"struct\" ContentType=\"application/vnd.ms-package.xps-documentstructure+xml\" /> ");
  899. ExportUtils.WriteLn(file, "<Default Extension=\"jpg\" ContentType=\"image/jpeg\" /> ");
  900. ExportUtils.WriteLn(file, "<Default Extension=\"odttf\" ContentType=\"application/vnd.ms-package.obfuscated-opentype\" /> ");
  901. ExportUtils.WriteLn(file, "<Default Extension=\"fdoc\" ContentType=\"application/vnd.ms-package.xps-fixeddocument+xml\" /> ");
  902. ExportUtils.WriteLn(file, "<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\" /> ");
  903. ExportUtils.WriteLn(file, "</Types>");
  904. file.Position = 0;
  905. Zip.AddStream("[Content_Types].xml", file);
  906. }
  907. private void CreateRelations()
  908. {
  909. MemoryStream file = new MemoryStream();
  910. ExportUtils.WriteLn(file, xml_header);
  911. ExportUtils.WriteLn(file, "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">");
  912. ExportUtils.WriteLn(file, "<Relationship Id=\"rId3\" Type=" + Quoted(coreDocProp.RelationType) + " Target=" + Quoted(coreDocProp.FileName) + " /> ");
  913. // Out.WriteLine("<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail" Target="docProps/thumbnail.jpeg" /> ");
  914. ExportUtils.WriteLn(file, "<Relationship Id=\"rId1\" Type=\"http://schemas.microsoft.com/xps/2005/06/fixedrepresentation\" Target=\"FixedDocSeq.fdseq\" /> ");
  915. ExportUtils.WriteLn(file, "</Relationships>");
  916. file.Position = 0;
  917. Zip.AddStream("_rels/.rels", file);
  918. }
  919. private void CreateFixedDocumentSequence()
  920. {
  921. MemoryStream file = new MemoryStream();
  922. ExportUtils.WriteLn(file, xml_header);
  923. ExportUtils.WriteLn(file, "<FixedDocumentSequence xmlns=\"http://schemas.microsoft.com/xps/2005/06\">");
  924. ExportUtils.WriteLn(file, "<DocumentReference Source=\"/Documents/1/FixedDocument.fdoc\"/>");
  925. ExportUtils.WriteLn(file, "</FixedDocumentSequence>");
  926. file.Position = 0;
  927. Zip.AddStream("FixedDocSeq.fdseq", file);
  928. }
  929. private void ExportXPS(Stream Stream)
  930. {
  931. CreateContentTypes();
  932. CreateRelations();
  933. CreateFixedDocumentSequence();
  934. coreDocProp.Export(this);
  935. fixedDocument.Export(this);
  936. fontList.Export(this);
  937. }
  938. #endregion
  939. #region Protected Methods
  940. /// <inheritdoc/>
  941. protected override void Start()
  942. {
  943. base.Start();
  944. Zip = new ZipArchive();
  945. if (fontList != null)
  946. fontList.Dispose();
  947. picturesCount = 0;
  948. coreDocProp = new OoXMLCoreDocumentProperties();
  949. fixedDocument = new XPS_FixedDocument();
  950. fontList = new XPS_FontList();
  951. pageNo = 0;
  952. }
  953. private int pageNo;
  954. private XPS_PageContent xps_page;
  955. /// <inheritdoc/>
  956. protected override void ExportPageBegin(ReportPage page)
  957. {
  958. base.ExportPageBegin(page);
  959. xps_page = new XPS_PageContent(pageNo++ + 1);
  960. fixedDocument.AddPage(xps_page);
  961. xps_page.ExportBegin(this, page);
  962. }
  963. /// <inheritdoc/>
  964. protected override void ExportBand(BandBase band)
  965. {
  966. base.ExportBand(band);
  967. xps_page.ExportBand(this, band);
  968. }
  969. /// <inheritdoc/>
  970. protected override void ExportPageEnd(ReportPage page)
  971. {
  972. xps_page.ExportEnd(this, page);
  973. }
  974. /// <inheritdoc/>
  975. protected override void Finish()
  976. {
  977. ExportXPS(Stream);
  978. Zip.SaveToStream(Stream);
  979. Zip.Clear();
  980. }
  981. /// <inheritdoc/>
  982. protected override string GetFileFilter()
  983. {
  984. return new MyRes("FileFilters").Get("XpsFile");
  985. }
  986. #endregion
  987. /// <summary>
  988. /// Constructor of XPSExport
  989. /// </summary>
  990. public XPSExport()
  991. {
  992. humanReadable = false;
  993. }
  994. /// <summary>
  995. /// Destructor of XPSExport
  996. /// </summary>
  997. public new void Dispose()
  998. {
  999. base.Dispose();
  1000. if (fontList != null)
  1001. fontList.Dispose();
  1002. }
  1003. }
  1004. }