当前版本:jdk1.8
,apache pdfbox 2.0.6
1. 声明
当前内容主要为探讨,在pdf中直接插入图片,并实现如下功能
- 若图片大小大于纸张大小则对图片进行缩放,适应纸张大小,居中显示
- 若图片小于纸张大小则不对图片进行任何处理,正常居中显示
具体实现效果如下(第一个是小图片,第二个是大图片):
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文档,不然会报错的