TECH NOTES / Java 与 Spring

PDFBox 向 PDF 中填充图片

原笔记 2021-11-26 · 整理于 2026-10-05

使用 PDFBox 2.x 将图片放入 PDF,整理坐标、图片对象与文件写出示例。

版本说明:本文沿用 PDFBox 2.x 的 API。PDFBox 3.x 的文档加载方式有变化,升级时请对照官方迁移指南。

pom.xml

xml
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.24</version>
</dependency>

<!--commons-io-->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

核心代码

java
package com.example.pdfdemo.main;

import ch.qos.logback.core.util.ContentTypeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 向 PDF 中 填充图片
 *
 * @author leiguoqing
 * @date 2021-11-26 9:11
 */
@Slf4j
public class PdfDemo {


    public static void main(String[] args) {
        File file = new File("D:\\2021年亿客临scrm服务合同协议$20211124.pdf");
        try {
            // 加载现有PDF文档
            PDDocument doc = PDDocument.load(file);

            // 检索页面
            PDPage page = doc.getPage(7);

            // 创建PDImageXObject对象

            final URL url = new URL("https://testapi.fadada.com:8443/api/get_file.api?uuid=63877c1cc042474aa34964be7971c6b0&app_id=405267&timestamp=20211126104727&v=2.0&msg_digest=OTlERDNEOUFGQjExNDQzQkI0NDgzRjVCNTE2NkI4MkE3NzgxRkY1NQ==");
            final InputStream inputStream = url.openStream();

            final HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            urlConnection.connect();

            final BufferedInputStream bis = new BufferedInputStream(urlConnection.getInputStream());

            final String contentType = HttpURLConnection.guessContentTypeFromStream(bis);


            final String fileSuffix = ContentTypeUtil.getSubType(contentType);

            // 将文件重命名(唯一)后存储到临时目录
            String newFileName = System.currentTimeMillis() + "." + fileSuffix;

            // 临时营业执照文件存放目录地址
            String businessLicenseTempDirPath = FileUtils.getTempDirectoryPath() + File.separator + "BusinessLicense" + File.separator;

            // 临时营业执照文件
            File businessLicenseFileTemp = new File(businessLicenseTempDirPath + newFileName);

            FileUtils.copyInputStreamToFile(inputStream, businessLicenseFileTemp);

            PDImageXObject pdImage = PDImageXObject.createFromFileByExtension(businessLicenseFileTemp, doc);

            // 准备内容流
            PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true);

            // 在PDF文档中绘制图像
            contentStream.drawImage(pdImage, 100, 100, 400, 600);

            // 关闭PDPageContentStream
            contentStream.close();

            // 保存文档
            doc.save("D:\\new_pdf.pdf");

            // 关闭文档
            doc.close();

            // 删除临时文件
            FileUtils.deleteQuietly(businessLicenseFileTemp);
        } catch (IOException e) {
            log.error("error", e);
            e.printStackTrace();
        }
    }

}

参考

文章配图