Java实现图片保存到pdf的某个位置2

Java实现图片保存到pdf的某个位置2

1、依赖--maven
xml 复制代码
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
        </dependency>
2、上代码
java 复制代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import javax.imageio.ImageIO;
import java.awt.geom.Point2D;
import java.io.File;
import java.io.IOException;

public class PdfBoxInsertImageExample {
    // 主函数,用于展示如何调用insertImageIntoPdf方法
    public static void main(String[] args) {
        try {
            File originalPdf = new File("path/to/original.pdf"); // 原始PDF文件路径
            File tempPdf = new File("path/to/temp.pdf"); // 临时保存修改后PDF的路径
            insertImageIntoPdf(originalPdf, tempPdf, 0, new Point2D.Float(100, 100), "path/to/image.jpg", null, null);
        } catch (IOException e) {
            e.printStackTrace(); // 打印异常信息,方便调试
        }
    }

    // 实现将图片插入PDF页面的方法
    public static void insertImageIntoPdf(File sourcePdf, File targetPdf, int pageIndex,
                                         Point2D.Float position, String imagePath,
                                         Float desiredWidth, Float desiredHeight) throws IOException {
        try (PDDocument document = PDDocument.load(sourcePdf)) { // 加载原始PDF文档
            // 获取指定索引的页面,pageIndex从0开始计数
            PDPage page = document.getPage(pageIndex);

            // 从imagePath路径读取图片并转换为PDF支持的图像对象
            PDImageXObject image = LosslessFactory.createFromImage(document, ImageIO.read(new File(imagePath)));

            // 获取图片原始尺寸
            float originalWidth = image.getWidth();
            float originalHeight = image.getHeight();

            // 计算图片的新尺寸,如果指定了desiredWidth或desiredHeight则进行调整,同时保持原始比例
            float scaleX = (desiredWidth != null) ? desiredWidth / originalWidth : 1f;
            float scaleY = (desiredHeight != null) ? desiredHeight / originalHeight : 1f;

            // 如果只设置了宽度或高度,则自动调整另一个维度以保持比例
            if (desiredWidth == null && desiredHeight != null) {
                scaleX = scaleY;
            } else if (desiredWidth != null && desiredHeight == null) {
                scaleY = scaleX;
            }

            // 计算调整后的宽度和高度
            float newWidth = originalWidth * scaleX;
            float newHeight = originalHeight * scaleY;

            // 创建内容流,用于在页面上绘制图像
            try (PDPageContentStream contentStream = new PDPageContentStream(document, page, 
                                                                            PDPageContentStream.AppendMode.APPEND, true)) {
                // 在指定位置绘制调整大小后的图片
                contentStream.drawImage(image, position.x, position.y, newWidth, newHeight);
            }

            // 保存所有修改到目标PDF文件
            document.save(targetPdf);
        }
    }
}
相关推荐
Sunhen_Qiletian几秒前
朝花夕拾(五)--------Python 中函数、库及接口的详解
开发语言·python
柳贯一(逆流河版)33 分钟前
Spring 三级缓存:破解循环依赖的底层密码
java·spring·缓存·bean的循环依赖
三年呀33 分钟前
标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
网络·python·安全
阿幸软件杂货间1 小时前
免费万能电子书格式转换器!Neat Converter支持 ePub、Azw3、Mobi、Doc、PDF、TXT 文件的相互转换。
pdf·格式转换
关山2 小时前
MCP实战
python·ai编程·mcp
悠哉悠哉愿意2 小时前
【Python语法基础学习笔记】if语句
笔记·python·学习
Q_Q19632884752 小时前
python的电影院座位管理可视化数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
该用户已不存在2 小时前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
BYSJMG2 小时前
计算机大数据毕业设计推荐:基于Hadoop+Spark的食物口味差异分析可视化系统【源码+文档+调试】
大数据·hadoop·分布式·python·spark·django·课程设计
杜子不疼.3 小时前
《Python学习之第三方库:开启无限可能》
开发语言·python·学习