目录
一、场景
二、案例结果
三、环境准备
四、引入的第三方jar包坐标
五、思路
六、单元测试代码
七、总结
一、场景
现有一个PDF文件、需向PDF中插入图片
二、案例结果
三、环境准备
1、 maven3.8.6、jdk17
2、PDF文件和一张图片
四、引入的第三方jar包坐标
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
五、思路
1、得到PDF文件流对象【可以时从文件中读取、也可以是由其他方式得到】。
2、转为Document对象。
3、再由Document得到Page对象。
4、由Document对象和Page创建pageStream。
5、由Document对象和图片路径创建image对象。
6、由pageStream绘制image的位置及大小。
7、将Document保存到输出路径。
注意:1、流一般先开后关。2、a流依赖b流。先关a再关b。
六、单元测试代码
public static String PATH ="C:\\Users\\HP\\Desktop\\invoice\\temp\\input.pdf";
public static String PNG_PATH="C:\\Users\\HP\\Desktop\\invoice\\temp\\input.png";
public static String OUT_PATH="C:\\Users\\HP\\Desktop\\invoice\\temp\\output.pdf";
@Test
public void modifyPdf() throws IOException {
// 1、获得PDF文件流对象
FileInputStream pdfInputStream = new FileInputStream(PATH);
// 2、得到PDF文档对象
PDDocument pdDocument = PDDocument.load(pdfInputStream);
// 3、由Document得到Page对象
PDPage page = pdDocument.getPage(0);
// 4、通过图片路径和PDF文档对象得到图片image对象
PDImageXObject image = PDImageXObject.createFromFile(PNG_PATH, pdDocument);
// 5、创建pageStream对象
PDPageContentStream pageStream = new PDPageContentStream(pdDocument, page,PDPageContentStream.AppendMode.APPEND,false,false);
/**
* 可优化位置
*/
// 6、pageStream对象绘制图片位置及大小,已PDF文件右下角为原点(x,y)是图片左下角左边,width、height是图片的长和宽
pageStream.drawImage(image, 450, 700,50,50);
pageStream.close();
// 7、保存PDF到指定路劲
pdDocument.save(OUT_PATH);
// 8、关闭流
pdDocument.close();
pdfInputStream.close();
}
缺点:1、图片区域的内容将会被覆盖。
七、总结
1、 若是在真实项目中是取不到绝对路径的、通常用的以上下文路径拼接,以下是获取项目上下文路径的一种方式。
public static String CONTENT_PATH=null;
static {
try {
CONTENT_PATH = ResourceUtils.getURL("").getPath();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
2、真实场景中、需要浏览器端拿到响应结果并下载PDF、所以会将修改后的PDF作为httpServletResponse的OutputStream返回给浏览器。可以直接加载修改后的PDF文件得到FileInputStream对象,copy给OutputStream。
FileInputStream inputStream = new FileInputStream(OUT_PATH);
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream,outputStream);
3、若是下载、需要将下载的文件名、类型、字符集等也相应给浏览器。
String substring = PATH.substring(PATH.length() - 4);
System.err.println(substring);
String filename ="output"+substring;
ServletContext servletContext = request.getServletContext();
String mimeType = servletContext.getMimeType(PATH);
response.setContentType(mimeType);
response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename, StandardCharsets.UTF_8));
也可以暂时将inputStream对象先转为byte[] bytes,由其他业务模块处理该bytes后、再具体响应给浏览器。
4、若创建了temp.pdf、temp.png临时接收PDF和图片、为避免占用内存或者缓存问题、方法调用后应将temp.pdf、temp.png删除。文章来源:https://www.toymoban.com/news/detail-464100.html
.文章来源地址https://www.toymoban.com/news/detail-464100.html
// 删除生成的临时文件temp.pdf、temp.png
File pdfFile = new File(CONTEXT_PATH + "temp.pdf");
File pngFile = new File(CONTEXT_PATH + "temp.png");
if(pdfFile.exists()){
pdfFile.delete();
}
if(pngFile.exists()){
pngFile.delete();
}
到了这里,关于java实现向PDF中插入图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!