Java使用itextpdf往pdf中插入图片

本文介绍了如何在Java中利用iTextPDF库将二维码嵌入PDF文档,包括读取PDF、创建PdfStamper对象、添加二维码图片以及处理页面循环。
摘要由CSDN通过智能技术生成
  • 引入maven依赖

    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.9</version>
    </dependency>
    
  • 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();
        }
    
    }
    
    
  • 如果需要在每页文件上都加上图片,只需要将上面的代码做点小的改动就行

    //获取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页的右上角
    在这里插入图片描述

可以使用 iText 库来实现 Java PDF 文件插入图片的功能。以下是一个简单的示例代码,其使用iText 库的 PdfWriter 和 Image 类: ```java import com.itextpdf.text.Document; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; public class InsertImageToPDF { public static void main(String[] args) { // 原始 PDF 文件 String inputPdfPath = "input.pdf"; // 输出 PDF 文件 String outputPdfPath = "output.pdf"; // 图片路径 String imagePath = "image.jpg"; try { // 创建新的 PDF 文档 Document document = new Document(); // 创建 PdfWriter PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPdfPath)); // 打开文档 document.open(); // 获取原始 PDF 文件的页数 int numberOfPages = writer.getImportedPage(new PdfReader(inputPdfPath), 1).getPdfObject().getAsArray(PdfName.ANNOTS).size(); // 插入图片到每一页 for (int i = 1; i <= numberOfPages; i++) { // 读取图片 Image image = Image.getInstance(imagePath); // 获取原始 PDF 文件的一页 PdfImportedPage page = writer.getImportedPage(new PdfReader(inputPdfPath), i); // 将图片添加到 PDF 页面 image.setAbsolutePosition(0, 0); PdfContentByte content = writer.getDirectContent(); content.addTemplate(image, page.getBoundingBox().getLeft(), page.getBoundingBox().getBottom()); // 添加新的 PDF 页面 document.newPage(); } // 关闭文档 document.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 以上代码将图片插入到了原始 PDF 文件的每一页,并将生成的新 PDF 文件保存到了 output.pdf 文件。需要注意的是,图片的大小应该与 PDF 页面的大小相同,否则可能会出现图片被截断或无法完全显示的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值