ZBLOG

每行注释 @Override public void pdf(Long aiTaskOID, HttpServletResponse response) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd

/**

  • 生成AI识别数据PDF(新)

  • @param aiTaskOID AI任务OID

  • @param response HttpServletResponse对象,用于返回PDF文件流 */ @Override public void pdf(Long aiTaskOID, HttpServletResponse response) { // 定义日期格式化对象 SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd”); SimpleDateFormat dateTimeFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

    // 获取AI任务预览数据 AIToPreviewVONew vo = toPreview(aiTaskOID); AIToPreviewTaskVONew task = vo.getTask(); Map taskTimeResult = task.getTaskTimeResult(); List outcomes = vo.getOutcomes();

    try {

    1. // 加载PDF模板文件
    2. ClassPathResource resource = new ClassPathResource("ai/ainew.pdf");
    3. // 创建字节输出流数组,一个用于任务报告,其余用于异常情况报告
    4. ByteArrayOutputStream bos[] = new ByteArrayOutputStream[(CollectionUtils.isEmpty(outcomes) ? 1 : 1 + outcomes.size())];
    5. for (int i = 0; i < bos.length; i++) {
    6. bos[i] = new ByteArrayOutputStream();
    7. // 使用PdfStamper将PDF模板填充为表单,并输出到字节输出流中
    8. PdfReader reader = new PdfReader(resource.getInputStream());
    9. PdfStamper stamper = new PdfStamper(reader, bos[i]);
    10. AcroFields form = stamper.getAcroFields();
    11. // 设置字体为中文字体
    12. BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    13. form.addSubstitutionFont(bfChinese);
    14. if (i == 0) { // 第一个字节输出流用于任务报告
    15. // 填充表单字段
    16. form.setField("AINameCN", task.getTaskName() + "任务报告");
    17. form.setField("reportDate", dateFormat.format(task.getReportDate()));
    18. form.setField("businessRowNO", StringUtils.EMPTY);
    19. form.setField("realTime", StringUtils.EMPTY);
    20. form.setField("position", StringUtils.EMPTY);
    21. form.setField("Text1", "任务名称:");
    22. form.setField("taskName", task.getTaskName());
    23. form.setField("Text4", "任务时长:");
    24. form.setField("taskTime", taskTimeResult.get("hour") + "小时" + taskTimeResult.get("minute") + "分钟" + taskTimeResult.get("second") + "秒");
    25. form.setField("Text2", "开始时间:");
    26. form.setField("startTime", dateTimeFormat.format(task.getStartDateTime()));
    27. form.setField("Text5", "结束时间:");
    28. form.setField("endTime", Objects.isNull(task.getEndDateTime()) ? StringUtils.EMPTY : dateTimeFormat.format(task.getEndDateTime()));
    29. form.setField("Text3", "识别次数:");
    30. form.setField("times", task.getAiOutcomeCount().toString());
    31. form.setField("Text6", "任务长度:");
    32. form.setField("length", task.getTaskDistanceResult() + "千米");
    33. form.setField("timePoint", StringUtils.EMPTY);
    34. form.setField("longitude", StringUtils.EMPTY);
    35. form.setField("abnormalTitle", StringUtils.EMPTY);
    36. form.setField("abnormalTypes", StringUtils.EMPTY);
    37. // 如果没有异常情况,则在表单中显示“本次执行的飞行任务,经过AI智能检测,并未在飞行航线线路上检测到异常情况。此报告仅针对此次飞行任务负责。如有疑问,可通过查看历史直播视频数据进行核对审查!”
    38. if (CollectionUtils.isEmpty(outcomes)) {
    39. form.setField("noData", "本次执行的飞行任务,经过AI智能检测,并未在飞行航线线路上检测到异常情况。此报告仅针对此次飞行任务负责。如有疑问,可通过查看历史直播视频数据进行核对审查!");
    40. } else {
    41. form.setField("noData", StringUtils.EMPTY);
    42. }
    43. } else { // 其余字节输出流用于异常情况报告
    44. AIToPreviewOutcomeVONew outcome = outcomes.get(i - 1);
    45. // 填充表单字段
    46. form.setField("AINameCN", StringUtils.EMPTY);
    47. form.setField("reportDate", StringUtils.EMPTY);
    48. form.setField("businessRowNO", "识别情况(" + i + "):");
    49. // 如果没有实时图像,则不显示实时图像
    50. if (StringUtils.isBlank(outcome.getOutcomeUrl())) {
    51. form.setField("realTime", StringUtils.EMPTY);
    52. } else {
    53. int page = form.getFieldPositions("realTime").get(0).page;
    54. Rectangle signRect = form.getFieldPositions("realTime").get(0).position;
    55. float x = signRect.getLeft();
    56. float y = signRect.getBottom();
    57. Image image = Image.getInstance(outcome.getOutcomeUrl());
    58. image.scaleToFit(signRect.getWidth(), signRect.getHeight());
    59. image.setAbsolutePosition(x, y);
    60. PdfContentByte under = stamper.getOverContent(page);
    61. under.addImage(image);
    62. }
    63. // 如果没有地图图像,则不显示地图图像
    64. if (StringUtils.isBlank(outcome.getMapUrl())) {
    65. form.setField("position", StringUtils.EMPTY);
    66. } else {
    67. int page = form.getFieldPositions("position").get(0).page;
    68. Rectangle signRect = form.getFieldPositions("position").get(0).position;
    69. float x = signRect.getLeft();
    70. float y = signRect.getBottom();
    71. Image image = Image.getInstance(outcome.getMapUrl());
    72. image.scaleToFit(signRect.getWidth(), signRect.getHeight());
    73. image.setAbsolutePosition(x, y);
    74. PdfContentByte under = stamper.getOverContent(page);
    75. under.addImage(image);
    76. }
    77. // 其他字段设为空
    78. form.setField("Text1", StringUtils.EMPTY);
    79. form.setField("taskName", StringUtils.EMPTY);
    80. form.setField("Text4", StringUtils.EMPTY);
    81. form.setField("taskTime", StringUtils.EMPTY);
    82. form.setField("Text2", StringUtils.EMPTY);
    83. form.setField("startTime", StringUtils.EMPTY);
    84. form.setField("Text5", StringUtils.EMPTY);
    85. form.setField("endTime", StringUtils.EMPTY);
    86. form.setField("Text3", StringUtils.EMPTY);
    87. form.setField("times", StringUtils.EMPTY);
    88. form.setField("Text6", StringUtils.EMPTY);
    89. form.setField("length", StringUtils.EMPTY);
    90. // 填充时间点和经纬度等字段
    91. form.setField("timePoint", "时间点:" + dateTimeFormat.format(outcome.getAddDateTime()));
    92. form.setField("longitude", "经纬度:" + outcome.getLongitude() + "," + outcome.getLatitude());
    93. form.setField("abnormalTitle", "识别类型:");
    94. form.setField("abnormalTypes", outcome.getAbnormalLabel());
    95. }
    96. // 将表单设置为不可编辑
    97. stamper.setFormFlattening(true);
    98. stamper.close();
    99. }
    100. // 创建PDF文档对象
    101. Document document = new Document();
    102. // 使用PdfCopy将所有字节输出流合并成一个PDF文件,并输出到response的输出流中
    103. PdfCopy pdfCopy = new PdfCopy(document, response.getOutputStream());
    104. document.open();
    105. for (int i = 0; i < bos.length; i++) {
    106. PdfImportedPage impage = pdfCopy.getImportedPage(new PdfReader(bos[i].toByteArray()), 1);
    107. pdfCopy.addPage(impage);
    108. }
    109. document.close();
    110. // 设置HTTP响应头信息,用于告知浏览器返回的是PDF文件流,以及文件名
    111. response.setHeader("Access-Control-Allow-Origin", "*");
    112. response.setHeader("Content-disposition", "formPDF");
    113. response.setHeader("Content-type", "application/pdf;charset=utf-8");
    114. response.setHeader("Content-disposition", "attachment; filename=" + new String((System.currentTimeMillis() + "AI检测报告.pdf").getBytes("UTF-8"), "iso8859-1"));

    } catch (Exception e) { // 捕获异常,记录日志,并抛出自定义异常

    1. log.error("生成AI识别数据PDF(新)失败", e);
    2. throw new BaseException(e.getMessage(), e);

    } }

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=5052

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?