Program.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. using Syncfusion.DocIO.DLS;
  2. using System;
  3. using System.Drawing;
  4. using System.Drawing.Imaging;
  5. using System.Drawing.Text;
  6. using System.IO;
  7. using System.Linq;
  8. using Vinno.vCloud.ReportGenerator;
  9. using Vinno.vCloud.Protocol.Initializers;
  10. using Vinno.vCloud.Report.Models;
  11. using PdfSharp.Pdf;
  12. using PdfSharp.Drawing;
  13. namespace ReportConverter
  14. {
  15. class Program
  16. {
  17. private static string _language = string.Empty;
  18. /// <summary>
  19. /// main function
  20. /// </summary>
  21. /// <param name="args">
  22. /// 0:"AddReportServer" 1:jsonPath 2:outFolder 3:StorageUrl 4:StorageType
  23. /// 1:"Share" 1:jsonPath 2:language 3:StorageUrl 4:StorageType
  24. /// 2:"PackagingPdf" 1:jsonPath 2:language 3:StorageUrl 4:StorageType
  25. /// </param>
  26. static void Main(string[] args)
  27. {
  28. if (args == null || args.Length < 2) return;
  29. try
  30. {
  31. new InitializeLanguage();
  32. ClientTagsInitializer.Initialize();
  33. if (string.IsNullOrEmpty(args[0])) return;
  34. if (args[0].Equals("AddReportServer"))
  35. {
  36. ReportInfo ri = ReportJsonSerializer.DeSerialize($"{args[1]}.json");
  37. //get image from stroge server
  38. new GetReportInfo(args[3], GetStorageType(args)).GetReportInfoAsync(ri).Wait(60000);
  39. //translate gender
  40. new GenderTranslater().TranslateGender(ri);
  41. var wordDocument = ReportWordDocumentManager.GetGenerateWordDocument(ri);
  42. if (wordDocument != null)
  43. {
  44. Image[] images = ((ReportWordDocument)wordDocument).RenderAsImages(ImageType.Bitmap);
  45. string imagePath = string.Empty;
  46. for (int i = 0; i < images.Length; i++)
  47. {
  48. imagePath = Path.Combine(args[2], $"{i}.jpg");
  49. images[i]?.Save(imagePath, ImageFormat.Jpeg);
  50. Console.WriteLine(imagePath);
  51. }
  52. //Closes the document
  53. ((ReportWordDocument)wordDocument).Close();
  54. }
  55. }
  56. else if (args[0].Equals("Share"))
  57. {
  58. _language = args[2]?.ToLower() ?? string.Empty;
  59. ReportInfo ri = ReportJsonSerializer.DeSerialize($"{args[1]}.json");
  60. #region set default tmplate
  61. if (ri.Template == null)
  62. {
  63. string tmpPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DefaultReportTemplate", "Default_en.json");
  64. if (_language.StartsWith("zh"))
  65. {
  66. tmpPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DefaultReportTemplate", "Default.json");
  67. }
  68. ri.Template = new ReportTemplateJsonSerializer().DeSerializeJson(File.ReadAllText(tmpPath));
  69. }
  70. #endregion
  71. //get image from stroge server
  72. new GetReportInfo(args[3], GetStorageType(args)).GetReportInfoAsync(ri).Wait(60000);
  73. //translate gender
  74. new GenderTranslater().TranslateGender(ri);
  75. #region write images
  76. if (args.Length > 5)
  77. {
  78. var scaleRatio = Convert.ToSingle(args[5]);
  79. ScaleTemplateSizeDouble(ri.Template, scaleRatio);
  80. }
  81. var wordDocument = ReportWordDocumentManager.GetGenerateWordDocument(ri);
  82. if (wordDocument != null)
  83. {
  84. Image[] images = ((ReportWordDocument)wordDocument).RenderAsImages(ImageType.Bitmap);
  85. string imagePath = string.Empty;
  86. for (int i = 0; i < images.Length; i++)
  87. {
  88. imagePath = $"{args[1]}_{i}.jpg";
  89. images[i]?.Save(imagePath, ImageFormat.Jpeg);
  90. Console.WriteLine(imagePath);
  91. }
  92. //Closes the document
  93. ((ReportWordDocument)wordDocument).Close();
  94. }
  95. #endregion
  96. }
  97. else if (args[0].Equals("Packaging"))
  98. {
  99. if (File.Exists($"{args[1]}.pdf")) { return; }
  100. ReportInfo ri = ReportJsonSerializer.DeSerialize($"{args[1]}.json");
  101. //get image from stroge server
  102. new GetReportInfo(args[3], GetStorageType(args)).GetReportInfoAsync(ri).Wait(60000);
  103. //translate gender
  104. new GenderTranslater().TranslateGender(ri);
  105. using (var wordDocument = ReportWordDocumentManager.GetGenerateWordDocument(ri))
  106. {
  107. if (wordDocument != null)
  108. {
  109. Image[] images = ((ReportWordDocument)wordDocument).RenderAsImages(ImageType.Bitmap);
  110. string imagePath = string.Empty;
  111. using (PdfDocument doc = new PdfDocument())
  112. {
  113. for (int i = 0; i < images.Length; i++)
  114. {
  115. using (var imageStream = ImageToByteArray(images[i]))
  116. {
  117. using (XImage img = XImage.FromStream(imageStream))
  118. {
  119. var newPage = new PdfPage();
  120. newPage.Height = new XUnit(img.PointHeight);
  121. newPage.Width = new XUnit(img.PointWidth);
  122. doc.Pages.Add(newPage);
  123. using (XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[i]))
  124. {
  125. xgr.DrawImage(img, 0, 0);
  126. }
  127. }
  128. }
  129. }
  130. doc.Save(Path.Combine(args[2], $"{args[1]}.pdf"));
  131. }
  132. }
  133. }
  134. }
  135. }
  136. catch (Exception e)
  137. {
  138. string errPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Error");
  139. if (!Directory.Exists(errPath)) Directory.CreateDirectory(errPath);
  140. File.AppendAllText(Path.Combine(errPath, $"{DateTime.Now.ToString("yyyyMMdd_HHmmss") + Guid.NewGuid().ToString("N")}.log"), e.ToString());
  141. }
  142. }
  143. private static Stream ImageToByteArray(Image img)
  144. {
  145. var ms = new MemoryStream();
  146. img.Save(ms, ImageFormat.Jpeg);
  147. return ms;
  148. }
  149. private static void ScaleTemplateSizeDouble(Vinno.vCloud.Report.Interfaces.IReportTemplateDocument template, float scaleRatio)
  150. {
  151. template.PageSize = new Vinno.vCloud.Report.Interfaces.RTPageSize(template.PageSize.Width * scaleRatio, template.PageSize.Height * scaleRatio);
  152. ScaleRTThicknessDouble(template.PagePadding, scaleRatio);
  153. template.HeaderDistance *= scaleRatio;
  154. template.FooterDistance *= scaleRatio;
  155. ScaleElementSizeDouble(template.Blocks, scaleRatio);
  156. ScaleElementSizeDouble(template.Header, scaleRatio);
  157. ScaleElementSizeDouble(template.Footer, scaleRatio);
  158. }
  159. private static void ScaleElementSizeDouble(System.Collections.Generic.IReadOnlyList<Vinno.vCloud.Report.Interfaces.IElement> elements, float scaleRatio)
  160. {
  161. foreach (var element in elements)
  162. {
  163. ScaleRTThicknessDouble(element.Margin, scaleRatio);
  164. if (element is InputImageList iptImgElement)
  165. {
  166. iptImgElement.ImageWidth *= scaleRatio;
  167. iptImgElement.ImageHeight *= scaleRatio;
  168. }
  169. else if (element is Vinno.vCloud.Report.Interfaces.ITextElement txtElement)
  170. {
  171. txtElement.LineWidth *= scaleRatio;
  172. txtElement.FontSize *= scaleRatio;
  173. }
  174. else if (element is Vinno.vCloud.Report.Interfaces.IImage imageEle)
  175. {
  176. imageEle.Width *= scaleRatio;
  177. imageEle.Height *= scaleRatio;
  178. }
  179. else if (element is Vinno.vCloud.Report.Interfaces.ILine lineEle)
  180. {
  181. lineEle.Width *= scaleRatio;
  182. }
  183. else if (element is Vinno.vCloud.Report.Interfaces.IGrid gridEle)
  184. {
  185. foreach (var item in gridEle.ColumnDefinitions)
  186. {
  187. item.Width *= scaleRatio;
  188. }
  189. foreach (var item in gridEle.RowDefinitions)
  190. {
  191. item.Height *= scaleRatio;
  192. }
  193. foreach (var item in gridEle.Cells.Values)
  194. {
  195. item.Borders.Left.Thickness *= scaleRatio;
  196. ScaleRTThicknessDouble(item.Margin, scaleRatio);
  197. ScaleElementSizeDouble(item.Blocks, scaleRatio);
  198. }
  199. }
  200. else if (element is Vinno.vCloud.Report.Interfaces.IBlockElement blockEle)
  201. {
  202. ScaleElementSizeDouble(blockEle.Elements, scaleRatio);
  203. }
  204. }
  205. }
  206. private static void ScaleRTThicknessDouble(Vinno.vCloud.Report.Interfaces.RTThickness thickness, float scaleRatio)
  207. {
  208. thickness.Left *= scaleRatio;
  209. thickness.Right *= scaleRatio;
  210. thickness.Top *= scaleRatio;
  211. thickness.Bottom *= scaleRatio;
  212. }
  213. /// <summary>
  214. /// 获取StorageType类型:0.默认服务器,1.Ufile服务器
  215. /// </summary>
  216. /// <param name="args"></param>
  217. /// <returns></returns>
  218. private static int GetStorageType(string[] args)
  219. {
  220. int storageType = 0;
  221. if (args.Length >= 4)
  222. {
  223. var param = args[4];
  224. int.TryParse(param, out storageType);
  225. }
  226. return storageType;
  227. }
  228. private static string GetFont(string fontName)
  229. {
  230. var fontCollection = new InstalledFontCollection();
  231. var fontFamilies = fontCollection.Families.Where(f => !string.IsNullOrEmpty(f.Name)).ToList();
  232. var fontFamily =
  233. fontFamilies.FirstOrDefault(f => f.GetName(2052) == fontName || f.GetName(1033) == fontName);
  234. if (fontFamily == null)
  235. {
  236. return fontFamilies.FirstOrDefault(a => a.GetName(1033) == "Microsoft YaHei")?.Name;
  237. }
  238. return fontFamily.Name;
  239. }
  240. }
  241. }