nodejs - puppeteer 无头浏览器截图 JAVA后端调用

nodejs - puppeteer 无头浏览器截图 iframe-CSDN博客

nodejs - puppeteer 无头浏览器截图 - 常规例子-CSDN博客

接上面两个,java后端调用代码

复制代码
public File archiveInterfaceMethod(String url) {
        log.info("jsLocal:{}", jsLocal);
        log.info("fileLocal:{}", fileLocal);
        log.info("redirectlogin:{}", redirectlogin);


        // 从URL中提取 applicationNo 参数
        String applicationNo = extractApplicationNo(url);

        ProcessInstanceDTO proIns = processInstanceMapper.selectByApplicantNo(applicationNo);
        //归档次数,用来做网页截图等待时间用
        Integer archivesCount = 0;
        if (proIns.getArchivesCount() != null) {
            archivesCount = proIns.getArchivesCount();
        }
        log.info("流程归档,Extracted applicationNo: {}", applicationNo);
        // 对URL进行转义处理
        url = url + "&" + redirectlogin;//escapeUrl(url + "&" + redirectlogin);
        log.info("流程归档,URL after escape: {}", url);
        String[] command = {
                "node", jsLocal, "--url", url, "--applicationNo", applicationNo, "--archivesCount", archivesCount.toString()
        };
        log.info("开始执行命令: {}", String.join(" ", command));
        // 确保fileLocal变量正确指向预期的目录
        File directory = new File(fileLocal);
        if (!directory.exists()) {
            // 如果目录不存在,尝试创建它
            if (!directory.mkdirs()) {
                Log.error("无法创建目录: {}", directory);
                return null;
            }
        }
        log.info("获取文件路径: {}", directory.getAbsolutePath());

        // 构建最终生成文件的路径
        File generatedFile = new File(directory, applicationNo + ".png");

        //改成可重复归档
        //if (generatedFile.exists()) {
        //    try {
        //        return processGeneratedFile(generatedFile, applicationNo);
        //   } catch (IOException e) {
        //       log.error("处理生成的文件时发生异常:{}", e.getMessage(), e);
        //        updateInsStatus(applicationNo, 2);
        //        return null;
        //    }
        // }
        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.directory(directory);
        // 将错误输出重定向到标准输出流
        processBuilder.redirectErrorStream(true);

        // 如果文件不存在,则执行命令生成文件
        Process process = null;
        try {
            process = processBuilder.start();  // 使用ProcessBuilder启动进程
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    // 这将包括标准输出和错误输出
                    log.info("进程输出: {}", line);
                }
            }
            int exitCode = process.waitFor();
            log.info("进程退出码: " + exitCode);

            if (exitCode == 0) {
                return processGeneratedFile(generatedFile, applicationNo);
            } else {
                log.warn("进程失败,退出码: " + exitCode);
             
            }
        } catch (IOException | InterruptedException e) {
            log.error("执行进程时发生异常", e);
          
            // 处理中断
            Thread.currentThread().interrupt();
        }
        return generatedFile;
    }
相关推荐
卷无止境1 小时前
智能体开发环境ADE浅析,编程工具的下一次范式跃迁
后端·python
IT_Octopus3 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
长征coder4 小时前
【无标题】
java·性能优化
CharlesYu015 小时前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端
新时代牛马5 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
2601_962300815 小时前
机器学习贴士:使用Python编写MapReduce
hadoop·python·机器学习·mapreduce·数据处理
Bs_MoneyMagnet5 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
平头哥技术团队5 小时前
Day 21 _ 页内锚点_给每段起个 id,目录写 href=_#id_,点一下页面就滚到那一段
前端·html·html5
xyz_CDragon5 小时前
GitHub上4个爆款AI开源Skill:拍照后不用P图,用Codex一键生成高级海报(附效果图+使用教程)
人工智能·python·github·codex·skill
weixin199701080166 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas