FormMain.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using Newtonsoft.Json;
  2. using StackExchange.Redis;
  3. using System.Reflection;
  4. using WebSupergoo.ABCpdf11;
  5. using static PDFMonitor_SVG.Entities;
  6. namespace PDFMonitor_SVG {
  7. public partial class FormMain : Form {
  8. private ConnectionMultiplexer? redisClient;
  9. private string? redisServerUrl;
  10. private string? redisServerPwd;
  11. private string? redisTaskKey;
  12. //生成的PDF文件目录
  13. private string? completedPDFPath;
  14. //private FixedThreadPool threadPool;
  15. private SynchronizationContext context;
  16. public FormMain() {
  17. InitializeComponent();
  18. ReadServerConfig();
  19. try {
  20. redisClient = ConnectionMultiplexer.Connect(redisServerUrl + ",password=" + redisServerPwd);
  21. memoLog.Items.Add("redis连接成功");
  22. }
  23. catch (Exception ex) {
  24. memoLog.Items.Add("redis连接失败,请检查程序设置");
  25. memoLog.Items.Add(ex.Message);
  26. }
  27. //threadPool = new FixedThreadPool(8); //默认8个线程
  28. ThreadPool.SetMinThreads(4, 4);
  29. ThreadPool.SetMaxThreads(8, 8);
  30. // 获取当前的SynchronizationContext
  31. context = SynchronizationContext.Current;
  32. WebSupergoo.ABCpdf11.XSettings.InstallLicense("X/VKS0cMn8tAun4hGNvFONyWaelyItt2pqrH5srEKm4brmiSKC69N5FsGmRijGFheK9mhXoi/HVdi/VrNv0Vv1RyfQWQCg==");
  33. }
  34. ~FormMain() {
  35. redisClient?.Dispose();
  36. //threadPool.Shutdown();
  37. }
  38. private void ReadServerConfig() {
  39. string iniPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\PDFMonitor_SVG.ini";
  40. IniFile ini = new(iniPath);
  41. redisServerUrl = ini.Read("redis", "redisServerUrl", "127.0.0.1:6379");
  42. redisServerPwd = ini.Read("redis", "redisServerPwd", "Admin@dounengyin@123");
  43. redisTaskKey = ini.Read("redis", "redisTaskKey", "sdtool:mall:designer:svg:task:list:1000");
  44. completedPDFPath = ini.Read("path", "completedPDFPath", "D:\\testPdfOut\\");
  45. if (!Directory.Exists(completedPDFPath)) {
  46. Directory.CreateDirectory(completedPDFPath);
  47. }
  48. }
  49. private void TimerGetTask_Tick(object sender, EventArgs e) {
  50. RedisValue taskInfo = redisClient.GetDatabase().ListLeftPop(redisTaskKey);
  51. if (!taskInfo.IsNullOrEmpty) {
  52. // 有任务了,干活
  53. SVGTaskInfo svgTaskInfo = JsonConvert.DeserializeObject<SVGTaskInfo>(taskInfo);
  54. if (svgTaskInfo == null) return;
  55. memoLog.Items.Add("获取任务[" + svgTaskInfo.SvgFileName + "]成功");
  56. //todo
  57. //threadPool.Execute(() => {
  58. // doConvertTask(svgTaskInfo);
  59. //});
  60. ThreadPool.QueueUserWorkItem(new WaitCallback(doConvertTask), svgTaskInfo);
  61. }
  62. }
  63. private void doConvertTask(object state) {
  64. SVGTaskInfo svgTaskInfo = (SVGTaskInfo)state;
  65. context.Post(_ => { memoLog.Items.Add("任务[" + svgTaskInfo.SvgFileName + "]开始"); }, null);
  66. //传过来的是px,转成mm
  67. int fileWidth = px2mm(double.Parse(svgTaskInfo.Width));
  68. int fileHeight = px2mm(double.Parse(svgTaskInfo.Height));
  69. int fileWidthPx = (int)Math.Ceiling(double.Parse(svgTaskInfo.Width));
  70. Doc doc = new Doc();
  71. doc.Units = UnitType.Mm;
  72. //doc.MediaBox.Top = 0;
  73. //doc.MediaBox.Left = 0;
  74. //doc.MediaBox.Right = fileWidth;
  75. //doc.MediaBox.Bottom = fileHeight;
  76. string mediaBoxStr = "0 0 " + fileWidth + " " + fileHeight;
  77. doc.MediaBox.String = mediaBoxStr;
  78. doc.MediaBox.Pin = XRect.Corner.TopLeft;
  79. doc.Rect.String = doc.MediaBox.String;
  80. doc.Rect.Pin = XRect.Corner.TopLeft;
  81. doc.HtmlOptions.Media = MediaType.Print;
  82. string convertedFileName = Path.ChangeExtension(svgTaskInfo.SvgFileName, ".pdf");
  83. string convertedFilePath = completedPDFPath + convertedFileName;
  84. doc.AddImageUrl(svgTaskInfo.SvgPath, true, fileWidthPx, true);
  85. doc.Save(convertedFilePath);
  86. doc.Clear();
  87. doc.Dispose();
  88. context.Post(_ => { memoLog.Items.Add("任务[" + svgTaskInfo.SvgFileName + "]完成"); }, null);
  89. }
  90. private void btnStartService_Click(object sender, EventArgs e) {
  91. if (redisClient == null) {
  92. memoLog.Items.Add("redis客户端未连接,请修正程序设置后重启");
  93. return;
  94. }
  95. memoLog.Items.Add("服务已启动");
  96. timerGetTask.Start();
  97. }
  98. private void btnStopService_Click(object sender, EventArgs e) {
  99. timerGetTask.Stop();
  100. memoLog.Items.Add("服务已停止");
  101. }
  102. }
  103. }