OxPtHelpers.cs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Xml;
  9. using System.Xml.Linq;
  10. using DocumentFormat.OpenXml.Packaging;
  11. using DocumentFormat.OpenXml.Wordprocessing;
  12. using DocumentFormat.OpenXml.Validation;
  13. using OpenXmlPowerTools;
  14. using System.Text;
  15. using DocumentFormat.OpenXml;
  16. using System.Drawing.Imaging;
  17. namespace OpenXmlPowerTools
  18. {
  19. public static class AddDocxTextHelper
  20. {
  21. public static WmlDocument AppendParagraphToDocument(
  22. WmlDocument wmlDoc,
  23. string strParagraph,
  24. bool isBold,
  25. bool isItalic,
  26. bool isUnderline,
  27. string foreColor,
  28. string backColor,
  29. string styleName)
  30. {
  31. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wmlDoc))
  32. {
  33. using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument())
  34. {
  35. StyleDefinitionsPart part = wDoc.MainDocumentPart.StyleDefinitionsPart;
  36. Body body = wDoc.MainDocumentPart.Document.Body;
  37. SectionProperties sectionProperties = body.Elements<SectionProperties>().FirstOrDefault();
  38. Paragraph paragraph = new Paragraph();
  39. Run run = paragraph.AppendChild(new Run());
  40. RunProperties runProperties = new RunProperties();
  41. if (isBold)
  42. runProperties.AppendChild(new Bold());
  43. if (isItalic)
  44. runProperties.AppendChild(new Italic());
  45. if (!string.IsNullOrEmpty(foreColor))
  46. {
  47. int colorValue = ColorParser.FromName(foreColor).ToArgb();
  48. if (colorValue == 0)
  49. throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor));
  50. string ColorHex = string.Format("{0:x6}", colorValue);
  51. runProperties.AppendChild(new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = ColorHex.Substring(2) });
  52. }
  53. if (isUnderline)
  54. runProperties.AppendChild(new Underline() { Val = UnderlineValues.Single });
  55. if (!string.IsNullOrEmpty(backColor))
  56. {
  57. int colorShade = ColorParser.FromName(backColor).ToArgb();
  58. if (colorShade == 0)
  59. throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified color {0} is unsupported, Please specify the valid color. Ex, Red, Green", foreColor));
  60. string ColorShadeHex = string.Format("{0:x6}", colorShade);
  61. runProperties.AppendChild(new Shading() { Fill = ColorShadeHex.Substring(2), Val = ShadingPatternValues.Clear });
  62. }
  63. if (!string.IsNullOrEmpty(styleName))
  64. {
  65. Style style = part.Styles.Elements<Style>().Where(s => s.StyleId == styleName).FirstOrDefault();
  66. //if the specified style is not present in word document add it
  67. if (style == null)
  68. {
  69. using (MemoryStream memoryStream = new MemoryStream())
  70. {
  71. #region Default.dotx Template has been used to get all the paragraph styles
  72. string base64 =
  73. @"UEsDBBQABgAIAAAAIQDTMB8uXgEAACAFAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbLSUy27CMBBF
  74. 95X6D5G3VWLooqoqAos+li1S6QcYewJW/ZI9vP6+EwKoqiCRCmwiJTP33jNWxoPR2ppsCTFp70rW
  75. L3osAye90m5Wsq/JW/7IsoTCKWG8g5JtILHR8PZmMNkESBmpXSrZHDE8cZ7kHKxIhQ/gqFL5aAXS
  76. a5zxIOS3mAG/7/UeuPQOwWGOtQcbDl6gEguD2euaPjckEUxi2XPTWGeVTIRgtBRIdb506k9Kvkso
  77. SLntSXMd0h01MH40oa6cDtjpPuhoolaQjUXEd2Gpi698VFx5ubCkLNptjnD6qtISDvraLUQvISU6
  78. c2sKBBtoAiis0G7Pf5Ij4cZAujxF49sdD4gkuAbAzrkTYQXTz6tR/DLvBKkodyKmBi6PcbDuhEDa
  79. QGie/bM5tjZtkdQ5jj4k2uj4j7H3K1urcxo4QETd/tcdEsn67Pmgvg0UqCPZfHu/DX8AAAD//wMA
  80. UEsDBBQABgAIAAAAIQAekRq37wAAAE4CAAALAAAAX3JlbHMvLnJlbHOsksFqwzAMQO+D/YPRvVHa
  81. wRijTi9j0NsY2QcIW0lME9vYatf+/TzY2AJd6WFHy9LTk9B6c5xGdeCUXfAallUNir0J1vlew1v7
  82. vHgAlYW8pTF41nDiDJvm9mb9yiNJKcqDi1kVis8aBpH4iJjNwBPlKkT25acLaSIpz9RjJLOjnnFV
  83. 1/eYfjOgmTHV1mpIW3sHqj1FvoYdus4ZfgpmP7GXMy2Qj8Lesl3EVOqTuDKNain1LBpsMC8lnJFi
  84. rAoa8LzR6nqjv6fFiYUsCaEJiS/7fGZcElr+54rmGT827yFZtF/hbxucXUHzAQAA//8DAFBLAwQU
  85. AAYACADRagZB/Fz9fNYBAAALAwAAEAAAAGRvY1Byb3BzL2FwcC54bWztvQdgHEmWJSYvbcp7f0r1
  86. StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n
  87. 99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J5
  88. 8dlH6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0OFs9ellXq7xui7xJCcayeXTZfvbRvG1Xj+7ebabz
  89. fJE1Y2qxpC/Pq3qRtfRnfXG3Oj8vpvnTarpe5Mv27t7Ozqd3Z9UU0JqffHO9IvgKL1t9XXj5uzZf
  90. zvLZ9sri+BHj/CZfrMqszY8e3w3+wh9Vm5VvikV+tCNf2r95sNlF3hzt8jfyOz79blXPGm0vv+PT
  91. k3lWZ9OWaKpfeR/g++PVqiymWUsUP/qimNZVU5236Zc8jhRg+CW/Fd6iEb7Op+u6aK8VrP8JWjwv
  92. lrnpUn4XzOvsos5Wc/OV9wG+fz3NyvyE6HR0npVNzk3cZwr3bfPV6k31FLRyrcLPw5F/t2jnr1fZ
  93. 1CIU/Yr7py/yGY3F799+hhbfJqaoS3RGQJYX+cxr2f9OKfyTwtJHu/fHO/QYkpqPhRKWO47+H1BL
  94. AwQUAAYACADRagZBUsP9QroBAABvAgAAEQAAAGRvY1Byb3BzL2NvcmUueG1s7b0HYBxJliUmL23K
  95. e39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6
  96. O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iHv8e7xZlepnXTVEtP/tod7zzUZovp9WsWF58
  97. 9tFXb55tH3yUNm22nGVltcw/++g6bz76PY6Sx9PVo2lV5y/rapXXbZE3KQFaNo+mq88+mrft6tHd
  98. u810ni+yZkwtlvTleVUvspb+rC/urrLp2+wiv7u3s/Pp3UXeZrOsze4C4PbKQvxIQc6mFuRqXZcM
  99. YDa9m5f5Il+2zd3d8e5d17bN60UTfYG/8VouivZ6lUebmi9t63dNYRteXV2Nr+5xU8J/9+7v/cXz
  100. 1zzU7WIJUk3zj44ez6aPpnWetVV9dJIVbVks0+NmXubX26+qslxky8d3vSYgZ5k17RdE+PMinz25
  101. vsuf1fllgZk52n181//zsY5TAOSzlPB7JKMx33z33snTN88+Otrb2d3b3nmwvXf/ze6DR3v3H+3s
  102. /BT6Dt53ABeKwW0g3nuzt/tovwPRADhijEMeOfp/AFBLAwQUAAYACAAAACEA1mSzUfQAAAAxAwAA
  103. HAAAAHdvcmQvX3JlbHMvZG9jdW1lbnQueG1sLnJlbHOskstqwzAQRfeF/oOYfS07fVBC5GxKIdvW
  104. /QBFHj+oLAnN9OG/r0hJ69BguvByrphzz4A228/BineM1HunoMhyEOiMr3vXKnipHq/uQRBrV2vr
  105. HSoYkWBbXl5sntBqTkvU9YFEojhS0DGHtZRkOhw0ZT6gSy+Nj4PmNMZWBm1edYtyled3Mk4ZUJ4w
  106. xa5WEHf1NYhqDPgftm+a3uCDN28DOj5TIT9w/4zM6ThKWB1bZAWTMEtEkOdFVkuK0B+LYzKnUCyq
  107. wKPFqcBhnqu/XbKe0y7+th/G77CYc7hZ0qHxjiu9txOPn+goIU8+evkFAAD//wMAUEsDBBQABgAI
  108. ANFqBkF65TN3MwIAAJAFAAARAAAAd29yZC9kb2N1bWVudC54bWztvQdgHEmWJSYvbcp7f0r1Stfg
  109. dKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//
  110. P1xmZAFs9s5K2smeIYCqyB8/fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J58dlH
  111. 6/Z8++CjtGmz5Swrq2X+2UfXefPR73H0+OrRrJquF/myTQnAsnl0tZp+9tG8bVeP7t5tpvN8kTXj
  112. RTGtq6Y6b8fTanG3Oj8vpvndq6qe3d3b2d3h31Z1Nc2bhno7yZaXWfORglv0oVWrfElfnlf1Imvp
  113. z/ri7iKr365X2wR9lbXFpCiL9ppg73xqwFQ0hnr5SEFsW4TwyiNBSH+YN+rb9CuvPFUKcI9367wk
  114. HKplMy9WbhhfFxp9OTdALjcN4nJRmnZXq939D5uDp3V2RT8cwNugP5OXFqVgvhni7s4tZgQg7Bu3
  115. QSHs02CyyIql6/hrkcYj7u799wOw1wWwung/AN3J+byu1isHrfgwaGfLtxYW5Po9YOkk+0Nr3gtA
  116. D5nX82xFEriYPjq7WFZ1NikJI5qylKiegq0/gsaZVLNr/Fyld/Gjyafty5o/uHj9g/QKrLK7t7dP
  117. Guzq0Zx+v3+A3+9Kiy+ymj5uK2Lp3X1pUxcX89b9Oanatlq4v8v83Pt2nmeznJTDgz3+87yqWu/P
  118. i3XLf5r+plXZ0MfNKpvm2og+v+uQvmuGc9dp0qP/B1BLAwQUAAYACADRagZB3iZxVZoCAAAzBwAA
  119. EgAAAHdvcmQvZm9udFRhYmxlLnhtbO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3m
  120. kuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrI
  121. Hz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KO0abPlLCurZf7Z
  122. R9d589HvcfT46tF5tWyblN5eNo8W088+mrft6tHdu810ni+yZlyt8iV9eV7Vi6ylP+uLu4usfrte
  123. bU+rxSpri0lRFu313b2dnU8/UjD1baBU5+fFNH9aTdeLfNny+3frvCSI1bKZF6vGQLu6DbSrqp6t
  124. 6mqaNw2NeFEKvEVWLC2Y3f0eoEUxraumOm/HNBjFiEHR67s7/NuidADuvx+APQtgMX10drGs6mxS
  125. EukJk5SAfWSon149WmYL+uIkK4tJXfAXq2xZNfkufXeZlZ99tLO382znPv2L//Z37uHfj9K7aDmd
  126. Z3WTt7bljn5+ni2K8tp83FwVTaPfrIp2OjdfXGZ1Abz0u6a4oG/WzWTns49Od+jZe/bsI/lk97OP
  127. 9umD4xP7yR6642dXP7lnP9nBJ1OGIy0ePtNPdv021OldIUOPHK+Lxev1kqmRle0L+szg/J//DX/s
  128. f/b3/6lmND1K7e58SrDv0U/9L06pg0+jlMrWbfWehNLR3HOE2js4eGaI4BNq99MbCAUK774noY4J
  129. sXKAa54QLfaVb/Z+aFyzd+xzzQl98uBg35DHcc3Dm7nm2ftyjQpR+ry4mLeDonTPkOOHJErHwHvv
  130. tCNKezsPnvSIYnhmmCg77y1Kb4pF3qQv8qv0VbXIlgNk2SNeuUdaZp81zb33JEvNkN+PLD9sXtFf
  131. mqP/B1BLAwQUAAQACADRagZBhoJdSR0EAAB5CQAAEQAAAHdvcmQvc2V0dGluZ3MueG1s7b0HYBxJ
  132. liUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z2899577733
  133. 3nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8i/se/9x98/Hu8W5TpZV43RbX87KPd
  134. 8c5Hab6cVrNiefHZR+v2fPvgo7Rps+UsK6tl/tlH13nz0e9x9PjqUZO3LTVqUgKwbB4tpp99NG/b
  135. 1aO7d5vpPF9kzbha5Uv68ryqF1lLf9YXdxdZ/Xa92p5Wi1XWFpOiLNrru3s7O59+pGAq6rRePlIQ
  136. 24tiWldNdd7ilUfV+XkxzfWHeaO+Tb/yytNqul7ky5Z7vFvnJeFQLZt5sWoMtMXXhUZfzg2Qy02D
  137. uFyUpt3V7s4thntV1TP7xm3QwwuruprmTUMTtCgNgsXSdbzfA2T7HlPfOkQGRa/v7vBvPub33w/A
  138. XgdAU95mJPLV82JSZ/W1P4zF9NHZxbKqs0lJPEnDSQmjj8CWNPDq/HWbtXlKPLrKy5I5eVrmGb13
  139. 9eiizhbEhfaTu3hplp9n67J9k01et9WKWl1mhN+DnQP9fn69mudL5pafIikwDfb37muD6Tyrs2mb
  140. 169X2ZQ6PKmWbV2VpuGselG1J8T0Nc2JeYVlAL9lq1V5/aTOs7f05qt1mTfSYt3kz06fZ9fVuvVf
  141. eS2CR7CX2YJGHwjTF9UsxzDXdXH7CfrI4LlrxxPtqSI9URez/A3I/rq9LvNnNM7XxQ/y4+XsO+um
  142. LQgkU+kDUNiIAU0Cdf0lccqb61X+LM/aNZH0Z6s3nrZnZbH6oqjrqj5bzkjcf/Z6K87P85p6KIh5
  143. vyB2LOrqikn97TybkYb+0I7vOqZbPIK+elmb3zCP6UIan2SLSV1k6Res0e6iyaR++6RYmgaTnGQ0
  144. D756vZ6Yb7e39ZtmkZXlMxIL882OfjErmtXT/Fz+KL/I6gsH27Sp4x+ToH7HwpsSrfL687par/Tr
  145. qzpbySyZNrv7++bdYtk+Lxbmi2Y9eW3fW5J68b5bL2dfXtZCM0epq0ct0ZtZ/nnG88aNV+32k1eg
  146. dJ417XFTZJ999IP59skLfDQpZjRdWb39+thMfVm/xrTlX5DUy+xPLnY/+6gsLubtLt5p6a8ZmUn+
  147. Y3Kxp9/t8Xd78h3/kU1BAGqtv7jP9sxnXrt75rN77rN989m+++y++ey+++xT89mn+IyUYV6TVn1L
  148. jGh+xefnVVlWV/ns2+773kdKhWaerfKnonSbo8eVfKBauEkvH+XvWhL2WdGS87EqZovsHU3lzt6n
  149. /L42L0Uz+o3xHVqvQhCzrM2sEARvs1B0sIE5mBbEvK+vFxOnw8eKe1k0JLor0vdtVZsvR/Ll7n22
  150. BO0b4npW5vn5k6zJZyp9xmU6+n8AUEsDBBQABAAIANFqBkEr9+zhUxIAABWtAAAPAAAAd29yZC9z
  151. dHlsZXMueG1s7b0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVW
  152. ZV1mFkDM7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8i/se/9x98
  153. /Hu8W5TpZV43RbX87KPd8c5Hab6cVrNiefHZR+v2fPvgo7Rps+UsK6tl/tlH13nz0e9x9PjqUdNe
  154. l3mT0uvL5tFi+tlH87ZdPbp7t5nO80XWjKtVvqQvz6t6kbX0Z31xd5HVb9er7Wm1WGVtMSnKor2+
  155. u7ez8+lHCqa+DZTq/LyY5k+r6XqRL1t+/26dlwSxWjbzYtUYaFe3gXZV1bNVXU3zpqEhL0qBt8iK
  156. pQWzu98DtCimddVU5+2YBqMYMSh6fXeHf1uUDsD99wOwZwEspo/OLpZVnU1Koj1hkhKwj0D+WTV9
  157. mp9n67Jt8Gf9stY/9S/+8axatk169ShrpkXxhnomIIuC4H37eNkUH9E3c/wS/SbPmva4KTL/y1P9
  158. DN9Pm9b75kkxo7fuMmP8gL69zMrPPtrbsx+dNL0Py2x5YT7Ml9tfvfZ7/eyjn862v/MSH00I9Gcf
  159. ZfX262N+866O72531KvuX9z1KpsW3FF23ubEYDS/gFoW4Oa9B5+aP16tQeJs3Vaml5X24sO926M8
  160. MR6x4WuRBvo2P39eTd/ms9ctffHZR9wZffjV2cu6qGri+M8+evhQP3ydL4pvF7NZvvQaLufFLP/u
  161. PF9+1eQz9/lPPGOu1Q+m1XpJv997sMvcUDaz03fTfAUZoG+XGSbmBV4o0XpduM759V9kgO2ayYgB
  162. mOcZ9EC624Xx8P1h7EVhNB4BpJfO6Hffv6d7P7Se9n9oPd3/ofX06Q+tpwc/tJ4Ofmg9PfxZ76lY
  163. zvJ3IpG3AXsToL1vCtC9bwrQ/jcF6P43BejTbwrQg28K0ME3BejW7DkMqK2mfQNx7xsC3LMa3xTg
  164. npH4pgD3bMI3BbhnAr4pwD2N/00B7in4bwpwT59/U4Af/mwAFjcsPSOBW7YfDu68qtpl1eZpm7/7
  165. BsBlSwLGsdM3BBCmMK8/HA7G+U3AEUWnBvrDwU0z/rvHKLe2Nrc19C1ivrQ6T8+Li3VNUfct4Q9D
  166. zJeXeUkhcJrNZgSw+eibg1jn7bpefjiKlrnr/DyvKRGRfzhMj8O/QagIGdPlejH5Jnh0lV18c8Dy
  167. 5eybJqEB+c1oCMvZFGzPIT/FN8Hdi4wyKh8Opq2yb05ZPC+ab4BegJI+WZdl/k0Be/ENsRoD+wZC
  168. CIbzDUQQDOcbCCAYzq01+q1m7hsjk4L7pqil4L4poim4b4p2wqjfGO0U3DdFOwX3TdFOwX0DtHtT
  169. tCWrfd9F2X2PzN9JWTXfiAZ8XVwsM/INvgEjpEnX9GVWZxd1tpqnSG/3RvnhHT2pZtfpm2/E1FlQ
  170. 35j7z5xyQgMvlutvgKgBuG9MzizAb0rSLMBvStYswG9A2r4gXxoO3Le/ocjn9XrSRgWYQd1OgF9n
  171. 5Vqc3g/H5yktZHw4FCcKz4q6+eYEIg73m2DlF3B5v/1N+YIOz28ANQfsG5CwrpL6ZhFUmN8EniUt
  172. rH1Divnb16u8phju7YeDelaVZXWVz75BkK/buhKe8+V/j+fldvJ/uljNs6ZoejB8J+Amudcl9vSL
  173. bPXhY3pZ0pr6NzR7p9u0QF+m36Bz8e03XzxP31QrhKUg8DcE8UnVttXimwOqucSt7+aTOx8OjVE8
  174. prB5ef0N4CbQvqnUEkM7Kb4JyyOgqtk3BYoc0WJZfDO2lQH+Xvn1pMrq2TcE7iVlflhHtPk3BfJ1
  175. tliV3xT93pCivCJ19E34SgzwJ7O6QE7pw8GpfL35ZqB5mcdmPfnpfPoNqL4XVfr8G8kqfbluOYcJ
  176. aN/EenIA7xvwIAJ434D3wHNKJgOM/E2MN4D3DYw3gPeNjfekzJqm0BXabxLgNzZiA/AbH/I3ECoq
  177. wKqs6vN1+Q0S0UD85qhoIH5zZKzK9WLZfKODZoDf5JgZ4Dc+5G+ScxjgN5BkEICf18Xsm5sRhvaN
  178. TQdD+8bmgqF9YxPB0L7ZWfj0G4X24BuFdvBNQfumnAMP2jfGb9+sY8DQvjF+Y2jfGL8xtG+M3xga
  179. 89s3Bu0b47d7T9P8/Jwc5W/Q7ngwvzHe82B+YxyIlHS+WFV1Vl9/UzBPy/wi+yayrALuZV2dU3RP
  180. X2TlNwUT2e7ym/TIBd43NtXfzSffHHIA9o1i9g1w35OM8pfVN5Wac1aIX/VSj/ce3vzem3m++AYC
  181. b8o1TvN5VdJyzNCwhl+mCPv1Kptq0r+3tni7/Ovz4mLepq/nmVk88OF8unPzq9Crvfdu0WWM8p/u
  182. bXrvi3xWrBcGV+H14O177/H2Xu/t/Vu8zUak3/H9277a7/XTW7zqnOng1Qe3fbXf68FtX73Xe3Wj
  183. cDzN6rdRjniwkZNsUDjAhw828pN9O9rxRpayr8a48cFGfgoEh5LTUyxA9CfplhI0DOCWojQM4L1k
  184. ahjMewnXMJjbS9kwjI3i9iq/LGD430uVco8vszq7qLPVvGcQ2N2+nT79iTUtxnYB7D28PYAzcq6W
  185. TZ5GAd17j1WxQO8ME/P2CmgYxu010TCM26ukYRi3002D77+fkhoGc3ttNQzj9mprGMb766++pXhP
  186. /dUH8J76qw/ga+mvPpivpb8+xEsYhnF7d2EYxvuLbR/G+4vth3gSwzBuFNvNLPb1xLYP5v3Ftg/j
  187. /cW2D+P9xbbvpb2n2PYBvKfY9gF8LbHtg/laYtsH8/5i24fx/mLbh/H+YtuH8f5i24fx/mL7dSOB
  188. wfe/ntj2wby/2PZhvL/Y9mG8v9ju90j6nmLbB/CeYtsH8LXEtg/ma4ltH8z7i20fxvuLbR/G+4tt
  189. H8b7i20fxvuLbR/G+4lt7/2vJ7Z9MO8vtn0Y7y+2fRjvL7b3eyR9T7HtA3hPse0D+Fpi2wfztcS2
  190. D+b9xbYP4/3Ftg/j/cW2D+P9xbYP4/3Ftg/j/cS29/7XE9s+mPcX2z6M9xfbPoz3F9tPeyR9T7Ht
  191. A3hPse0D+Fpi2wfztcS2D+b9xbYP4/3Ftg/j/cW2D+P9xbYP4/3Ftg/j/cS29/7XE9s+mPcX2z6M
  192. 9xfbPoyNnKoroqeL1Txrisa9LC/vPsQnt0t+mizqEKy93dvDUrRe5ed5nS+n/aTse8AyeA0D27s9
  193. sCdV9TZ9UxByPSj33gNKMSmLihPf1z04D/DJh61xvvnyJP12zvzZA//wtuBvOxhaUC1ohZjXaHe7
  194. 3e3f+tVeUmZ/I/P7r/YCw/2NPO+/2nNO9zdqZP/VnoHc36iIWUjlTTZTvbc3qh3v7d2B9zeqcO/9
  195. PqE3Km7vzT6dN6pr780+mTcqae/N+yk0dvf1+7cl1qep0ZI9EBs50wPxYBjERg7tT5nR0X0pufXc
  196. DYO49SQOg7j1bA6DeL9pHYTzNeZ3GNb7T/QwrK85432Ze+8Z/wCxHQbx3jPeB/H1ZrwH5wNmvA/r
  197. 6894H9bXnPG+rnzvGe+DeO8Z/wCNPQzi6814D84HzHgf1tef8T6srznjfRv33jPeB/HeM94H8d4z
  198. /qHGehDOB8x4H9bXn/E+rK85430P8L1nvA/ivWe8D+K9Z7wP4uvNeA/OB8x4H9bXn/E+rK85473o
  199. +v1nvA/ivWe8D+K9Z7wPojPjt5zxHpwPmPE+rK8/431YG2f8ObIwwYy/30R777+nn+a9+Z7G2nvz
  200. PTW29+bXCa+8179ueOWB+LrhVX/KzNy/Z3jlz90wiFtP4jCIW8/mMIj3m9ZBOF9jfodhvf9ED8P6
  201. mjP+nuFVbMY/QGyHQbz3jL9neDU44+8ZXm2c8fcMrzbO+HuGV8Mz/p7hVWzG3zO8is34B2jsYRBf
  202. b8bfM7zaOOPvGV5tnPH3DK+GZ/w9w6vYjL9neBWb8fcMr2Iz/qHGehDOB8z4e4ZXG2f8PcOr4Rl/
  203. z/AqNuPvGV7FZvw9w6vYjL9neDU44+8ZXm2c8fcMrzbO+HuGV8Mz/p7hVWzG3zO8is34e4ZXsRl/
  204. z/BqcMbfM7zaOOPvGV5tnPGh8OouActoubV93V6XeQPgDX6j1u31iqCusjrjdU8A4K/OaLXxBdYZ
  205. 2f+f5efZuuQlR7wMVOjTy6x0jRhlXZrUPhnQbTvThdF+B3P5IjVkmWS0FPrlMtr/Mn/XRr8oi+Vb
  206. 84Xp6WSe1fq1o5lpZBjDG9HVo9XLGj/e5vnqBXq6a/56XizzRv5sVtkU6BKi+XlV5+DTHYw0O2/z
  207. +rOPDKdU65aQyp9flqbLHTNX2k2tP55Vy7YBgGZaFG/mOdhgkf10VX/7eNkUAD3HL9Fv8qxpj5si
  208. 87881c/w/bRpvW+eFLPCUFl/nOiwpmA1g+ne6YP9J6xe+G1mw88+ypgJd+3Hr+fZjCA/eaYgmx/Y
  209. 943kNj84wcj8D+/qwL8m/+wN8o9Rft8U/+zdin/ckr62DFb0vzEe29u5HY/tGhr/v57H7j95+OTp
  210. MI91OcpYpICjPjWj/RCOujfIUfe+YY669/9FjrIW5v8HHPWBnLI/yCn73zCn7P9/kVPuGRr/v5FT
  211. Cv3xc8M59wc55/43zDn3/7/IOfuGxv9v4JyAM3af7T99cHBLT+jBMzOOD+GVTwd5xdjAb4pXPv3/
  212. Iq/cNzT+fwOvbNQqPwe882CQd0w4/k3xzoP/L/KO9Rf/X887+zv4r8s7LZHEcc6bYtna8OsDGedg
  213. kHFMKPdNMc7B/xcZ54Gh8c8249yGcd7TdbnywygzxCCMsomJD+Ggh4McZOb0m+Kgh/9f5CCb/Ph/
  214. Awd9s6rnm2OwKU1sNiVKBgz2VJKTLw33gWRosCFpqa+k9p1UXhrgGSsoN/LMMO4tcrYB3pzFNcx8
  215. ixyrpH2HGft9OLudlMJg9MvZckYwrpg7Dbazd5lCowYneVl+kUnzarWhbZmft/L17s5BrMGkattq
  216. sQFCzesOwyDuhgjJn5uZZrleTPKapDIg/osKmfQb6Z5Kqw8n+ftqzTdFS3PdRUg+VVp+qLpkYBt1
  217. 5a6R1pgiXD2Z8U87p/xKQ4QWPp+KYrjBAEETsPYT5Zn7wZ524JSqatF7olOhQUl57Ns/Xq1L+iBb
  218. t5W1hEvopXVWvlYY/+/RsYFOvbd373T/WUyn7tkPe+l0SxYx9D1da5f7fF3rVoS+lq71eIaGsG5o
  219. 5l/ju5j0cNvUY7AOx8b1dpxNb2bRH03me+uY1+tJG1Uz9otvSNMYeJuVjbGyMWVDSlx+KcrIYoZ+
  220. +/8Syf7AVGKPGXb73LBnEsqBG2U159cS7XCSbpRu0/zDBbzDbRs440fT+v7TqkGRrnbfOK3aPN39
  221. 8Hk1PQ/Oq/Gefk6ndaI//l+40B2ZUDehuvx86wnd+8Ym1Fii/y9O6K3k1E3fB60qb5w+Xeu99fTd
  222. +8amz6xa//9z+j5wWnRh9dbTsv+NTYtR/f8fmZYPtIYfOE26innrabr/jU2TMdr/L52mH8IC08aJ
  223. 0SXDW0/Mp9/YxBhV/f/Sifk5WAncOFG6PnfriXrwjU2UWWn8/+JEvXfu+wNnSRfDbj1LB9/YLBnH
  224. 9f+ls/Se5iZw6n4WliCUaLrydOvpeviNTZeZlP+XTtc3K1Q/27OJhESZny5W86wpmmjmg2DY7993
  225. +iIJDjNJQepLZ2wj7Q528N9taPeBZmOQGt8gGexc3kyGrzuMM1oQWDbDc6vff5OTu2dUUGxUE4V/
  226. W7f6Z8mtft3WFS2Q9ThdPv4GaLB3axrcPIRVNJn9E+uqzXsjkE+jA3j/NDYD8zR2ZJxfW5B3+BkQ
  227. 5FuRJT6zHs43miVu++Emyaf5BhL9cKgSZxYV8zjPGB3wjfKO3+NGFrr3w1pz3edfblxzneTnVZ1D
  228. OfM86BLs3oFBs1jOUln5J1/j3qdow4v4+peCVefj/1VKrz8lN0pIwBofLikBG97IEP/vop54Qa/y
  229. 87zOl9O+FKmX5Bq8L6EilNhkSRuSu/IkW8WocPr0wdN7zPh9KhjLtO5K0wfQRud1mDiGj75R6tze
  230. xn44tQbWq79JIj6pqrdvosvT+CZ9M7xA/X5kM/nwr0G2KBVuHm/cJhHYtqiWvdFO9fPoUG9niCKj
  231. touP+aL4djGb5UttupwXs/y783z5FXUUoYyqcjd0UmgwDxLB4Y9XayjPbN1Wt1P/76mwrrzobze2
  232. vqYfft15ePPliQbVvamgr1LzXXQ69EuD6PtMiHGLvu6EVOsWxH9+WRqQDw0ZVl+HDC+q1zLFPSq8
  233. qFLz1dBoooq6xznqS1jGuQ0XuWGY35qj/wdQSwMEFAAGAAgA0WoGQQnbwwXdBgAAUBsAABUAAAB3
  234. b3JkL3RoZW1lL3RoZW1lMS54bWztvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLs
  235. HWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/
  236. fnwfPyL+x7/3H3z8e7xblOllXjdFtfzso93xzkdpvpxWs2J58dlH6/Z8++CjtGmz5Swrq2X+2UfX
  237. efPR73H0OHvUzvNFntLby4Z+X+ze/+yjeduuHt2920zpq6wZL4ppXTXVeTueVou71fl5Mc3v8muL
  238. 8u7ezu7e3UVWLD9SGFnv/WqVL+m786peZC39WV/cndXZFWHG7+98qu8vswUh9iXDT98A/kcWwdOS
  239. /lm2DT6YlvXrKWPtv8FtZ2938aO5bk7KOr3Mys8+on5m1dWb/F37UVpmTUtffPbRDj8fpXePHt+1
  240. b5XtwMvei8/4MS/qG7O3e/xifTGxb+7v39//9Nj1sCc99BuePjj99PRTB5FbZNMpjXa31/j+k4dP
  241. nt43jb1W8msE+tMHT+/thi94PdzrvXB8H/+FL9xzL+z3Xnj27MQjpddKfr0focyDvZP98IX77oVP
  242. ey882Dl+uv8gfIFbzcti+bbXfOf+p/dO7JBtm/Oq/Ha0/cP7+88e7Jn2rtldj9MEwLId4rtF9tNV
  243. /Ywa8CxnbbFM2+tVfp5Nqd1JVhaTukifFxdzYsJVtqwa+nhnb+fZzj36F//t829ClexRnnmv62fT
  244. pv8ZUEqbaV2s2s8++g4B/shr8z/+fX/9//j3/a3pf/qH/G3/6R/yd/6nf+gf+p/+IX9j7LVvZ8sL
  245. /7X/9q/8k/+7P/8PSv+bv/Uv+m//tD994IXGf+E//xv+2P/s7/9TB1q2fsv/4s/4m/7Lv+1v+i/+
  246. rD/hv/5r/7RY++M6m/jt3xSLvElf5Ffpq2qBwUW6yCf1e77yZp4V/ivHy4smW2Z4Kdb8tJ0HzV9c
  247. Z2UWa/gkDwn5kzUpj2jLz9c/HSD9el6v2yLW8veaL4KWX1RV+aSq4wP7vbg7jxbr5cVA//Xab/gq
  248. yy6j3Z90pvp0vSL+L6JAT+Z5gOrLkmY/u8iXeZviu+ptnsfe+32KIqDvF8bapL9PkT7Jijhh3hST
  249. gLXcW98uFjRB11EcaeoDCn3xk+mTqox28DS/DJuSmGRlFGheBtT8PFu32SKOdbYo/abPs3YeRfT1
  250. dT0NCN+0NOkXeVmlp7O8aaIvfVlfByj/XqR3Bjjgi/J6ETat2+JttOnzrKr8pk+rtyfzbLGK410s
  251. 537js+YtcWyWvqzaOB5VKDP4myYkWw7P/E8WeTDzt5D4r0jxxpkF36zrqIzkVSij1+V5lgv4ux2F
  252. vyiWN2r/jt6//7Ou90nN/hd/3p8/oJb/36rxj+siLmRdPT/YsKvdT6p6Vvx/Q7k/zdbLlzkEKNL2
  253. R7r9/Ee63VfYPx90+6CU/2xodKfE78qbnuu/GPT8z4uyfN1el/nzhtV/Q0OcPaMP+Q9+yUYaqzn9
  254. avoLGl7UGf+e1lX73aKdv55nK+pnl7u4aBT2RZOuqoYsyEchcA84vijXiy+qmXS5u2sDXeoya90X
  255. ZILsF2SxWvn40wdeMGfR578uGh+H+wz39nj43YV43Ivh8cB+egMePL5vBpGHMUQOdjcictebHpLI
  256. NEO65f6+pheaaVbmM0yYAjDz/I3P+SBJw7HvxYb4cH/jEN9rzgM8fN4L8fCZcp7N8t7n3/CsP/Tm
  257. NkBxz/YYYPLg4Gdn1u/2FUa5DP9Kr0gK792nl6fZ6rOPzsmfpF8XKwLYQKFm5QUl+Kat0vtrqZtV
  258. 3bRPs2Yu7fgrpcGiaPM6LYsFcX4wG+XSobe79wBf/L8Xv4c7/6+k393ubOfn5/m0HfjE/UnfKZTo
  259. 1x/aGn9Ua8L79Xx2lU7Kdf0qI2rdf7ALKs6KprUknRW1x+iOlB0dppIZZOWcxGblap6puQnUvLTn
  260. 3y0+3kAY1e6wwr91NJOLZx0p+3rzfPNb+MLTpEO25YEQLKZPfvb8AA8vzyAEeN23eAXq76FVf4MG
  261. 5MNNhYee112A3j2G0kfP+zhE75v0GrwOHZt2EHTm4xu3E10evuu5ofxXb12kmvw0ycFTcm/XZdsI
  262. trTsUWcnJo2tqoE/NgrnXZuu6+Kzj37xzv3j/ZO9+yfbOwf3T7f37+3vbB/cP763fXz//r3d0/u7
  263. O0+f7P0SogwvEknvzygWKq+/kcWjyOJPWhBxfvGne88e3nv45NPth/eOn23vP31ysP3w5NMn208/
  264. PXnw9NnTk/sHD5/9ko/SS268f3zvZP/T04PtT3dPTrb3P90B+gcPtx/s7+0d7z84PjjdP/4lhtw0
  265. dPPTUJgRO/p/AFBLAwQUAAYACADRagZBjoxzCXABAAD0AQAAFAAAAHdvcmQvd2ViU2V0dGluZ3Mu
  266. eG1s7b0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM
  267. 7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8i/se/9x98/Hu8W5Tp
  268. ZV43RbX87KPd8c5Hab6cVrNiefHZR+v2fPvgo7Rps+UsK6tl/tlH13nz0e9x9Pjq0VU+eZ23LbVr
  269. UoKxbB4tpp99NG/b1aO7d5vpPF9kzbha5Uv68ryqF1lLf9YXdxdZ/Xa92p5Wi1XWFpOiLNrru3s7
  270. O59+pGDq20Cpzs+Laf60mq4X+bLl9+/WeUkQq2UzL1aNgXZ1G2hXVT1b1dU0bxoaz6IUeIusWFow
  271. u/s9QItiWldNdd6OaTCKEYOi13d3+LdF6QDcfz8AexbAYvro7GJZ1dmkpAkgTFIC9hHmoFq1xaL4
  272. Qf6sqp/U1VWT1+ldfJ6VZXX18sXn+OtuMFVH/w9QSwECLQAUAAYACAAAACEA0zAfLl4BAAAgBQAA
  273. EwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQAekRq3
  274. 7wAAAE4CAAALAAAAAAAAAAAAAAAAAI8BAABfcmVscy8ucmVsc1BLAQItABQABgAIANFqBkH8XP18
  275. 1gEAAAsDAAAQAAAAAAAAAAAAAAAAAKcCAABkb2NQcm9wcy9hcHAueG1sUEsBAi0AFAAGAAgA0WoG
  276. QVLD/UK6AQAAbwIAABEAAAAAAAAAAAAAAAAAqwQAAGRvY1Byb3BzL2NvcmUueG1sUEsBAi0AFAAG
  277. AAgAAAAhANZks1H0AAAAMQMAABwAAAAAAAAAAAAAAAAAlAYAAHdvcmQvX3JlbHMvZG9jdW1lbnQu
  278. eG1sLnJlbHNQSwECLQAUAAYACADRagZBeuUzdzMCAACQBQAAEQAAAAAAAAAAAAAAAADCBwAAd29y
  279. ZC9kb2N1bWVudC54bWxQSwECLQAUAAYACADRagZB3iZxVZoCAAAzBwAAEgAAAAAAAAAAAAAAAAAk
  280. CgAAd29yZC9mb250VGFibGUueG1sUEsBAi0AFAAEAAgA0WoGQYaCXUkdBAAAeQkAABEAAAAAAAAA
  281. AAAAAAAA7gwAAHdvcmQvc2V0dGluZ3MueG1sUEsBAi0AFAAEAAgA0WoGQSv37OFTEgAAFa0AAA8A
  282. AAAAAAAAAAAAAAAAOhEAAHdvcmQvc3R5bGVzLnhtbFBLAQItABQABgAIANFqBkEJ28MF3QYAAFAb
  283. AAAVAAAAAAAAAAAAAAAAALojAAB3b3JkL3RoZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACADRagZB
  284. joxzCXABAAD0AQAAFAAAAAAAAAAAAAAAAADKKgAAd29yZC93ZWJTZXR0aW5ncy54bWxQSwUGAAAA
  285. AAsACwDBAgAAbCwAAAAA";
  286. #endregion
  287. char[] base64CharArray = base64.Where(c => c != '\r' && c != '\n').ToArray();
  288. byte[] byteArray = System.Convert.FromBase64CharArray(base64CharArray, 0, base64CharArray.Length);
  289. memoryStream.Write(byteArray, 0, byteArray.Length);
  290. using (WordprocessingDocument defaultDotx = WordprocessingDocument.Open(memoryStream, true))
  291. {
  292. //Get the specified style from Default.dotx template for paragraph
  293. Style templateStyle = defaultDotx.MainDocumentPart.StyleDefinitionsPart.Styles.Elements<Style>().Where(s => s.StyleId == styleName && s.Type == StyleValues.Paragraph).FirstOrDefault();
  294. //Check if the style is proper style. Ex, Heading1, Heading2
  295. if (templateStyle == null)
  296. throw new OpenXmlPowerToolsException(String.Format("Add-DocxText: The specified style name {0} is unsupported, Please specify the valid style. Ex, Heading1, Heading2, Title", styleName));
  297. else
  298. part.Styles.Append((templateStyle.CloneNode(true)));
  299. }
  300. }
  301. }
  302. paragraph.ParagraphProperties = new ParagraphProperties(new ParagraphStyleId() { Val = styleName });
  303. }
  304. run.AppendChild(runProperties);
  305. run.AppendChild(new Text(strParagraph));
  306. if (sectionProperties != null)
  307. body.InsertBefore(paragraph, sectionProperties);
  308. else
  309. body.AppendChild(paragraph);
  310. }
  311. return streamDoc.GetModifiedWmlDocument();
  312. }
  313. }
  314. }
  315. public class HtmlConverterHelper
  316. {
  317. public static void ConvertToHtml(string file, string outputDirectory)
  318. {
  319. var fi = new FileInfo(file);
  320. byte[] byteArray = File.ReadAllBytes(fi.FullName);
  321. using (MemoryStream memoryStream = new MemoryStream())
  322. {
  323. memoryStream.Write(byteArray, 0, byteArray.Length);
  324. using (WordprocessingDocument wDoc = WordprocessingDocument.Open(memoryStream, true))
  325. {
  326. var destFileName = new FileInfo(fi.Name.Replace(".docx", ".html"));
  327. if (outputDirectory != null && outputDirectory != string.Empty)
  328. {
  329. DirectoryInfo di = new DirectoryInfo(outputDirectory);
  330. if (!di.Exists)
  331. {
  332. throw new OpenXmlPowerToolsException("Output directory does not exist");
  333. }
  334. destFileName = new FileInfo(Path.Combine(di.FullName, destFileName.Name));
  335. }
  336. var imageDirectoryName = destFileName.FullName.Substring(0, destFileName.FullName.Length - 5) + "_files";
  337. int imageCounter = 0;
  338. var pageTitle = (string)wDoc.CoreFilePropertiesPart.GetXDocument().Descendants(DC.title).FirstOrDefault();
  339. if (pageTitle == null)
  340. pageTitle = fi.FullName;
  341. WmlToHtmlConverterSettings settings = new WmlToHtmlConverterSettings()
  342. {
  343. PageTitle = pageTitle,
  344. FabricateCssClasses = true,
  345. CssClassPrefix = "pt-",
  346. RestrictToSupportedLanguages = false,
  347. RestrictToSupportedNumberingFormats = false,
  348. ImageHandler = imageInfo =>
  349. {
  350. DirectoryInfo localDirInfo = new DirectoryInfo(imageDirectoryName);
  351. if (!localDirInfo.Exists)
  352. localDirInfo.Create();
  353. ++imageCounter;
  354. string extension = imageInfo.ContentType.Split('/')[1].ToLower();
  355. ImageFormat imageFormat = null;
  356. if (extension == "png")
  357. {
  358. // Convert png to jpeg.
  359. extension = "gif";
  360. imageFormat = ImageFormat.Gif;
  361. }
  362. else if (extension == "gif")
  363. imageFormat = ImageFormat.Gif;
  364. else if (extension == "bmp")
  365. imageFormat = ImageFormat.Bmp;
  366. else if (extension == "jpeg")
  367. imageFormat = ImageFormat.Jpeg;
  368. else if (extension == "tiff")
  369. {
  370. // Convert tiff to gif.
  371. extension = "gif";
  372. imageFormat = ImageFormat.Gif;
  373. }
  374. else if (extension == "x-wmf")
  375. {
  376. extension = "wmf";
  377. imageFormat = ImageFormat.Wmf;
  378. }
  379. // If the image format isn't one that we expect, ignore it,
  380. // and don't return markup for the link.
  381. if (imageFormat == null)
  382. return null;
  383. string imageFileName = imageDirectoryName + "/image" +
  384. imageCounter.ToString() + "." + extension;
  385. try
  386. {
  387. imageInfo.Bitmap.Save(imageFileName, imageFormat);
  388. }
  389. catch (System.Runtime.InteropServices.ExternalException)
  390. {
  391. return null;
  392. }
  393. XElement img = new XElement(Xhtml.img,
  394. new XAttribute(NoNamespace.src, imageFileName),
  395. imageInfo.ImgStyleAttribute,
  396. imageInfo.AltText != null ?
  397. new XAttribute(NoNamespace.alt, imageInfo.AltText) : null);
  398. return img;
  399. }
  400. };
  401. XElement html = WmlToHtmlConverter.ConvertToHtml(wDoc, settings);
  402. // Note: the xhtml returned by ConvertToHtmlTransform contains objects of type
  403. // XEntity. PtOpenXmlUtil.cs define the XEntity class. See
  404. // http://blogs.msdn.com/ericwhite/archive/2010/01/21/writing-entity-references-using-linq-to-xml.aspx
  405. // for detailed explanation.
  406. //
  407. // If you further transform the XML tree returned by ConvertToHtmlTransform, you
  408. // must do it correctly, or entities will not be serialized properly.
  409. var htmlString = html.ToString(SaveOptions.DisableFormatting);
  410. File.WriteAllText(destFileName.FullName, htmlString, Encoding.UTF8);
  411. }
  412. }
  413. }
  414. }
  415. public class ValidationHelper
  416. {
  417. public static bool IsValid(string fileName, string officeVersion)
  418. {
  419. #if !NET35
  420. FileFormatVersions fileFormatVersion = FileFormatVersions.Office2013;
  421. #else
  422. FileFormatVersions fileFormatVersion = FileFormatVersions.Office2010;
  423. #endif
  424. try
  425. {
  426. fileFormatVersion = (FileFormatVersions)Enum.Parse(fileFormatVersion.GetType(), officeVersion);
  427. }
  428. catch (Exception)
  429. {
  430. #if !NET35
  431. fileFormatVersion = FileFormatVersions.Office2013;
  432. #else
  433. fileFormatVersion = FileFormatVersions.Office2010;
  434. #endif
  435. }
  436. FileInfo fi = new FileInfo(fileName);
  437. if (Util.IsWordprocessingML(fi.Extension))
  438. {
  439. using (WordprocessingDocument wDoc = WordprocessingDocument.Open(fileName, false))
  440. {
  441. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  442. var errors = validator.Validate(wDoc);
  443. bool valid = errors.Count() == 0;
  444. return valid;
  445. }
  446. }
  447. else if (Util.IsSpreadsheetML(fi.Extension))
  448. {
  449. using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(fileName, false))
  450. {
  451. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  452. var errors = validator.Validate(sDoc);
  453. bool valid = errors.Count() == 0;
  454. return valid;
  455. }
  456. }
  457. else if (Util.IsPresentationML(fi.Extension))
  458. {
  459. using (PresentationDocument pDoc = PresentationDocument.Open(fileName, false))
  460. {
  461. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  462. var errors = validator.Validate(pDoc);
  463. bool valid = errors.Count() == 0;
  464. return valid;
  465. }
  466. }
  467. return false;
  468. }
  469. public static IEnumerable<ValidationErrorInfo> GetOpenXmlValidationErrors(string fileName,
  470. string officeVersion)
  471. {
  472. #if !NET35
  473. FileFormatVersions fileFormatVersion = FileFormatVersions.Office2013;
  474. #else
  475. FileFormatVersions fileFormatVersion = FileFormatVersions.Office2010;
  476. #endif
  477. try
  478. {
  479. fileFormatVersion = (FileFormatVersions)Enum.Parse(fileFormatVersion.GetType(), officeVersion);
  480. }
  481. catch (Exception)
  482. {
  483. #if !NET35
  484. fileFormatVersion = FileFormatVersions.Office2013;
  485. #else
  486. fileFormatVersion = FileFormatVersions.Office2010;
  487. #endif
  488. }
  489. FileInfo fi = new FileInfo(fileName);
  490. if (Util.IsWordprocessingML(fi.Extension))
  491. {
  492. WmlDocument wml = new WmlDocument(fileName);
  493. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(wml))
  494. using (WordprocessingDocument wDoc = streamDoc.GetWordprocessingDocument())
  495. {
  496. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  497. var errors = validator.Validate(wDoc);
  498. return errors.ToList();
  499. }
  500. }
  501. else if (Util.IsSpreadsheetML(fi.Extension))
  502. {
  503. SmlDocument Sml = new SmlDocument(fileName);
  504. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Sml))
  505. using (SpreadsheetDocument wDoc = streamDoc.GetSpreadsheetDocument())
  506. {
  507. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  508. var errors = validator.Validate(wDoc);
  509. return errors.ToList();
  510. }
  511. }
  512. else if (Util.IsPresentationML(fi.Extension))
  513. {
  514. PmlDocument Pml = new PmlDocument(fileName);
  515. using (OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(Pml))
  516. using (PresentationDocument wDoc = streamDoc.GetPresentationDocument())
  517. {
  518. OpenXmlValidator validator = new OpenXmlValidator(fileFormatVersion);
  519. var errors = validator.Validate(wDoc);
  520. return errors.ToList();
  521. }
  522. }
  523. return Enumerable.Empty<ValidationErrorInfo>();
  524. }
  525. }
  526. public class DocxMetrics
  527. {
  528. public string FileName;
  529. public int ActiveX;
  530. public int AltChunk;
  531. public int AsciiCharCount;
  532. public int AsciiRunCount;
  533. public int AverageParagraphLength;
  534. public int ComplexField;
  535. public int ContentControlCount;
  536. public XmlDocument ContentControls;
  537. public int CSCharCount;
  538. public int CSRunCount;
  539. public bool DocumentProtection;
  540. public int EastAsiaCharCount;
  541. public int EastAsiaRunCount;
  542. public int ElementCount;
  543. public bool EmbeddedXlsx;
  544. public int HAnsiCharCount;
  545. public int HAnsiRunCount;
  546. public int Hyperlink;
  547. public bool InvalidSaveThroughXslt;
  548. public string Languages;
  549. public int LegacyFrame;
  550. public int MultiFontRun;
  551. public string NumberingFormatList;
  552. public int ReferenceToNullImage;
  553. public bool RevisionTracking;
  554. public int RunCount;
  555. public int SimpleField;
  556. public XmlDocument StyleHierarchy;
  557. public int SubDocument;
  558. public int Table;
  559. public int TextBox;
  560. public bool TrackRevisionsEnabled;
  561. public bool Valid;
  562. public int ZeroLengthText;
  563. }
  564. public static class GetMetricsHelper
  565. {
  566. public static DocxMetrics GetDocxMetrics(string fileName)
  567. {
  568. WmlDocument wmlDoc = new WmlDocument(fileName);
  569. MetricsGetterSettings settings = new MetricsGetterSettings();
  570. settings.IncludeTextInContentControls = false;
  571. settings.IncludeXlsxTableCellData = false;
  572. var metricsXml = MetricsGetter.GetDocxMetrics(wmlDoc, settings);
  573. DocxMetrics metrics = new DocxMetrics();
  574. metrics.FileName = wmlDoc.FileName;
  575. metrics.StyleHierarchy = GetXmlDocumentForMetrics(metricsXml, H.StyleHierarchy);
  576. metrics.ContentControls = GetXmlDocumentForMetrics(metricsXml, H.Parts);
  577. metrics.TextBox = GetIntForMetrics(metricsXml, H.TextBox);
  578. metrics.ContentControlCount = GetIntForMetrics(metricsXml, H.ContentControl);
  579. metrics.ComplexField = GetIntForMetrics(metricsXml, H.ComplexField);
  580. metrics.SimpleField = GetIntForMetrics(metricsXml, H.SimpleField);
  581. metrics.AltChunk = GetIntForMetrics(metricsXml, H.AltChunk);
  582. metrics.Table = GetIntForMetrics(metricsXml, H.Table);
  583. metrics.Hyperlink = GetIntForMetrics(metricsXml, H.Hyperlink);
  584. metrics.LegacyFrame = GetIntForMetrics(metricsXml, H.LegacyFrame);
  585. metrics.ActiveX = GetIntForMetrics(metricsXml, H.ActiveX);
  586. metrics.SubDocument = GetIntForMetrics(metricsXml, H.SubDocument);
  587. metrics.ReferenceToNullImage = GetIntForMetrics(metricsXml, H.ReferenceToNullImage);
  588. metrics.ElementCount = GetIntForMetrics(metricsXml, H.ElementCount);
  589. metrics.AverageParagraphLength = GetIntForMetrics(metricsXml, H.AverageParagraphLength);
  590. metrics.RunCount = GetIntForMetrics(metricsXml, H.RunCount);
  591. metrics.ZeroLengthText = GetIntForMetrics(metricsXml, H.ZeroLengthText);
  592. metrics.MultiFontRun = GetIntForMetrics(metricsXml, H.MultiFontRun);
  593. metrics.AsciiCharCount = GetIntForMetrics(metricsXml, H.AsciiCharCount);
  594. metrics.CSCharCount = GetIntForMetrics(metricsXml, H.CSCharCount);
  595. metrics.EastAsiaCharCount = GetIntForMetrics(metricsXml, H.EastAsiaCharCount);
  596. metrics.HAnsiCharCount = GetIntForMetrics(metricsXml, H.HAnsiCharCount);
  597. metrics.AsciiRunCount = GetIntForMetrics(metricsXml, H.AsciiRunCount);
  598. metrics.CSRunCount = GetIntForMetrics(metricsXml, H.CSRunCount);
  599. metrics.EastAsiaRunCount = GetIntForMetrics(metricsXml, H.EastAsiaRunCount);
  600. metrics.HAnsiRunCount = GetIntForMetrics(metricsXml, H.HAnsiRunCount);
  601. metrics.RevisionTracking = GetBoolForMetrics(metricsXml, H.RevisionTracking);
  602. metrics.EmbeddedXlsx = GetBoolForMetrics(metricsXml, H.EmbeddedXlsx);
  603. metrics.InvalidSaveThroughXslt = GetBoolForMetrics(metricsXml, H.InvalidSaveThroughXslt);
  604. metrics.TrackRevisionsEnabled = GetBoolForMetrics(metricsXml, H.TrackRevisionsEnabled);
  605. metrics.DocumentProtection = GetBoolForMetrics(metricsXml, H.DocumentProtection);
  606. metrics.Valid = GetBoolForMetrics(metricsXml, H.Valid);
  607. metrics.Languages = GetStringForMetrics(metricsXml, H.Languages);
  608. metrics.NumberingFormatList = GetStringForMetrics(metricsXml, H.NumberingFormatList);
  609. return metrics;
  610. }
  611. private static string GetStringForMetrics(XElement metricsXml, XName xName)
  612. {
  613. var ele = metricsXml.Element(xName);
  614. if (ele == null)
  615. return "";
  616. return (string)ele.Attribute(H.Val);
  617. }
  618. private static bool GetBoolForMetrics(XElement metricsXml, XName xName)
  619. {
  620. var ele = metricsXml.Element(xName);
  621. if (ele == null)
  622. return false;
  623. return (bool)ele.Attribute(H.Val);
  624. }
  625. private static int GetIntForMetrics(XElement metricsXml, XName xName)
  626. {
  627. var ele = metricsXml.Element(xName);
  628. if (ele == null)
  629. return 0;
  630. return (int)ele.Attribute(H.Val);
  631. }
  632. private static XmlDocument GetXmlDocumentForMetrics(XElement metricsXml, XName xName)
  633. {
  634. var ele = metricsXml.Element(xName);
  635. if (ele == null)
  636. return null;
  637. return (new XDocument(metricsXml.Element(xName))).GetXmlDocument();
  638. }
  639. }
  640. }