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
<!-- 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>核心代码
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×tamp=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();
}
}
}