Apache Pdfbox:向pdf文件中写入图片

当前版本:jdk1.8,apache pdfbox 2.0.6

1. 声明

当前内容主要为探讨,在pdf中直接插入图片,并实现如下功能

  1. 若图片大小大于纸张大小则对图片进行缩放,适应纸张大小,居中显示
  2. 若图片小于纸张大小则不对图片进行任何处理,正常居中显示

具体实现效果如下(第一个是小图片,第二个是大图片):
在这里插入图片描述

在这里插入图片描述

2. 具体实现demo

Image2PdfConverter 只是一个接口而已

package com.hy.test.image2pdf.convert.impl;

import java.io.File;
import java.util.List;
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.PDImageXObject;
import com.hy.test.image2pdf.convert.Image2PdfConverter;

/**
 * 
 * @author hy
 * @createTime 2023-04-30 07:06:25
 * @description 简单的使用poi方式生成一个pdf
 * 	使用图片来生成一个pdf文件
 *
 */
public class Image2PdfConverterImpl implements Image2PdfConverter {

	@Override
	public boolean gen(List<File> imageFiles, File pdfFile) {
		try {
			PDDocument document = new PDDocument();
			for (int i = 0; i < imageFiles.size(); i++) {
				File imageFile = imageFiles.get(i);
				PDPage page = new PDPage();
				PDRectangle bBox = page.getBBox();
				float pageWidth = bBox.getWidth();
				float pageHeight = bBox.getHeight();
				document.getPages().add(page);
				PDImageXObject pdImage = PDImageXObject.createFromFile(imageFile.getAbsolutePath(),document);
				PDPageContentStream contents = new PDPageContentStream(document, page);
				// 开始计算并获取实际纸张的宽高,开始计算输出的图片的宽高,默认图片就是填充整个pdf里面的
				PdfImagePos pdfImagePos = calculateImagePos(pdImage,(int)pageWidth,(int)pageHeight);
				contents.drawImage(pdImage, pdfImagePos.startWidthOffset, pdfImagePos.startHeightOffset ,pdfImagePos.realPdfImgWidth ,pdfImagePos.realPdfImgHeight);
				contents.close();
			}
			
			document.save(pdfFile);
			document.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		
	}
	
	class PdfImagePos {
		private int realPdfImgWidth;
		private int realPdfImgHeight;
		private int startWidthOffset;
		private int startHeightOffset;
		
	}
	
	// 计算实际的宽高
	private PdfImagePos calculateImagePos(PDImageXObject pdImage,int pageFormatWidth,int pageFormatHeight) {
		int imageWidth = pdImage.getWidth();
        int imageHeight = pdImage.getHeight();
        int realWidth = imageWidth;
        int realHeight = imageHeight; 
        if (imageWidth > pageFormatWidth) {
        	realHeight = (int)((float)imageHeight * ((float)pageFormatWidth / (float)imageWidth));
            realWidth = pageFormatWidth;
        }
        if (realHeight > pageFormatHeight) {
        	realWidth = (int)((float)realWidth * ((float)pageFormatHeight / (float)realHeight));
        	realHeight = pageFormatHeight;
        }
        
        int startWidthOffset = (pageFormatWidth - realWidth) / 2;
        int startHeightOffset = (pageFormatHeight - realHeight) / 2;

        PdfImagePos pdfImagePos = new PdfImagePos();
        pdfImagePos.startHeightOffset = startHeightOffset;
        pdfImagePos.startWidthOffset = startWidthOffset;
        if(realWidth == imageWidth && realHeight == imageHeight) {
        	pdfImagePos.realPdfImgHeight = realHeight  ;
            pdfImagePos.realPdfImgWidth = realWidth ;
   		}else {
   			pdfImagePos.realPdfImgHeight = realHeight  + startHeightOffset;
   	        pdfImagePos.realPdfImgWidth = realWidth + startWidthOffset;
   		}
        
        return pdfImagePos;
	}

}

3. 测试

package com.hy.test.image2pdf;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.hy.test.image2pdf.convert.Image2PdfConverter;
import com.hy.test.image2pdf.convert.impl.Image2PdfConverterImpl;

public class Test {
	public static void main(String[] args) {
		Image2PdfConverter converter = new Image2PdfConverterImpl();
		File pdfFile = new File("C:\\Users\\admin\\Desktop\\image2Pdf.pdf"); 
		List<File> imageFiles = Arrays.asList(new File("C:\\Users\\admin\\Desktop\\03.png"),
				new File("C:\\Users\\admin\\Desktop\\04.png"));
		
		boolean gen = converter.gen(imageFiles, pdfFile);
		System.out.println("生成pdf文件结果为:"+(gen?"true":"false"));
	}
}

测试结果成功!

4. 总结

1. 使用Apache-pdfbox向pdf中添加图片需要使用PDPageContentStream和PDPage两个类来完成

2. 注意需要在save完成后才可以close文档,不然会报错的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值