Java使用itextpdf往pdf中插入图片

  • 引入maven依赖

    xml 复制代码
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.9</version>
    </dependency>
  • java代码

    java 复制代码
    import cn.hutool.extra.qrcode.QrCodeUtil;
    import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.*;
    import org.apache.commons.io.IOUtils;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public static void main(String[] args) {
        //本地测试时,用于存放测试文件的目录
        Path dir = Paths.get("excel");
        // 源pdf文件
        Path pdf = dir.resolve("out.pdf");
        // 最终生成的pdf文件
        Path simple = dir.resolve("simple.pdf");
        try (InputStream is = new BufferedInputStream(Files.newInputStream(pdf));
             ByteArrayOutputStream bos = new ByteArrayOutputStream()){
    
            // 创建PdfReader对象以读取现有的PDF文档
            PdfReader reader = new PdfReader(IOUtils.toByteArray(is));
    
            // 创建PdfStamper对象以追加到现有的PDF文档
            PdfStamper stamper = new PdfStamper(reader, Files.newOutputStream(simple));
            stamper.setFormFlattening(true);
    
            // 加载图像
           //Image image = Image.getInstance("excel/image.png");
    		//此处通过hutool生成二维码图片,也可以通过上面的方式选择本地文件
            BufferedImage generate = QrCodeUtil.
                    generate("abcdefghijklmnopqrstuvwxyz", 500, 500);
            ImageIO.write(generate, "png", bos);
            Image image = Image.getInstance(bos.toByteArray());
    
            // 获取PDF页面的PdfContentByte对象
            PdfContentByte contentByte = stamper.getOverContent(1);
            // 获取pdf文件的长宽
            Rectangle pageSize = reader.getPageSize(1);
    
            // 设置image的长宽
            image.scaleAbsolute(80, 80);
            //设置图片在pdf文件中的绝对位置,pdf左下角的点为原点(0,0)
            image.setAbsolutePosition(pageSize.getRight() - 80 ,
                    pageSize.getTop() - 80);
            image.scalePercent(15f);
            //插入图片
            contentByte.addImage(image);
    
            // 关闭PdfStamper和PdfReader对象
            stamper.flush();
            stamper.close();
            reader.close();
            generate.flush();
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
        }
    
    }
  • 如果需要在每页文件上都加上图片,只需要将上面的代码做点小的改动就行

    java 复制代码
    //获取pdf总页数
    int numberOfPages = reader.getNumberOfPages();
    	省略......
    //从第一页开始循环
    for(int i = 1; i <= numberOfPages; i++){
    	//把这两个取值的地方改一下就行
    	// 获取PDF页面的PdfContentByte对象
        PdfContentByte contentByte = stamper.getOverContent(i);
        // 获取pdf文件的长宽
        Rectangle pageSize = reader.getPageSize(i);
        
        省略......
    }

    不出意外,二维码会出现在pdf页的右上角

相关推荐
2401_8949155341 分钟前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
Java牛马5 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌5 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西6 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
mqiqe6 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情6 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
月华路8 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
liangshanbo12159 小时前
虚拟列表深度面试题整理
java·开发语言·前端
gugucoding9 小时前
59. 【Java】Spring Boot 入门:第一个 Web 应用
java·开发语言·spring boot
点我头像干啥10 小时前
004:多个PDF文件合并
开发语言·pdf·php