|
@@ -8,7 +8,9 @@ import (
|
|
|
"eta/eta_mobile/utils"
|
|
|
"fmt"
|
|
|
"html"
|
|
|
+ "os"
|
|
|
"os/exec"
|
|
|
+ "path"
|
|
|
"strconv"
|
|
|
"time"
|
|
|
)
|
|
@@ -136,48 +138,55 @@ func ReportToPdf(reportUrl, filePath string) (err error) {
|
|
|
import asyncio
|
|
|
from pyppeteer import launch
|
|
|
|
|
|
-async def main():
|
|
|
-
|
|
|
- browser = await launch({
|
|
|
+@asyncio.coroutine
|
|
|
+def main():
|
|
|
+ # 异步代码
|
|
|
+ browser = yield from launch({
|
|
|
'executablePath': '%s',
|
|
|
- 'headless': True
|
|
|
+ 'headless': True,
|
|
|
+ 'args': ['--disable-infobars', '--no-sandbox']
|
|
|
})
|
|
|
- page = await browser.newPage()
|
|
|
- await page.setViewport({
|
|
|
+ page = yield from browser.newPage()
|
|
|
+ yield from page.setViewport({
|
|
|
'width': 1920,
|
|
|
'height': 1080,
|
|
|
})
|
|
|
- # 对于大的PDF生成,可能会时间很久,这里规定不会进行超时处理
|
|
|
- # await page.setDefaultNavigationTimeout(0)
|
|
|
- # 不再有网络连接时触发
|
|
|
- await page.goto('%s',{
|
|
|
- 'waitUntil':'networkidle0'
|
|
|
+ yield from page.goto('%s', {
|
|
|
+ 'waitUntil': 'networkidle0',
|
|
|
+ 'timeout': 1000000 # 设置超时时间为 100 秒
|
|
|
})
|
|
|
-
|
|
|
-
|
|
|
- await page.pdf({
|
|
|
+ yield from page.pdf({
|
|
|
'path': "%s",
|
|
|
'printBackground': True,
|
|
|
'format': "A2",
|
|
|
- 'displayHeaderFooter':True,
|
|
|
- # 'headerTemplate':'<div></div>',
|
|
|
- # 'footerTemplate':"<div style='width:100%;text-align:center;font-size:16px'><span class='pageNumber''></span></div>",
|
|
|
'margin': {
|
|
|
- 'top': 100,
|
|
|
- 'bottom': 100,
|
|
|
- 'left':0,
|
|
|
- 'right':0
|
|
|
+ 'top': '10mm',
|
|
|
+ 'bottom': '10mm',
|
|
|
+ 'left': '10mm',
|
|
|
+ 'right': '10mm'
|
|
|
}
|
|
|
})
|
|
|
- await browser.close()
|
|
|
+ yield from browser.close()
|
|
|
|
|
|
-asyncio.run(main())
|
|
|
-`
|
|
|
+# 创建事件循环
|
|
|
+loop = asyncio.get_event_loop()
|
|
|
|
|
|
- pyCode = fmt.Sprintf(pyCode, utils.ChromeDrivePath, reportUrl, filePath)
|
|
|
+# 使用事件循环运行main函数
|
|
|
+try:
|
|
|
+ loop.run_until_complete(main())
|
|
|
+finally:
|
|
|
+ # 关闭事件循环
|
|
|
+ loop.close()
|
|
|
+`
|
|
|
|
|
|
+ pyCode = fmt.Sprintf(pyCode, utils.ChromePath, reportUrl, filePath)
|
|
|
+ utils.FileLog.Info("pdf pyCode: \n" + pyCode)
|
|
|
cmd := exec.Command("python3", "-c", pyCode)
|
|
|
_, err = cmd.CombinedOutput()
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
|
|
|
+ go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
|
|
|
+ }
|
|
|
defer func() {
|
|
|
cmd.Process.Kill()
|
|
|
}()
|
|
@@ -187,45 +196,204 @@ asyncio.run(main())
|
|
|
func ReportToJpeg(reportUrl, filePath string) (err error) {
|
|
|
pyCode := `
|
|
|
import asyncio
|
|
|
-from pyppeteer import launch
|
|
|
+from pyppeteer import launch, errors
|
|
|
|
|
|
async def main():
|
|
|
-
|
|
|
- browser = await launch({
|
|
|
- 'executablePath': '%s',
|
|
|
- 'headless': True
|
|
|
- })
|
|
|
- page = await browser.newPage()
|
|
|
- await page.setViewport({
|
|
|
- 'width': 1920,
|
|
|
- 'height': 1080,
|
|
|
- })
|
|
|
- # 对于大的PDF生成,可能会时间很久,这里规定不会进行超时处理
|
|
|
- # await page.setDefaultNavigationTimeout(0)
|
|
|
- # 不再有网络连接时触发
|
|
|
- await page.goto('%s',{
|
|
|
- 'waitUntil':'networkidle0'
|
|
|
- })
|
|
|
- # Customizing footer for page numbers starting from page 2
|
|
|
+ try:
|
|
|
+ # 启动浏览器
|
|
|
+ browser = await launch({
|
|
|
+ 'executablePath': '%s',
|
|
|
+ 'headless': True,
|
|
|
+ 'args': ['--disable-infobars', '--no-sandbox']
|
|
|
+ })
|
|
|
+
|
|
|
+ # 新建页面
|
|
|
+ page = await browser.newPage()
|
|
|
+
|
|
|
+ # 设置视口大小
|
|
|
+ await page.setViewport({
|
|
|
+ 'width': 1920,
|
|
|
+ 'height': 1080
|
|
|
+ })
|
|
|
+
|
|
|
+ # 导航到页面
|
|
|
+ await page.goto('%s', {
|
|
|
+ 'waitUntil': 'networkidle0',
|
|
|
+ 'timeout': 1000000 # 设置超时时间为 100 秒
|
|
|
+ })
|
|
|
+
|
|
|
+ # 截取全页面的屏幕截图
|
|
|
+ await page.screenshot({
|
|
|
+ 'path': "%s",
|
|
|
+ 'fullPage': True,
|
|
|
+ })
|
|
|
+
|
|
|
+ except errors.BrowserError as e:
|
|
|
+ print('Browser closed unexpectedly:', e)
|
|
|
+ except Exception as e:
|
|
|
+ print('An error occurred:', e)
|
|
|
+ finally:
|
|
|
+ # 确保浏览器关闭
|
|
|
+ if browser is not None:
|
|
|
+ await browser.close()
|
|
|
|
|
|
- await page.screenshot({
|
|
|
- 'path': "%s",
|
|
|
- 'type': "jpeg",
|
|
|
- 'fullPage': True,
|
|
|
- })
|
|
|
- await browser.close()
|
|
|
+# 获取当前事件循环
|
|
|
+loop = asyncio.get_event_loop()
|
|
|
|
|
|
-asyncio.run(main())
|
|
|
+# 运行事件循环直到main协程完成
|
|
|
+try:
|
|
|
+ loop.run_until_complete(main())
|
|
|
+except Exception as e:
|
|
|
+ print('Error during event loop execution:', e)
|
|
|
+finally:
|
|
|
+ # 关闭事件循环
|
|
|
+ loop.close()
|
|
|
`
|
|
|
|
|
|
- pyCode = fmt.Sprintf(pyCode, utils.ChromeDrivePath, reportUrl, filePath)
|
|
|
-
|
|
|
+ pyCode = fmt.Sprintf(pyCode, utils.ChromePath, reportUrl, filePath)
|
|
|
+ utils.FileLog.Info("jpeg pyCode: \n" + pyCode)
|
|
|
cmd := exec.Command("python3", "-c", pyCode)
|
|
|
|
|
|
_, err = cmd.CombinedOutput()
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
|
|
|
+ go alarm_msg.SendAlarmMsg("ReportToJpeg failed:"+err.Error(), 3)
|
|
|
+ }
|
|
|
defer func() {
|
|
|
cmd.Process.Kill()
|
|
|
}()
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+func Report2pdfAndJpeg(reportUrl string, reportId,reportType int) {
|
|
|
+ var err error
|
|
|
+
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ go alarm_msg.SendAlarmMsg("Report2pdfAndJpeg failed:"+err.Error(), 3)
|
|
|
+ utils.FileLog.Info("Report2pdfAndJpeg failed: , error: \n" + err.Error())
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ reportCode := utils.MD5(strconv.Itoa(reportId))
|
|
|
+
|
|
|
+ pdfPath := `./static/` + reportCode + ".pdf"
|
|
|
+ jpegPath := `./static/` + reportCode + ".jpeg"
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ err := ReportToPdf(reportUrl, pdfPath)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
|
|
|
+ go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
|
|
|
+ }
|
|
|
+
|
|
|
+ file, err := os.Open(pdfPath)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("Open failed: , error: \n" + err.Error())
|
|
|
+ go alarm_msg.SendAlarmMsg("Open failed:"+err.Error(), 3)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ ext := path.Ext(file.Name())
|
|
|
+
|
|
|
+ randStr := utils.GetRandStringNoSpecialChar(28)
|
|
|
+ fileName := randStr + ext
|
|
|
+ defer file.Close() //关闭上传文件
|
|
|
+
|
|
|
+ resourceUrl := ``
|
|
|
+ ossClient := NewOssClient()
|
|
|
+ if ossClient == nil {
|
|
|
+ utils.FileLog.Info("初始化OSS服务失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ resourceUrl, err = ossClient.UploadFile(fileName, pdfPath, "")
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
|
|
|
+ go alarm_msg.SendAlarmMsg("文件上传失败:"+err.Error(), 3)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ _ = os.Remove(pdfPath)
|
|
|
+ }()
|
|
|
+
|
|
|
+ if reportType == 3 {
|
|
|
+ // 更新pdf url
|
|
|
+ ob := new(smart_report.SmartReport)
|
|
|
+ ob.SmartReportId = reportId
|
|
|
+ ob.DetailPdfUrl = resourceUrl
|
|
|
+ if err = ob.Update([]string{"DetailPdfUrl"}); err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if reportType == 2 {
|
|
|
+ err = models.ModifyEnglishReportPdfUrl(reportId, resourceUrl)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if reportType == 1 {
|
|
|
+ err = models.ModifyReportPdfUrl(reportId, resourceUrl)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }()
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ err := ReportToJpeg(reportUrl, jpegPath)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
|
|
|
+ }
|
|
|
+ file, err := os.Open(jpegPath)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("open file failed: , error: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ ext := path.Ext(file.Name())
|
|
|
+
|
|
|
+ randStr := utils.GetRandStringNoSpecialChar(28)
|
|
|
+ fileName := randStr + ext
|
|
|
+ defer file.Close() //关闭上传文件
|
|
|
+
|
|
|
+ resourceUrl := ``
|
|
|
+ ossClient := NewOssClient()
|
|
|
+ if ossClient == nil {
|
|
|
+ utils.FileLog.Info("初始化OSS服务失败")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ resourceUrl, err = ossClient.UploadFile(fileName, jpegPath, "")
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("文件上传失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ _ = os.Remove(jpegPath)
|
|
|
+ }()
|
|
|
+
|
|
|
+ if reportType == 3 {
|
|
|
+ // 更新jpeg url
|
|
|
+ ob := new(smart_report.SmartReport)
|
|
|
+ ob.SmartReportId = reportId
|
|
|
+ ob.DetailImgUrl = resourceUrl
|
|
|
+ if err = ob.Update([]string{"DetailImgUrl"}); err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if reportType == 2 {
|
|
|
+ err = models.ModifyEnglishReportImgUrl(reportId, resourceUrl)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if reportType == 1 {
|
|
|
+ err = models.ModifyReportImgUrl(reportId, resourceUrl)
|
|
|
+ if err != nil {
|
|
|
+ utils.FileLog.Info("更新研报失败, Err: \n" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }()
|
|
|
+}
|