当前位置: 首页 > article >正文

Java编程技巧:将图片导出成pdf文件

目录

      • 一、pom依赖
      • 二、代码
      • 三、测试链接

一、pom依赖

<!-- pdf插件 start -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.3</version>
</dependency>
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<!-- pdf插件 end -->

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

二、代码

import cn.hutool.core.io.FileUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.SneakyThrows;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.DatatypeConverter;
import java.io.*;

@RestController
@RequestMapping("/test")
public class TestController {

    // 公文格式-页边距 start
    // 上页边距(单位:cm)
    private static final double TOP = 3.7;
    // 上页边距(单位:cm)
    private static final double BOTTOM = 3.5;
    // 上页边距(单位:cm)
    private static final double LEFT = 2.8;
    // 上页边距(单位:cm)
    private static final double RIGHT = 2.6;
    // 公文格式-页边距 end

    // 厘米转磅
    private static final double CM_2_POUND = 28.35;

    /**
     * 将base64编码图片字符串转换为pdf,然后在浏览器中下载
     * 模拟场景:从数据库中读取base64图片编码,然后进行下载
     */
    @GetMapping("/base642pdf")
    public void base642pdf(HttpServletResponse response) {
        // 准备数据
        String base64 = "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";
        String fileName = "中国城市-导图版";

        // 公文格式页边距
        float marginLeft = Math.round(LEFT * CM_2_POUND);
        float marginRight = Math.round(RIGHT * CM_2_POUND);
        float marginTop = Math.round(TOP * CM_2_POUND);
        float marginBottom = Math.round(BOTTOM * CM_2_POUND);

        Document document = null;
        OutputStream os = null;
        try {
            // 设置response属性
            os = response.getOutputStream();
            response.setContentType("application/force-download");
            try {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");

            // 设置pdf页面大小
            document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);
            document.addTitle(fileName);

            // 处理图片数据、居中
            byte[] bytes = DatatypeConverter.parseBase64Binary(base64);
            Image img = Image.getInstance(bytes);
            img.setAlignment(Image.MIDDLE);

            // 处理图片缩放比率
            float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;
            float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;
            float imgWidth = img.getWidth();
            float imgHeight = img.getHeight();
            float widthPercent = contentWidth / imgWidth * 100;
            float heightPercent = contentHeight / imgHeight * 100;
            img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);

            // 将图片放入pdf
            PdfWriter.getInstance(document, os);
            document.open();
            document.newPage();
            document.add(img);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将图片文件转换为pdf,然后在浏览器中下载
     * 模拟场景:从本地读取图片文件,然后在浏览器中下载
     */
    @SneakyThrows
    @GetMapping("/file2pdf")
    public void file2pdf(HttpServletResponse response) {
        // 准备数据
        File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");
        String fileName = "中国城市-导图版";

        // 公文格式页边距
        float marginLeft = Math.round(LEFT * CM_2_POUND);
        float marginRight = Math.round(RIGHT * CM_2_POUND);
        float marginTop = Math.round(TOP * CM_2_POUND);
        float marginBottom = Math.round(BOTTOM * CM_2_POUND);

        Document document = null;
        OutputStream os = null;
        try {
            // 设置response属性
            os = response.getOutputStream();
            response.setContentType("application/force-download");
            try {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");

            // 设置pdf页面大小
            document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);
            document.addTitle(fileName);

            // 将图片输入流转换成字节数组
            byte[] bytes = FileUtil.readBytes(file);

            // 处理图片数据、居中
            Image img = Image.getInstance(bytes);
            img.setAlignment(Image.MIDDLE);

            // 处理图片缩放比率
            float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;
            float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;
            float imgWidth = img.getWidth();
            float imgHeight = img.getHeight();
            float widthPercent = contentWidth / imgWidth * 100;
            float heightPercent = contentHeight / imgHeight * 100;
            img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);

            // 将图片放入pdf
            PdfWriter.getInstance(document, os);
            document.open();
            document.newPage();
            document.add(img);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将图片输入流转换为pdf,然后在浏览器中下载
     * 模拟场景:从任何位置读取出图片输入流,然后在浏览器中下载
     */
    @GetMapping("/stream2pdf")
    public void stream2pdf(HttpServletResponse response) throws FileNotFoundException {
        // 准备数据
        File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");
        String fileName = "中国城市-导图版";

        // 公文格式页边距
        float marginLeft = Math.round(LEFT * CM_2_POUND);
        float marginRight = Math.round(RIGHT * CM_2_POUND);
        float marginTop = Math.round(TOP * CM_2_POUND);
        float marginBottom = Math.round(BOTTOM * CM_2_POUND);

        Document document = null;
        OutputStream os = null;
        try (
                InputStream inputStream = new FileInputStream(file)
        ) {
            // 设置response属性
            os = response.getOutputStream();
            response.setContentType("application/force-download");
            try {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");

            // 设置pdf页面大小
            document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);
            document.addTitle(fileName);

            // 将图片输入流转换成字节数组
            byte[] bytes = toByteArray(inputStream);

            // 处理图片数据、居中
            Image img = Image.getInstance(bytes);
            img.setAlignment(Image.MIDDLE);

            // 处理图片缩放比率
            float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;
            float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;
            float imgWidth = img.getWidth();
            float imgHeight = img.getHeight();
            float widthPercent = contentWidth / imgWidth * 100;
            float heightPercent = contentHeight / imgHeight * 100;
            img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);

            // 将图片放入pdf
            PdfWriter.getInstance(document, os);
            document.open();
            document.newPage();
            document.add(img);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将图片文件转换为pdf,然后在本地下载
     * 模拟场景:将图片文件或者图片流存储在本地
     */
    @GetMapping("/img2LocalPdf")
    public String img2LocalPdf() throws FileNotFoundException {
        // 准备数据;注意:切换成你自己本地的图片
        File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");
        String fileName = "中国城市-导图版";

        // 公文格式页边距
        float marginLeft = Math.round(LEFT * CM_2_POUND);
        float marginRight = Math.round(RIGHT * CM_2_POUND);
        float marginTop = Math.round(TOP * CM_2_POUND);
        float marginBottom = Math.round(BOTTOM * CM_2_POUND);

        // 创建临时文件
        File pdf = FileUtil.createTempFile(".pdf", true);
        Document document = null;
        OutputStream os = null;
        try (
                InputStream inputStream = new FileInputStream(file)
        ) {
            // 设置response属性
            os = new FileOutputStream(pdf);

            // 设置pdf页面大小
            document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);
            document.addTitle(fileName);

            // 将图片输入流转换成字节数组
            byte[] bytes = toByteArray(inputStream);

            // 处理图片数据、居中
            Image img = Image.getInstance(bytes);
            img.setAlignment(Image.MIDDLE);

            // 处理图片缩放比率
            float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;
            float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;
            float imgWidth = img.getWidth();
            float imgHeight = img.getHeight();
            float widthPercent = contentWidth / imgWidth * 100;
            float heightPercent = contentHeight / imgHeight * 100;
            img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);

            // 将图片放入pdf
            PdfWriter.getInstance(document, os);
            document.open();
            document.newPage();
            document.add(img);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null) {
                document.close();
            }
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return pdf.getAbsolutePath();
    }

    // 将输入流转换成字节数组
    private static byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024 * 4];
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
    }
}

