• 用java实现PDF的下载


    1.下载PDF模版

    2.导入依赖

    1. <dependency>
    2. <groupId>com.itextpdf</groupId>
    3. <artifactId>itext7-core</artifactId>
    4. <version>7.2.5</version>
    5. <type>pom</type>
    6. </dependency>

    3.完整代码

    1. package com.by.controller;
    2. import com.itextpdf.forms.PdfAcroForm;
    3. import com.itextpdf.forms.fields.PdfFormField;
    4. import com.itextpdf.kernel.font.PdfFont;
    5. import com.itextpdf.kernel.font.PdfFontFactory;
    6. import com.itextpdf.kernel.geom.PageSize;
    7. import com.itextpdf.kernel.pdf.PdfDocument;
    8. import com.itextpdf.kernel.pdf.PdfReader;
    9. import com.itextpdf.kernel.pdf.PdfWriter;
    10. import org.springframework.http.HttpHeaders;
    11. import org.springframework.http.HttpStatus;
    12. import org.springframework.http.MediaType;
    13. import org.springframework.http.ResponseEntity;
    14. import org.springframework.util.ResourceUtils;
    15. import org.springframework.web.bind.annotation.GetMapping;
    16. import org.springframework.web.bind.annotation.RestController;
    17. import javax.servlet.http.HttpServletResponse;
    18. import java.io.ByteArrayOutputStream;
    19. import java.io.FileInputStream;
    20. import java.io.IOException;
    21. import java.util.HashMap;
    22. import java.util.Map;
    23. import java.util.Optional;
    24. /**
    25. * 控制器类,用于处理PDF模板填充及下载请求
    26. */
    27. @RestController
    28. public class PdfController {
    29. /**
    30. * 处理GET请求以下载填充了数据的PDF文件
    31. *
    32. * @param response HttpServletResponse对象,用于设置响应头和发送下载文件
    33. * @return 响应实体,包含填充好数据的PDF字节流
    34. * @throws IOException 如果读取或写入PDF文件时发生异常
    35. */
    36. @GetMapping("/download")
    37. public ResponseEntity<byte[]> test(HttpServletResponse response) throws IOException {
    38. // 设置响应头,指示浏览器以附件形式下载文件,并设置文件名
    39. HttpHeaders headers = new HttpHeaders();
    40. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    41. String downloadFileName = System.currentTimeMillis() + ".pdf";
    42. response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
    43. // 准备需要填充到PDF模板中的数据
    44. Map dataMap = new HashMap<>();
    45. dataMap.put("name", "张三");
    46. dataMap.put("code", "123456");
    47. // 填充数据并生成带数据的PDF字节流
    48. byte[] pdfBytes = getPdf(dataMap);
    49. // 创建并返回包含填充后PDF字节流的响应实体
    50. return new ResponseEntity<>(pdfBytes, headers, HttpStatus.CREATED);
    51. }
    52. /**
    53. * 根据提供的数据填充PDF模板并返回填充后的PDF字节流
    54. *
    55. * @param dataMap 需要填充到PDF模板中的键值对数据
    56. * @return 填充好数据的PDF文件字节数组
    57. * @throws IOException 如果读取或写入PDF文件时发生异常
    58. */
    59. private byte[] getPdf(Map dataMap) throws IOException {
    60. // 获取PDF模板文件路径
    61. String sourcePdf = ResourceUtils.getURL("classpath:").getPath() + "/templates/1.pdf";
    62. // 使用PDF阅读器加载模板文件
    63. PdfReader pdfReader = new PdfReader(new FileInputStream(sourcePdf));
    64. // 创建一个内存输出流用于存储填充好数据的PDF文件
    65. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    66. // 创建PDF文档对象,连接读取器和输出流
    67. PdfDocument pdf = new PdfDocument(pdfReader, new PdfWriter(outputStream));
    68. // 设置默认页面大小为A4
    69. pdf.setDefaultPageSize(PageSize.A4);
    70. // 获取PDF表单域对象
    71. PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
    72. Map fields = form.getFormFields();
    73. // 设置字体,这里使用的是"STSong-Light"字体
    74. PdfFont currentFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);
    75. // 遍历待填充的数据,并将其填入对应的表单域
    76. dataMap.forEach((key, value) -> {
    77. Optional formFieldOptional = Optional.ofNullable(fields.get(key));
    78. formFieldOptional.ifPresent(formField -> {
    79. // 设置字体并替换表单域的值
    80. formField.setFont(currentFont).setValue(value);
    81. });
    82. });
    83. // 锁定并合并所有表单域,使其无法再编辑
    84. form.flattenFields();
    85. // 关闭PDF文档,释放资源
    86. pdf.close();
    87. // 将填充好的PDF文件转换为字节数组并返回
    88. return outputStream.toByteArray();
    89. }
    90. }

    4.模版位置

  • 相关阅读:
    Java三大特性篇之——继承篇(超详解的好吧!)
    抖去推短视频矩阵系统----源头开发
    李沐d2l(十)--卷积层Ⅱ
    身份认证与提权攻击中的专属名词与缩略语整理
    java基础入门-15-【集合(Map&可变参数&集合工具类)】
    接口自动化测试小结
    高性能云原生数据对象存储MinIO实战-上
    参数化建模 vs. 直接建模【CAD】
    ELK下载(Elasticsearch、Logstash、Kibana)
    【大体思路】rv1126 跑通 yolov5
  • 原文地址:https://blog.csdn.net/qq_62965575/article/details/138035701