java实现向PDF中插入图片

目录

一、场景

二、案例结果

三、环境准备

四、引入的第三方jar包坐标

五、思路

六、单元测试代码

七、总结



一、场景

        现有一个PDF文件、需向PDF中插入图片

二、案例结果

三、环境准备

             1、  maven3.8.6、jdk17

             2、PDF文件和一张图片

四、引入的第三方jar包坐标

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.1</version>
        </dependency>

五、思路

                1、得到PDF文件流对象【可以时从文件中读取、也可以是由其他方式得到】。

                 2、转为Document对象。

                 3、再由Document得到Page对象。

                4、由Document对象和Page创建pageStream。

                5、由Document对象和图片路径创建image对象。

                6、由pageStream绘制image的位置及大小。

                7、将Document保存到输出路径。

注意:1、流一般先开后关。2、a流依赖b流。先关a再关b。

六、单元测试代码


    public static String PATH  ="C:\\Users\\HP\\Desktop\\invoice\\temp\\input.pdf";
    public static String PNG_PATH="C:\\Users\\HP\\Desktop\\invoice\\temp\\input.png";
    public static String OUT_PATH="C:\\Users\\HP\\Desktop\\invoice\\temp\\output.pdf";

    @Test
    public void modifyPdf() throws IOException {

 //        1、获得PDF文件流对象
        FileInputStream pdfInputStream = new FileInputStream(PATH);
//        2、得到PDF文档对象
        PDDocument  pdDocument = PDDocument.load(pdfInputStream);
//        3、由Document得到Page对象
        PDPage page = pdDocument.getPage(0);
//        4、通过图片路径和PDF文档对象得到图片image对象
        PDImageXObject image = PDImageXObject.createFromFile(PNG_PATH, pdDocument);
//        5、创建pageStream对象
        PDPageContentStream pageStream = new PDPageContentStream(pdDocument, page,PDPageContentStream.AppendMode.APPEND,false,false);

        /**
         * 可优化位置
         */
//   6、pageStream对象绘制图片位置及大小,已PDF文件右下角为原点(x,y)是图片左下角左边,width、height是图片的长和宽
        pageStream.drawImage(image, 450, 700,50,50);
        pageStream.close();
//    7、保存PDF到指定路劲
        pdDocument.save(OUT_PATH);
//      8、关闭流
        pdDocument.close();
        pdfInputStream.close();
    }

        缺点:1、图片区域的内容将会被覆盖。

七、总结

    1、 若是在真实项目中是取不到绝对路径的、通常用的以上下文路径拼接,以下是获取项目上下文路径的一种方式。

  public static String CONTENT_PATH=null;
    
    static {
        try {
            CONTENT_PATH = ResourceUtils.getURL("").getPath();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

2、真实场景中、需要浏览器端拿到响应结果并下载PDF、所以会将修改后的PDF作为httpServletResponse的OutputStream返回给浏览器。可以直接加载修改后的PDF文件得到FileInputStream对象,copy给OutputStream。

        FileInputStream inputStream = new FileInputStream(OUT_PATH);
        ServletOutputStream outputStream = response.getOutputStream();
        IOUtils.copy(inputStream,outputStream);

3、若是下载、需要将下载的文件名、类型、字符集等也相应给浏览器。

        String substring = PATH.substring(PATH.length() - 4);
        System.err.println(substring);
        String filename ="output"+substring;
        ServletContext servletContext = request.getServletContext();
        String mimeType = servletContext.getMimeType(PATH);
        response.setContentType(mimeType);
        response.setHeader("Content-Disposition","attachment;filename="+     URLEncoder.encode(filename, StandardCharsets.UTF_8));

也可以暂时将inputStream对象先转为byte[] bytes,由其他业务模块处理该bytes后、再具体响应给浏览器。

4、若创建了temp.pdf、temp.png临时接收PDF和图片、为避免占用内存或者缓存问题、方法调用后应将temp.pdf、temp.png删除。

.

//   删除生成的临时文件temp.pdf、temp.png
        File pdfFile = new File(CONTEXT_PATH + "temp.pdf");
        File pngFile = new File(CONTEXT_PATH + "temp.png");
        if(pdfFile.exists()){
            pdfFile.delete();
        }
        if(pngFile.exists()){
            pngFile.delete();

        }

  • 13
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值