三、测试链接

测试下载链接:
1、将base64编码图片字符串转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/base642pdf

2、将图片文件转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/file2pdf

3、将图片输入流转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/stream2pdf

4、将图片文件转换为pdf,然后在本地下载
链接:http://127.0.0.1:8080/test/img2LocalPdf

http://www.kler.cn/a/133441.html

相关文章:

  • vue2使用 <component> 标签动态渲染不同的表单组件
  • flinkOnYarn并配置prometheus+grafana监控告警
  • 嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
  • 【Excel】ToRow超级查找函数
  • 分布式锁实践方案
  • 执行flink sql连接clickhouse库
  • Linux | 信号
  • 【done】剑指offer68:二叉树最近公共祖先
  • IDEA远程一键部署SpringBoot到Docker
  • OpenAI GPT5计划泄露
  • 解析:什么是生成式AI?与其他类型的AI有何不同?
  • hyperledger fabric2.4测试网络添加组织数量
  • PL/SQL编程
  • QT多线程项目中子线程无法修改主线程的ui组件
  • Windows 下 Sublime Text 3.2.2 下载及配置
  • Object常用方法——toString()
  • Linux - 进一步理解 文件系统 - inode - 机械硬盘
  • C语言程序设计(入门)
  • py 字符串转INT
  • PS 颜色取样器标尺工具 基本使用讲解
  • Linux中的进程终止(详解)
  • Pandas数据操作_Python数据分析与可视化
  • Python学习(一)基础语法
  • 11. Spring源码篇之实例化前的后置处理器
  • ElasticSearch综合练习题,ES为8版本,使用Kibana运行语句
  • SQL Server中substring的用法