using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TEAMModelOS.SDK.DI; using TEAMModelOS.SDK.Extension; namespace TEAMModelOS.SDK.Models.Service { public class GenPDFService { /// /// https://github.com/wuxue107/bookjs-eazy https://github.com/wuxue107/screenshot-api-server /// /// /// /// /// public async Task AddGenPdfQueue(AzureServiceBusFactory azureServiceBus , AzureRedisFactory azureRedis, GenPDFData data) { long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); List genRedis = new List(); List dbgenRedis = new List(); HashEntry[] datas = await azureRedis.GetRedisClient(8).HashGetAllAsync($"PDFGen:{data.sessionId}"); if (datas!= null && datas.Length > 0) { foreach (var item in datas) { dbgenRedis.Add(item.Value.ToString().ToObject()); } } int countProcess= 0; foreach (var item in data.datas) { var dbData = dbgenRedis.Find(x => x.id.Equals(item.id)); if (dbData!=null) { if (dbData.status==0|| dbData.status==1) { //不变的 countProcess+=1; } else { //需要变更的 dbData.status = 0; dbData.cost=0; dbData.join= now; dbData.wait=0; genRedis.Add(dbData); } } else { genRedis.Add(new PDFGenRedis { id = item.id, status=0, cost=0, wait=0, join=now }); } } //过期时间 当前个数+ reddis的个数 foreach (var item in genRedis) { countProcess+=1; await azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{data.sessionId}", item.id, item.ToJsonString()); } long expire = (data.delay+data.timeout) * countProcess ; var tiemSpan = TimeSpan.FromMilliseconds(expire); await azureRedis.GetRedisClient(8).KeyExpireAsync($"PDFGen:{data.sessionId}", tiemSpan); return null; } } public class GenPDFData { public string pageUrl { get; set; } public long timeout { get; set; } = 30000; public long delay { get; set; } = 2000; public string orientation { get; set; } public string pageSize { get; set; } public string pageWidth { get; set; } public string pageHeight { get; set; } /// /// 生成会话id, 活动id /// public string sessionId { get; set; } public List datas { get; set; } = new List(); } public record PDFData{ /// /// 学生id /// public string id { get; set; } /// /// 数据链接 /// public string url { get; set; } } /// /// redis 存储数据,超时时间设置为status=0 的count timeout* count+ delay*count /// public record PDFGenRedis { /// /// 学生id /// public string id { get; set; } /// /// 0 未执行,1 执行中,2 执行成功,3 执行失败,4超时,5 取消 /// public int status { get; set; } = 0; /// /// 执行生成 毫秒 /// public long cost { get; set;} /// /// 等候时间 /// public long wait { get; set;} /// /// 加入时间 /// public long join { get; set; } } /// /// // 拼接上接口的前缀 http://localhost:3000/ 就是完整PDF地址 // http://localhost:3000/pdf/1614458263411-glduu.pdf // 拼接上接口的前缀 http://localhost:3000/download/可以就可生成在浏览器上的下载链接 // http://localhost:3000/download/pdf/1614458263411-glduu.pdf // 拼接上http://localhost:3000/static/js/pdfjs/web/viewer.html?file=/pdf/1614458263411-glduu.pdf // 可使用pdfjs库进行预览 // //## -e MAX_BROWSER=[num] 环境变量可选,最大的puppeteer实例数,忽略选项则默认值:1 , 值auto:[可用内存]/200M //## -e PDF_KEEP_DAY=[num] 自动删除num天之前产生的文件目录,默认0: 不删除文件 //docker run -p 13000:3000 -td --rm -e MAX_BROWSER=2 -e PDF_KEEP_DAY=1 -v ${PWD}:/screenshot-api-server/public --name=screenshot-api-server wuxue107/screenshot-api-server /// public record PDFGenQueue { /// /// 学生id /// public string id { get; set; } /// /// 数据装载后的页面 要制作为PDF的网页 (pageUrl 、html 参数二选一) /// public string pageUrl { get; set; } /// /// 要截图的网页HTML (pageUrl 、html 参数二选一) "html" : "
bookjs-eazy
", ///
public string html { get; set; } /// /// 超时时间 /// public long timeout { get; set; } = 30000; /// /// 页面完成后(checkPageCompleteJs返回为true后)延迟的时间,可选,默认:0 /// public long delay { get; set; } = 2000; /// /// // 检查页面是否渲染完成的js表达式,可选,默认: "true" /// public bool checkPageCompleteJs { get; set; } /// /// 生成会话id, 活动id /// public string sessionId { get; set; } } }